2024. április 19., péntek

Gyorskeresés

Útvonal

Cikkek » Számtech rovat

Hőmérséklet mérő Pi

  • (f)
  • (p)
Írta: |

Egy kis bevezető után bemutatom a hőmérséklet mérésének egyszerű megvalósítását Raspberry Pi-al.

[ ÚJ TESZT ]

Egy kis bevezető után bemutatom a hőmérséklet mérés egyszerű megvalósítását Raspberry Pi-al, és ezt a kapott értéket munin-nal kirajzoltatom. A végén javaslatot teszek egyéb továbblépési lehetőségekre is.

Már egy lassan több mint éve a tulajdonomban van egy Raspberry Pi B modell. Akkori szerencsémre pont beleszaladtam az új verziós átállásba, így az RS-től végül egy 512 MB-os feljavított verziót kaptam. Kezdetben Raspbian és Arch disztrókkal próbálkoztam és inkább a linux részére koncentráltam az eszköznek (fordítottam hozzá xfce 4.10-et is).
Ezek után egy ideig OpenELEC disztribúciót igénybe véve média centerként működött. (Megjegyzem film nézésre, internetes rádió hallgatására és youtube lejátszásra teljesen jó). De valami másra is szerettem volna használni.

OpenELEC

A váltás egy egyetemi kurzus során jött, ahol mikrovezérlők és FPGA-k programozásáról tanultunk. Egyik laboron egy ATmega128-ra kellett LCD és hőmérséklet szenzor vezérlőt írni. Hőmérséklet mérésre DS18B20-at használtunk, ami a Dallas 1-wire-ön keresztül érhető el és teljesen digitális az átvitel. Mikrovezérlőre megírni a függvényeket viszont nehéz volt. A tényleges áttörés egy héttel később történt meg a szegedi Szabad Szoftver Konferencia egyik előadásán, ahol az általam korábban megismert szenzor kezeléséről is beszélt az előadó. Ami a legfontosabb, hogy a linux kernel része a w1 kommunikáció. Kernel fordításkor ezt valahogy mindig elkerülte a figyelmem...

Aznap este már indult is a móka. Első dolgom volt utána olvasni a témának, és a következőkre akadtam: [link] [link]Adafruit lesson, RPi Low Level, Logout. Többen megvalósították, és nem tűnt nehéznek.

Szükséges eszközök:
* Raspberry Pi B + 4 GB SD kártya
* Raspbian (de másik általános disztróval is működik)
* DS18B20 hőmérséklet szenzor, amit a helyi elektronikai üzletben meg is lehet találni kb. 600Ft áron.
* 4700 Ohm-os ellenállás (4k7)
* Vezeték és tüskére csatlakozók (én egy CD olvasó analóg audio kábelét használtam)
* Internet kapcsolat

A linux telepítéssel nem foglalkozom most, mert arra sok ezer leírás van. Pl itt. Feltételezem, hogy ezen már átestünk, és tudunk csatlakozni ssh-n vagy putty-on keresztül eszközünkhöz.

Kétféle szenzorból lehet választani: S és B. Az előbbi az eredeti DS1820 helyettesítője, 9 bit felbontású. Az utóbbi viszont 12 bit felbontású, de ez csökkenthető gyorsabb mérésekhez.
Mivel árban nincs sok különbség, ezért én az utóbbit javaslom.

Egy összehasonlítás egyéb szenzorokról itt. Tömören: a DS18B20 a legjobb, a többi vagy drágább, vagy rosszabb a pontossága, vagy nem szabványos kínai.

A Raspberry Pi tüskéi közül a PIN1 (3.3V), PIN7 (GPIO4), PIN9 (GND) lábait használtam.

Ez annyiban jelent eltérést, a többi megoldástól, hogy így megmarad a soros port csatlakozási lehetőségem, mivel így csak egy sort használok. A soros port a PIN6 (GND), PIN8 (TX), PIN10 (RX) lábak használatával a legegyszerűbb egy megfelelően módosított Nokia CA-42 kábellel.

A szenzor láb kiosztását az adatlapból néztem ki először, de ez a fenti kép jól mutatja a sorrendet. A középső lábon történik a kommunikáció. Ez a láb alap esetben mindig magas állásban van (3.3 V), ezt egy "pull-up" ellenállással tudjuk biztosítani. Ezért össze kell kötni a PIN1 és PIN7 lábakat a Rasberry Pi-on a 4k7 Ohmos ellenállással. Nem mennék bele mélyen a kommunikációba, de a lényeg, hogy egy bit átvitele úgy zajlik, hogy aki éppen kommunikál az bizonyos ideig 0-ra húzza a csatornát, majd felengedi. Ha ez rövid volt, akkor "1" kerül átvitelre, ha hosszabb akkor "0". Egyszerre csak egy eszköz kommunikál a csatornán.

