Hőmérő készítés

Több előző bejegyzésemhez hasonlóan ez a "projekt" is szorosan kapcsolódik a BME-hez, azonban az eddigi mobilos témákkal ellentétben, melyek szegről-végről az Automatizálási és Alkalmazott Informatikai Tanszékhez ködődtek, most a Közigazgatási és Informatikai Központbeli munkatársaimnak az eredetileg szerverek megfigyelésére szánt ötletét valósítottam meg itthoni külső-belső hőmérséklet megfigyelésre. A cél a lakás három fontosabb pontján és egy külső ponton mért hőmérsékleti adatok meghatározott időnkénti mintavételezésével egyszerűbb energiagazdálkodási következtetések levonása, illetve természetesen a szórakozás, kíváncsiság volt.

A hőmérsékletet DS18B20 típusú egyvonalas hőmérő szenzorok mérik. (Történelmi okokból használom ennek egy régebbi társát is, ezek azonban lényegileg azonosak, így külön tárgyalást nem igényelnek). Az alapvető elképzelés az volt, hogy a falban már egyébként is meglévő, de nem használt két eres telefonvezetéket használom fel a szenzorok bekötésére. Ezt a DS18B20 egyvonalas interfészének parazita módú működtetése révén valósítottam meg a további költség hatékonyság érdekében buszos kivitelben. Ennek köszönhetően a lakás három különböző szintjeinek központi helyein lehetőségem nyílt egy-egy szenzor további alkatrészek nélküli felfűzésére és a mérések irányítására. A parazita módú használat hátulütője, hogy egy mérés körülbelül egy másodpercig tart, azonban mivel feltehetően perces nagyságrendű mintavételezési gyakoriságnak van csak értelme, ennek nincs különösebb gyakorlati jelentőssége.

A méréseket egy Arduino Nano irányítja, melyet alacsony árának köszönhetően bármikor könnyen be lehet szerezni (például itt). Pár egyéb apróság (potméter, kábelek és breadboard) gyors beszerzése után az Arduinora felkerült a OneWire Library minta alkalmazás, mely történetesen pont egy ilyen szenzort képes vezérelni és a mért adatokat soros eszközön keresztül bármely számítógép számára elérhetővé tenni az alábbihoz hasonló formában.

1
2
3
4
5
6
gabor@server:~$ sudo cat /dev/ttyUSB0
ROM = 28 A0 B0 B9 4 0 0 91
  Chip = DS18B20
  Data = 1 1B 1 4B 46 7F FF 5 10 FC  CRC=FC
  Temperature = 17.69 Celsius, 63.84 Fahrenheit
No more addresses.

A felprogramozás során azonban sajnos kiderült, hogy az általam vásárolt Arduino Nano nem tartalmazza az előprogramozottan szükséges boot loder-t, amit egy szerencsére pont kéznél lévő másik Nano segítségével gyorsan orvosolni lehetett. A boot loader feltöltése után a későbbi programozások már egyéb eszköz nélkül, kizárólag USB-n keresztül megvalósíthatóak.

Az így elkészült Arduino Nano által küldött adatokat egy Ubuntu Linux alatti Bash szkript segítségével egyszerűen, lényegében reguláris kifejezésekre alapozva értelmezem és a percenként mért értékeket egy MySQL adatbázisban későbbi elemzés céljából eltárolom.

Az aktuálisan mért adatok publikálására egy minden mérés alkalmával automatikusan generálódó JSON fájl weben keresztüli közzététele adta a megoldást. Ennek köszönhetően egy általunk készített primitív Windows 7 Gadget segítségével a Windows asztalon megjeleníthetővé váltak az aktuális külső és belső hőmérsékletek, valaint egy távoli Munin kiszolgáló segítségével egyszerűen on-lline frissíülő diagrammokat is készítettünk a mért értékekből.

A végén a poén kedvéért úgy döntöttem, hogy még inkább közkincsé teszem a külső hőmérsékleti értékeket, vagyis publikálom azokat Időképen. Ennek kettős jelentőssége volt: egyrészt egy hozzáértőkből álló meteorológusi kontrollt kaptak a külső mérések, másrészt pedig az Időkép olvasói is egy mérési ponttal többról tudtak innentől információkat szerezni (elsősorban az ostorosiak, mivel itt helyeztem el a szenzort). A meteorológusi kontrollnak köszönhetően hamar kiderült, hogy a hőmérséklet mérésnek nem akármilyen szabályai vannak, így többek között egy a meteorológiai szabályoknak megfelelő hőmérőház is készült (a szabályokról és a mérőházról bővebben az előbbi linken található bővebb információ).

Az Időképnek egyébként egy igen egyszerű API-n keresztül van lehetőség az adatok beküldésére: regisztrálni kell a pro.idokep.hu oldalon, majd egyszerű HTTP GET kérések segítségével kell továbbítani az adatokat, mely az Időképtől kapott információk alapján a következőkben foglalható egyszerűen össze:

http://pro.idokep.hu/sendws.php?user=usernev&pass=titok&tipus=sajatszenzorneve&p=1006.4&hom=30.3&rh=41&szelero=-1.0&szelirany=180&csap1h=0.0&csap=0.0&szellokes=0.0

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
user=username
pass=password
tipus=your_weather_station_type
p=sea_level_air_pressure
hom=temperature_celsius
rh=relative_humidity_percent
szelirany=wind_direction (degrees 0-359)
szelero=10_min_wind_avg (in m/s)
szellokes=10_min_wind_max (in m/s).
csap1h=rain_in_last_hour (in mm)
csap=rain_in_last_day (in mm)

A fenti módon az idokep.hu-ra beküldött adatokat, aktuális mért érték és egy diagram formájában itt lehet megtekinteni percenkénti frissítéssel.

A hőmérő rendszer építése során a legnagyobb problémát a kábelek ismeretlen minőségi paraméterei, azok hossza és a hőmérő ház megfelelő elhelyezése okozta. Ennek oka, hogy ezeket az eszközöket alapvetően pár méteres távolságra tervezék, míg itt akár a 20 méteres teljes vezeték szakasz is elképzelhető volt, melyeknek a szórt kapacitása  a gyors jelváltásoknál lehetetlenné teheti a kommunikációt. Szerencsére azonban ez nem okozott gondot, a vonali áramokat kellően megnövelve könnyen orvosolható volt a probléma és indulhatott a mérés.

Bár a mérésekből eredetileg később terveztem írni egy újabb bejegyzést, azt már most is látni, hogy mennyire fontos a levegő hőmérsékletének mérésére vonatkozó előírások betartása. Az utóbbi egy-két hétben ugyanis két közel azonos helyre elhelyezett szenzort figyeltem, melyek közül az egyik csak árnyékban, a másik azonban megfelelő tányéros árnyékolóban volt elhelyezve. Elmondható, hogy az együttmozgásuk ellenére többször szignifikáns különbségeket tudtak produkálni (lásd diagram), ezzel lényegesen meghamisítva a méréseket.