IX. TavIR programozói verseny: Turi Dániel (proci): On-line hőmérséklet mérő állomás

A pályázatban megvalósításra került egy hőmérséklet mérő állomás, melynek a lelke egy Arduino Uno R3 + Wiznet (W5100) Ethernet shield + egy marék DS18B20 hőmérséklet mérő digitális  szenzor.

A rendszer 2 tulajdonságában domborít nagyot:

  1. Induláskor automatikusan detektálja a OneWire buszon lévő DS18B20 szenzorokat, nem kell a kódot módosítani, ha új szenzort kötünk a buszra.
  2. A mért hőmérsékletet egy távoli SQL adatbázisban letárolja, amiből visszakereshető, belenagyatható grafikon készül.

Közel 40 méter UTP kábelen keresztül 7 szenzorról közlekednek az adatok, melyből 20 méter a hálózat gerincét adja, a többi az erre kapcsolódó hosszabb-rövidebb szakaszok. Az UTP-ben lévő szabad ereken napelemmel előállított táp (+akku) szolgáltatja az Arduino számára szükséges tápforrást. A hőszenzorokkal külső, belső hőmérsékletet, padlásteret, üvegházat, kazánházat mérek.

A megépítés elsődleges oka az adatgyűjtés, monitorozás volt olyan vonatkozásban, hogy a 2 szintes kertesház szigetelései mennyire hatékonyak. Ha fűtünk, melegszik a kis padlás is? Mennyire melegszik fel az üvegház napközben és mennyire képes tartani a hőmérsékletet éjjel? Ezekre a kérdésekre kerestem és keresem továbbra is a választ, hiszen a rendszer októberben indult. Az igazi válaszok a tél beálltával lesznek.

A jövőbeli tervek között szerepel a mérési kör kibővítése páratartalom és légnyomás méréssel is. Így időjárás mérő állomássá léphet elő.  Emellett a hőszenzorok számának bővítése, mivel a jelenlegi 6 mellé még legalább 4-5 helyre tervezek telepíteni. Mint pl. nagy padlás, akvárium, több szoba, kazánvíz.

A fent felvázolt környezet a rendszer konkrét adatgyűjtő eszköze. Ez azonban még kevés a teljességhez. Ezeket fel is kell dolgozni és megjelenítésre, kiértékelésre alkalmassá  kell tenni. Élve a szakkifejezéssel, van egy backend része is a rendszernek. Ez a save.php ami fogadja az Arduino mért adataiból kreált GET URL-t. Ez a fogadó rész szerver oldali programozási nyelvben, php-ban íródott.

Miután nagy vonalakban, távolról felvázoltam a rendszer felépítését, most nézzük meg közelebbről.

Arduino

A forráskód nagyon részletesen, szinte sorról-sorra bemutatásra került, így erről csak kiegészítő infókat közlök.

A forráskódban említett, induláskor soros portra kiírt szenzorok címek formailag a következőképpen szerepelnek:

Device 0: 0x28, 0x8C, 0xDD, 0x3C, 0x05, 0x00, 0x00, 0x54
Device 1: 0x28, 0x8E, 0xBC, 0x43, 0x03, 0x00, 0x00, 0x05
Device 2: 0x28, 0x01, 0x7B, 0x43, 0x03, 0x00, 0x00, 0xB8
Device 3: 0x28, 0xC9, 0x7E, 0x43, 0x03, 0x00, 0x00, 0x54
Device 4: 0x28, 0x83, 0xBE, 0x43, 0x03, 0x00, 0x00, 0xCC
Device 5: 0x28, 0x43, 0xCF, 0x04, 0x04, 0x00, 0x00, 0xEF

Ezt követően kiírja az IP majd 5 másodperc elteltével megpróbál csatlakozni a megadott szerverhez. Sikeres kapcsolódáskor megkapjuk a webszervertől a 200-as http kódot, a szerver egyéni adatait + a php feldolgozó kimenetét, ami egy „Added” szó kiséretében kiírja az eltárolt hőmérsékleteket. Majd lekapcsolódik:

IP: 192.168.1.15
connecting...
HTTP/1.1 200 OK
Date: Sun, 10 Nov 2013 13:06:48 GMT
Server: Apache
Vary: Accept-Encoding
Connection: close
Content-Type: text/html; charset=utf-8
Added: 20.5;14.25;16.5;17.25;16.5;23;
disconnecting.

Ezt követően 5 percenként a “connecting...”-gel nyitott és “disconecting...”-gel zárt blokk jelenik meg újra és újra a soros porton, jelezve, hogy az adatok elküldésre kerülnek.



Webkliens

Backend, save.php