A harmadik láb a szenzor tápellátásáért felel. Futtatható parazita módban, amikor ezt a földre kötjük és a kommunikációs lábról működteti magát. Viszont ha hosszabb hálózatot szeretnénk és pontosabb mérést, akkor ezt a lábat kell a 3.3V-re (PIN1) kötni.

Ha készen vagyunk a művelettel, és ellenőriztünk mindent újra, akkor helyezzük áram alá az RPi-t.

Töltsük be a következő kernel modulokat: w1-gpio w1-therm
sudo modprobe w1-gpio
sudo modprobe w1-therm

Ha szeretnénk hogy minden indításkor ezek betöltődjenek, adjuk hozzá a két modul nevét a /etc/modules fájlhoz.

Ha mindent jól csináltunk, akkor a dmesg-ben vagy a syslogban (tail /var/log/syslog) megjelenik valami hasonló:

Driver for 1-wire Dallas network protocol.
w1_master_driver w1_bus_master1: Family 28 for 28.0000048d49a4.5e is not registered

Ez azt jelenti, hogy minden betöltődött és megtalálta a szenzor egyedi 64 bites azonosítóját. Mivel a UNIX minden eszközt megjelenít a fájlrendszerben, ezért tudjuk ellenőrizni egy egyszerű olvasással a hőmérsékletet: cat /sys/bus/w1/devices/28-*/w1_slave

3c 01 4b 46 7f ff 04 10 40 : crc=40 YES
3c 01 4b 46 7f ff 04 10 40 t=19750

Ahol az első sor az átvitt bitek hibátlanságára utal, míg a második a hőmérsékletet adja tizedesjegy nélkül. Mint ahogy látjuk nem kell sem a kommunikációval sem a konverzióval bajlódni, azt mind a linux kernel w1 moduljai elvégzik helyettünk. Lényegében meg is volnánk, ha ezt a fájlt olvassuk akkor megkapjuk a szenzor által mért hőmérsékletet.

Integrálás a munin grafikon készítőbe:

Más megoldást is választhatunk, ha az adatainkat szeretnénk egy honlapon megjeleníteni: Logout, Php+python

Mivel én hosszabb távon egy belső hálózat monitorozót szeretnék összerakni, ezért a munin-t választottam. A kliensekre (munin-node) feltelepített pluginekkel a frissítésektől kezdve, a lemezhasználatot, a SMART adatokat, a tápegység feszültségeit, a hálózati forgalmat és még sok mást lehet 5 perces felbontásban monitorozni. Még openwrt-re is van munin-node.

Vegyük azt az egyszerű esetet, hogy egy RaspberryPi-t akarunk csak monitorozni és ezen is akarjuk az adatokat tárolni. Telepítsük fel sudo apt-get install munin munin-node apache2 paranccsal a szükséges csomagokat. Először módosítsuk a sudo nano /etc/apache2/conf.d/munin paranccsal az apache webszerver beállítását. Minden egyes "Allow from localhost" kezdetű sor végére írjuk be, hogy 192.168.0.0/16, hogy a helyi hálózatról az elérést engedélyezzük.

Indítsuk újra a webszervert a sudo service apache2 restart paranccsal. Ezek után írjuk be a webböngészőbe http://RPi_IP_címe/munin és be kell jönnie a kezdő oldalnak, ahol az alap pluginek által generált grafikonokat megnézhetjük. Már működik is az alap összeállítás!

Munin plugin hozzáadása: GIT tároló

Az rpi-internal-temp a CPU hőmérsékletét olvassa ki, az rpi-w1-temp pedig az előző alapján írt szenzor hőmérséklet kiolvasó. A telepítés egyszerű, csak be kell másolni a két fájlt a /etc/munin/plugins/ mappába és futtathatóvá kell tenni. Azt az esetet írom le, mikor mindkettőt hozzáadjuk.

sudo apt-get install git
git clone https://github.com/gajdipajti/munin-rpi-temp
sudo cp munin-rpi-temp/rpi-* /etc/munin/plugins
sudo chmod +x /etc/munin/plugins/rpi-*
sudo munin-node restart

Ellenőrizni a következő paranccsal tudjuk:
sudo munin-run rpi-w1-temp
sudo munin-run rpi-internal-temp

Mérési eredmény:

Először a szoba hőmérsékletét néztem, ami elég stabilnak mutatkozott, majd est folytattam a mérést és rácelluxoztam a radiátorcsőre. Beállítottam egy fokozatot, és reggelre nagyon szépen látszott, hogy mikor folyt meleg víz a csövön keresztül.

CPU grafikon:

