Arduino – Własny internetowy termometr za pomocą Xively

Arduino – Własny internetowy termometr za pomocą Xively

Zapewne widzieliście już poradnik Jakuba Furmana o własnym internetowym termometrze. Do jego wykonania potrzebowaliśmy jednak mieć nieco wiedzy o bazach danych, cron tabie i tym podobnych. Dla przeciętnego człowieka – nie geeka, było to dość ciężkie do zrozumienia i zastosowania. Na szczęście można to zrobić to łatwiej za pomocą strony Xively.com (dawny Pachube). Umożliwia ona wstawianie pewnych wartości, a następnie za pomocą żądania HTTP odczytanie ich.

Zastosowanie Xively ma pewne zalety np.:

– odczyty będzie można zobaczyć z każdego miejsca, nie dotyczy nas wtedy ograniczenie przez niepubliczny adres IP i zakładanie serwera w sieci lokalnej,

– umożliwia automatyczne tworzenie prawie dowolnie konfigurowalnych wykresów,

– jest bardzo prosty w obsłudze.

 

Koniec opowiadania, zabierzmy się do pracy.

Potrzebne elementy:

– Arduino,

– Ethernet Shield,

– cyfrowy czujnik temperatury, w tym przypadku DS18B20,

– rezystor 4,7 KΩ

– płytka stykowa + kabelki.

 

Schemat podłączenia, choć prosty, dla formalności podaje obrazek z Fritzinga. Należy pamiętać, że rezystor umieszczony poniżej powinien mieć wartość 4,7 KΩ.

 

schemat2

 

Powinniśmy także założyć konto na stronie Xively.com i stworzyć projekt:

tworzenie

 

Po założeniu należy znaleźć odpowiednie numery, kody i nazwy:

tworzenie2

 

Teraz możemy przejść do pisania programu. Jako podstawę użyłem ćwiczenie z podstawowej biblioteki Ethernet Shield – Pachube Client.

 

Jako, że niestety przy tej bibliotece i czujniku pierwszy odczyt jest zazwyczaj niepoprawny, w moim przypadku to 85 st. C lub -127 st.C, w tym miejscu:

możemy dodać kolejny warunek i w przypadku odczytu np. wartości wyższej niż 35 st. C żądać ponownego odczytania temperatury.

 

Po uzupełnieniu wedle uznania kodu, możemy wgrać go na Arduino, a jeżeli wszystko poprawnie podłączyłeś i wpisałeś, powinna się pojawić taka odpowiedź w monitorze portu COM:

Możemy teraz na stronie projektu podglądać temperaturę. Ale co jeżeli chcemy ją wyświetlić na własnej stronie? Z pomocą przychodzi nam PHP i żądanie HTTP metodą GET. Przedstawię tu jak przedstawić odebrane wartości.

Najpierw szukamy na stronie projektu czegoś takiego jak API Endpoint i kopiujemy go.

Następnie tworzymy plik *.php. Uwaga: Aby móc wyświetlić stronę php, nie wystarcza zwykła przeglądarka jak w przypadku html, ale serwer. Można zrobić sobie domowy w programie Xammp lub wykupić jakiś tani hosting.

Do pliku wpisujemy to:

 

Jak widać w tym przypadku żądanie wykonałem za pomocą file_get_contents, a odkodowanie za pomocą json_decode, oczywiście metod jest mnóstwo, ja przedstawiłem jedną z łatwiejszych.

Dodatkowo, jak na wstępie wspomniałem, Xively daje nam do dyspozycji generowanie wykresów jak to zrobić? Z pomocą przychodzi tutaj strona z dokumentacji: https://xively.com/dev/docs/api/data/read/single_datastream/.

Wykres zwyczajnie wklejamy za pomocą <img src=”url”>.

Efekt można zobaczyć na mojej stronie: serwer.xaa.pl/temp.php graf jest nieco dziwny, gdyż dawno akurat w tym projekcie nie wysyłałem danych.

Dziękuję za uwagę i mam nadzieję, że dzięki temu poradnikowi uda Wam się stworzyć własny, internetowy termometr. W razie pytań proszę pisać je w komentarzach, postaram się odpowiedzieć na każde z nich.

Ocena: 3.95/5 (głosów: 59)

Podobne posty