A felépítése egyszerű: Kapcsolódik a szerveren futó MySQL adatbázishoz. Ellenőrzi, hogy a GET paraméterek között szerepel-e és ha igen, helyes-e a jelszó. A szenzorok által mért hőmérsékletet azonosítójuk szerint változóba, majd egy adatbázis tábla megfelelő táblájának megfelelő cellájába helyezem el időbélyeggel ellátva. Ezt a táblát a frontend résszel, egy adatbázisból dolgozó grafikon készítővel megjelenítem. Ennek neve az amcharts, mely PHP+jquery alapú. Az adatbázis mellett a kapott adatok egy txt-be is logolom, bár gyakorlati jelentősége nincs. Nem kerül későbbi feldolgozásra.

Sokkal inkább feldolgozásra kerül az a változónként elmentett txt, ami minden időpillanatban a legutóbbi mérés értékét tartalmazza (p0-p8.txt). Ezt egy másik szerver oldali program 5 percenként lekéri és más jellegű grafikont rajzol belőle. A neve MRTG, mely 1 évre visszamenőleg képes megjeleníteni a mért adatok maximum és átlag értékét. Az előbbi grafikonkészítővel ellentétben ennél nagyon jól láthatóak az időszakok átlag hőmérsékletei. Így tehát szemléletes ábrák készülnek az oly sokat emlegetett emelkedő átlag hőmérsékletről. A másodlagos célom egyébként ennek megfigyelése is.

Frontend – amcharts

Alapból fix adatokkal dolgozik, de a neten több példa is található dinamikus, SQL alapú működésre is. Egy jó alap itt található: http://iada.nl/en/blog/article/temperature-monitoring-raspberry-pi

Néhány képet a fájlok között mellékelek amcharts-*.png néven.

Egy részletet kiragadva röviden összegezném mit és miért látunk.

Reggel, ahol kisüt a nap - ott emelkedni kezd a külső hőmérséklet (eresz, padlás), de sokkal meredekebben melegedik az üvegház, mely valójában egy beüvegezett terasz rész. Erről a képről pontosan nem olvasható le, de a csúszkát odamozgatva az élő grafikonról leolvasható, hogy a a külső hőmérséklet max. 18°C-ra melegedett fel, míg az üvegház a 24°C-t is elérte. A padlás szintén melegebb lett, mint a külső hőmérséklet és a meleget is jobban tartotta. Később a hőmérséklet esik, de az üvegház több fokkal (jellemzően 5°C)  melegebb a kintinél és ezt reggelig tartja. 17 óra körül a kazánházba begyűjtottunk, így melegedésnek indultak a helységek.

Frontend – MRTG

A következő MRTG grafikonon heti átlag hőmérséklet látszódik világos zöld színnel és a néhol látható sötét zöld csúcsok jelzik az adott napon mért maximális hőmérsékletet.

A maximális és átlag hőmérséklet viszonyát a következő kép szemlélteti jobban. Ebből látható, hogy 27°C volt a legmagasabb érték, a közel 1 hónap során mért értékek átlaga viszont 14°C. Látszódik az erőteljes lehűlés tendenciája is. Negatív hőmérsékletnél kékbe vált majd a grafikon.

Az MRTG egyszerre 4 értéket tud megjeleníteni. 2 szenzor értékét a hozzá tartozó max/átlag értékpárral. Én 1 grafikonba csak 1 szenzort fogok rajzoltatni. Ehhez hasonlóan a pára- és a légnyomás értékeket is. 1-2 hónap elteltével már gyönyörűen fognak látszódni a max./átlag értékek.

Mint látható, a megjelenítésre több lehetőség is kínálkozik. Akár csv, excel fájlt is generálhatunk az SQL-ben tárolt adatokból és az excel segítségével készítünk grafikont, mint egy reportot a főnökségnek a szerverterem hőmérsékletéről :). A felhasználási terület határtalan, hiszen amit Arduino-val meg tudunk mérni (vízszint, fény, mágneses tér, közelség, digitális iránytűvel É-D, K-NY helyzete, stb.) azt le tudjuk tárolni és visszamenőleg megjeleníteni, kiértékelni. Amennyiben további, számomra hasznos értékek mérése kerül előtérbe, úgy magam is tovább bővítem a kis rendszeremet. Legutóbbi ötletem az akvárium szűrőjének átfolyási sebességének mérése, mely mindössze egy közcsonk beépítésével jár a külső szűrő körébe és az Ardino folyamatosan mérni képes mennyi l/h-val szűri a vizet. Ha az érték egyre csökken (vizuálisan lászódni fog a grafikonon), akkor időszerű a szűrő tisztítása.

Végszó

Remélem sokan gondolatébresztőnek találjátok és ti is hasonló sziporkázó ötletekkel folytatjátok a mérések sorát. Amennyiben így van, kérlek írjátok meg nekem e-mailben, milyen új mérést eszeltetek ki:)



Turi Dániel (proci)

Fájlmelléklet: 

TavIR-Facebook