Temperaturnik

OZADJE

Minilo je že nekaj časa. odkar sem RaspberryPI zaposlil s kakšno novo nalogo. Nadvse uporaben računalnik tako zaenkrat skupaj z opremo uporabljeno pri prejšnjih projektih zgolj zavzema majhen prostor v kotu sobe. Zares... žalostno :(.

S čim bi torej zaposlil nekaj tako uporabnega kot je RaspberryPI? Evrika! V vsakem trenutku želim vedeti (oziroma vsaj imeti možnost izvedeti) koliko stopinj je v sobi kjer se nahaja RaspberryPI. Podatke želim prikazati na uporabniku prijazen način. Spremljati želim tudi temperaturo v kraju. Pridobljene podatke o meritvah želim imeti na voljo za kasnejše vrednotenje. Poleg možnosti pogleda trenutne temperature zunaj in v prostoru želim imeti možnost vpogleda v pretekle meritve.

Videti je, da lahko projekt zastavim na način, da uporabim nekaj elementov, ki jih do sedaj nisem. Vsi kazalci tako kažejo na to, da je najbolje. če se projekta lotim čimprej.

Let’s create an awesome project!

PRIPRAVA

Sedaj, ko približno vem, kaj želim implementirati je čas, da funkcionalnost natančneje opredelim in izberem ustrezne tehnologije za izvedbo projekta.

Pridobivanje temperature v prostoru - Projekt nekako v središče pozornosti postavlja temperaturo zato je najbolje, da se načrtovanja lotim kar pri pridobivanju tenperature. Za pridobivanje temperature v prostoru bom uporabil temperaturni senzor z digitalnim izhodom: DS1820. S pomočjo tehnologije 1-Wire bom trenutno temperaturo prostora lahko pridobil na RaspberryPI.

Za implementacijo programa, ki bo pridobljeno temperaturo prebiral bom uporabil C++.

Pridobivanje zunanje temperature – Zunanjo temperaturo bom pridobival preko API-ja strani: https://openweathermap.org/.

Shranjevanje temperature – Prebrani podatki se bodo periodično zapisovali v podatkovno bazo. Pri tem si bom pomagal s tehnologijo SQLite.

Pridobivanje trenutne temperature v spletno aplikacijo – Za prikaz podatkov bom implementiral ločeno spletno aplikacijo, ki bo preko protokola WebSockets komunicirala s programom za pridobivanje temperatur.

Pridobivanje temperature za določeno obdobje – Pridobivanje temperature za določeno obdobje bom implementiral v jeziku PHP. S pomočjo slednjega bom na podatkih izvajal tudi vrednotenje in pa seveda procesiral podatke pridobljene s spletne strani.

Prikaz podatkov na spletni strani – Prenos podatkov z backend na frontend aplikacije bom uporabil Twig. Za oblikovanje končne podobe strani bodo uporabljene naslednje tehnologije: HTML5, CSS, Javascript. Pri oblikovanju si bom pomagal tudi z ogrodjem Bootstrap. Temperature bom prikazal na grafu. za dosego slednjega pa se bom zanesel na knjižnico CanvasJS.

IZVEDBA

Izvedbe projekta se lotim z vezavo senzorja DS1820 na RaspberryPI. Pri tem si pomagam s shemo iz dokumentacije senzorja.

Funkcije posameznih nog.
Funkcije posameznih nog.
Vezalna shema z dokumentacije.
Vezalna shema z dokumentacije.

Z RaspberryPI-ja nato na eksperimentalno ploščo pripeljem +5V, GND in pin GPIO 4 (pin 7).

Vezava v praksi.
Vezava v praksi.

Da bi omogočil komuniciranje s pomočjo 1-Wire tehnologije nekoliko spremenim konfiguracijo RaspberryPI-ja. V datoteko: /boot/config.txt dodam naslednji ukaz:

dtoverlay=w1-gpio

RaspberryPI samodejno ne naloži ustreznih gonilnikov za uporabo tehnologije 1-Wire, zato to storim jaz. Izvedba ukazov zahteva pristojnosti root uporabnika.

modprobe w1-therm
modprobe w1-gpio pullup=1

Preverim, če periodično zapisovanje temperature v datoteko povezano s temperaturnim senzorjem deluje in se lotim implementacije strežniškega programa. Ker gre samo za branje preproste tekstovne datoteke, strežniški program ni potreboval dodatnih knjižnic.

Strežniškemu programu za tem dodam še mehanizem za pridobivanje zunanje temperature. Na tej točki v program vključim nove odvisnosti. Zahtevo za pridobitev temperature kraja oddam s pomočjo curl knjižnice, ker pa aplikacija pri zunanji storitvi na katero se zanaša moj strežniški program vrača rezultate v JSON formatu, v projekt vključim tudi naslednji pripomoček: https://github.com/nlohmann/json/.

Ko je novo dodana funkcionalnost ustrezno testirana strežniškemu programu dodam možnost komunikacije preko protokola WebSockets. Pri tem si pomagam z že obstoječim projektom: https://github.com/mnisjk/cppWebSockets.

Strežniški program nato testiram, tako da najprej zgradim osnovno spletne strani. S pomočjo knjižnice CanvasJS na stran dodam graf, ki ga posodabljam s podatki pridobljenimi preko WebSockets protokola.

Jan  3 14:45:00 rpi temperaturnik-server: [cppWebSockets] Next database insertion: Tue Jan  3 15:00:00 2017#012.
Jan  3 15:00:00 rpi temperaturnik-server: [cppWebSockets] Next database insertion: Tue Jan  3 15:15:00 2017#012.
Jan  3 15:15:01 rpi temperaturnik-server: [cppWebSockets] Next database insertion: Tue Jan  3 15:30:00 2017#012.
Jan  3 15:30:00 rpi temperaturnik-server: [cppWebSockets] Next database insertion: Tue Jan  3 15:45:00 2017#012.
Jan  3 15:45:00 rpi temperaturnik-server: [cppWebSockets] Next database insertion: Tue Jan  3 16:00:00 2017#012.
Jan  3 16:00:00 rpi temperaturnik-server: [cppWebSockets] Next database insertion: Tue Jan  3 16:15:00 2017#012.
Jan  3 16:15:00 rpi temperaturnik-server: [cppWebSockets] Next database insertion: Tue Jan  3 16:30:00 2017#012.
Jan  3 19:26:33 rpi temperaturnik-server: [cppWebSockets] New client connected. Socket ID: 10.
Zapisi z dnevniške datoteke, ko strežniški program teče v ’release’ načinu.

Za tem strežniškemu programu dodam funkcionalnost za periodično zapisovanje podatkov v podatkovno bazo.

Sledi še uvedba PHP skript za procesiranje podatkov pred prikazom spletne strani. Kompleksnost HTML in JS kode se pri tem nekoliko poveča zato s pomoćjo knjižnice Twig predstavitveno plast aplikacije ločim od funkcionalne.

Zahvaljajoč ogrodju Bootstrap s samim oblikovanjem strani ne izgubljam veliko časa.

Spletni vmesnik.
Spletni vmesnik.

REZULTAT

  • Ogled trenutne temperature zunaj ali v prostoru.
  • Grafični prikaz preteklih meritev za določeno obdobje.
  • Grafični prikaz trenutne temperature zunaj in v prostoru (interval preverjanja je 2 sekundi).
  • S pridobljenih temperatur projekt lahko izlušči: minimalno, maksimalno in povprečno vrednost.