Továbblépés:
* mivel a protokoll több szenzort is támogat, ezért több láb elhasználása nélkül lehet bővíteni a szenzor hálózatot (a kernel modul 10 re van állítva alapból). Szerintem olyan 15-20 m vezetéket el kellene neki viselnie jelveszteség nélkül. [frissítve] vzoltan: 50+m, 8 szenzor, 4 eres telefonkábel, semmi extra
* egy hosszabb hálózathoz már nem elég a sima kábel, hanem Cat 5 kábelt kell használni, ahol az adat és a gnd lábat kötjük egy csavarpárra. Illetve a felhúzó ellenállást kell csökkenteni.
* jelenleg a munin-node pluginem csak 1 szenzort támogat, idővel ha beszerzek többet is, akkor azok lekezelésére módosítom a kódot. [frissítve]
* Ugyancsak 1 wire protokollon működnek az akku töltőkben használt monitorozó chipek. Pl DS2438. Ezekkel lehet feszültséget mérni, így olyan szenzorok használatára is van lehetőség, ahol az érték ilyen formában jelenik meg.
* Hasonló, de nem 1 wire protokollos (helyette Manchester-esque), a DHT22 hőmérséklet és páratartalom szenzor. Egy eszközt lehet csak 1 csatornára kötni, kernelben nem támogatott, de pontos. Adafruit-ék írtak hozzá drivert. Projekt itt és itt. [frissítve] Nem olyan jó a helyzet.

Összegzés: Bár a bejegyzésem bőbeszédűre sikeredett, igazából a megvalósítás nagyon egyszerű. Akinek van otthon egy Raspberry Pi, és még nem mert belevágni egy hasonló projektbe, bátran próbálja ki ezt, mert forrasztás nélkül lehet látványos eredményt elérni. Akinek pedig még nincs a tulajdonába, mindenképp szerezzen be egyet.

Frissítés: Sikerült a mostani hétvégén egy kis időt szakítani a projekt hardveres részére, és még két szenzort bekötöttem. Így 5 méter vezetékkel tudom mérni az ablak előtti, a radiátorcső és a szoba hőmérsékletét. A kódot is módosítottam ennek megfelelően, hogy lekezelje a több szenzort. Továbbá kiegészítettem egy CPU frekvencia pluginnel.
A rendszerben csak annyi változás történt, hogy frissítettem jessie-re, az apache2 -t lecseréltem lighttpd-re, illetve egy openvpn kapcsolatot is kapott.

Frissítés #2: Kedvcsináló a linux2014 konderenciáról. ITT

Frissítés #3: Ha valaki másik GPIO pin-t szeretne használni, itt az egyik comment ( by dpenezic » Mon Dec 30, 2013 10:49 am ). Raspbian 2013-12-20 tól elérhető. Így meg tudom csinálni majd az FM rádiót.

Frissítés #4: Megjött az AOSONG 2302 szenzor, 5k6 Ohm-os ellenállással hajtom meg. El is készítettem hozzá a munin-plugint. Az a tapasztalat, hogy 3 olvasásból 2 sikerül alapból, illetve nagyon függ a terheléstől, hogy mennyire zajos a kiolvasott érték. Ez így nagyon nem fog menni, a plugin ezért addig próbálkozik, amíg nem kap hibát kiolvasáskor. Az ellenállás vagy a 3.3V feszültséggel lehet a gond. Itt egy kép: Az elején nem dolgozott a boinc-client, majd újraindult és rögtön zajos lett. Majd a vége felé lekapcsoltam. A DS18B20 -ak nagyon szépen dolgoznak, csak újrainduláskor hajlamos kettő felcserélődni, de ez a legkevesebb.

Frissítés #5: Megjött további 15 DS18B20 és két I2C gyorsulásmérő, ami a következő projekthez fog kelleni. Egy mikroszkópiás labor hőmérsékleti, páratartalmi és rezgési tulajdonságait fogom meghatározni a nyár folyamán.
Továbbá eltávolítottam a 11-bit re vonatkozó hibás megjegyzésemet, mert nem tudtam alátámasztani. 12 a helyes szám. Elnézést mindenkitől akit félrevezettem.

Frissítés #6: A kernel 3.18 átváltott device trees módra amikor a pin kiosztást intézi. Hogy továbbra is működjön az összeállításunk, a /boot/config.txt fájl végére be kell írni a következőt:
dtoverlay=w1-gpio,gpiopin=4
És reboot!

Frissítés #7: 5 szenzorral azóta is folyik a mérés. Néha elveszik egy szenzor mert a kábelezés nem a legjobb. De ekkor meg kell mozgatni kicsit.

Frissítés #8 7 év után is generálom így az adatokat (bár néha a Telekom karbantart). Az ábrán az egyik radiátoron lévő szenzort kiraktam a hideg levegőre.

Azóta történt

Előzmények

Hirdetés

Copyright © 2000-2024 PROHARDVER Informatikai Kft.