13 komentarzy do “Arduino – Własny internetowy termometr za pomocą Xively

  • Dobry projekt. Do wizualizacji danych wystarczy przeglądarka. Dane pobrać AJAXem i sformatować w JavaScript. Wykresy rysować w Canvas HTML5.

    Odpowiedz
  • Czy koniecznie musi być rezystor 4.7KΩ? Gdzieś czytałem, że może być w przedziale od 4.7-10KΩ, i sam mam do DS18B20 podpięte 10KΩ i działa dobrze.

    Odpowiedz
  • Ja zrobiłem taki projekt z użyciem Node na Linuxie i po stronie serwera. Napisałem taki prosty analizator z użyciem biblioteki SerialPort

    [code]

    var serialport = require(“serialport”);

    var SerialPort = serialport.SerialPort;

    http = require(“http”);

    var port = new SerialPort(“/dev/ttyUSB0”, {

    baudrate: 9600,

    parser : serialport.parsers.readline (“n”)

    });

    port.on (“data”, function (d) {var odpowiedz = “Odpowiedz z serwera z res.send: “;

    http.get(“http://*.pl/?temperatura=”+d, function(res){

    console.log (“n Temperatura odczytana z Arduino: “+d);

    console.log(“Kod odpowiedzi serwera: “+res.statusCode);

    res.on (“data”, function(kawalek){odpowiedz += kawalek;});

    res.on (“end”, function(){console.log(odpowiedz);});

    });

    });

    [/code]

    Ścieżka będąca pierwszym elementem konstruktora zostaje wcześniej odczytana z komunikatu bufora warstwy jądra z polecenia dmesg.

    Po stronie serwera użyłem Nodowego Expressa i napisałem taką trasę:

    [code]

    app.get(‘/’, function(req, res) {

    if (req.url == “/” && t===undefined) {

    res.render (“brakdanych”);

    }

    else if (req.url == “/” && (t || t==0)) {

    res.render(“termometr”,{temperatura : t});

    }

    else {

    t = req.query.temperatura;

    res.send (“Hej klient-parser, to ja serwer, wysylam ci odpowiedz: “+t);

    }

    });

    [/code]
    (to jest kluczowa część skryptu)
    Jak widać w trasie wykorzystywane są dwa pliki Jade , brakdanych oraz termometr.

    Termometr w Jade wygląda następująco:

    [code]

    doctype html

    html

    head

    title Wizualizacja

    script(src=”javascripts/termometrCanvas.js”)

    link(rel=”stylesheet”, href=”stylesheets/styl.css”)

    body

    canvas#plotno

    p#nie #{temperatura}

    [/code]

    i po wyrenderowaniu strony uruchamia napisany przezemnie z użyciem Canvas API kod w JavaScripcie wizualizujący dane w postaci termometru.
    Paragrafu p o identyfikatorze #nie(wyswietlaj) uzyłem do przekaźnika temperatury t z server.js do pliku w JavaScripcie, nie miałem lepszej koncepcji jak to zrobić.
    Przepraszam jeśli coś się tu źle sformatowało, wiadomo, że Jade wymaga bardzo rygorystycznego podejścia do formatowania.
    Polecam Kolegom Majsterkowiczom spróbować Node i Arduino, miłego dnia.

    Odpowiedz
  • U mnie jest chyba coś nie halo z tym odwołaniem w pliku PHP do strony Xively.
    Na stronie na moim serwerze wyskakuje warning o nieautoryzowanym dostępie.
    Czy ten API Endpoint to ma być wklejony w linii 11 ?
    Jak przesłać tam login i hasło?

    Odpowiedz
  • Możliwe, kwestia lekkiego zmodyfikowania kodu. We wszystkie pola jak API_KEY, FEED ID, login, password należy wpisać własne dane

    Odpowiedz
  • Witam czy zna ktoś jakiś dobry tutorial o wysyłaniu tego typu zapytań/poleceń przez arduino. Zaprezentowanu tu kod odpalił się bez najmniejszych problemów na module enc28j60, natomiast próbuję zrobić coś podobnego, ale dla serwera domoticz i nie chce działać. Korzystam, z przykładu dla ethernet shielda, i działa, natomiast po wpisaniu wartości dla domoticz’a mam błąd 400 i koniec.

    Odpowiedz

Odpowiedz

anuluj

Masz uwagi?