Mai témánk a nagypontosságú hőmérsékletmérés DS18B20 egyvezetékes (one wire) digitális hőmérővel.
A Raspberry Pi GPIO portja az egyszerű digitális I/O csatlakozókon és a szabványos I2C illetve SPI buszos eszközök bekötése mellet az un. 1-wire© kommunikációs protokollt alkalmazó érzékelők csatlakoztatását is lehetővé teszi.
A 1-wire© kommunikációt használó eszközök a tápfeszültség vezetékein kívül mindössze egy darab adatvezetéket igényelnek a működésükhöz. Így például a címben említett DS18B20 hőmérsékletmérő szenzort nagyon könnyen tudod illeszteni a Raspberry GPIO portjához. A kapcsolás mindössze egy további alkatrészt igényel, egy 4,7kΩ-os felhúzó ellenállást, amit az adatvezeték és a pozitív tápfeszültség közé kell kötnöd.
A DS18B20 főbb tulajdonságai:
- Hőmérséklet tartomány: -55°C – +125°C
- Mérési pontosság: ±0.5°C -10°C és +85°C között
- Felbontás: 9 – 12 Bit (választható)
- 64 bites egyedi azonosító
- 1 vezetékes protokoll
A következő példában azt mutatom be, hogy a szenzort hogyan tudod egy Rapsberry-hez kapcsolni, hogyan tudod pythonból programozni, illetve megnézünk egy egyszerű alkalmazást, ami kicsit kibővítve akár egy lakás hőmérséklet szabályozásának alapja is lehet (thermosztát).
1. A szenzor bekötése
Ahogy a fenti táblázatban láthatod, az érzékelőre tápfeszültséget kell kapcsolni (3,3V) illetve a középső lábat a GPIO port 7. tüskéjére (BCM 4) kell csatlakoztatni. Ne maradjon ki az adatvezetéket a pozitív tápfeszültséggel összekötő 4,7kohm-os felhúzóellenállás sem!
2. Engedélyezés, címlekérdezés
A fentiekben olvashatod, hogy a DS18B20 szenzor 64 bites egyedi azonosítóval rendelkezik. Ez lehetővé teszi, hogy egy adatvezetéken több érzékelőt is használj. A megfelelő működéshez engedélyezned kell a Pi one wire protokollját, valamint ki kell olvasnod a csatlakoztatott szenzor(ok) címét.
Az engedélyezést megoldhatod a grafikus felületen keresztül, ha a raspbian jessie, vagy strech verzióját használod. A „beállítások/raspberry pi configuration/interfaces” menüben egyszerűen kapcsold be 1-Wire lehetőséget. Ha korábbi verziót használsz, vagy előnyben részesíted az LXTerminal-on keresztül történő beállítást, akkor nyisd meg a config.txt fájlt:
$ sudo nano /boot/config.txt
majd az utolsó sorba írd be a következőt:
dtoverlay=w1-gpio
mentsd a változásokat, majd indítsd újra a gépet:
$ sudo reboot
A következő lépés az alkalmazott DS18B20 címének lekérdezése. Ezt a következő parancsok segítségével tudod megtenni, szintén az LXTerminal-ban:
$ ls -l /sys/bus/w1/devices
$ cat /sys/bus/w1/devices/28-xxxxxxxxxxxx/w1_slave
Az első parancs visszaadja az alkalmazott szenzor címét, amit a második sorban az xxxxxx helyére írva lekérdezheted az aktuális érzékelőt, illetve az aktuális hőfok értéket. Ezt a helyes kijelzés érdekében még osztani kell 1000-el.
3. Programozás
Az érzékelő folyamatos lekérdezéséhez az alábbi programot használhatod:
# ** malnasuli.hu 2018 ** import time while 1: tempfile = open("/sys/bus/w1/devices/28-0000092c68a0/w1_slave") thetext = tempfile.read() tempfile.close() # get the temperature tempdata = thetext.split("\n")[1].split(" ")[9] temperature = float(tempdata[2:]) temperature = temperature / 1000 # print out the temperature print (temperature) time.sleep(1) GPIO.cleanup()
A program másodperces időközönként kiolvassa a szenzor értékét és kiírja a terminál ablakba.
A második mintaprogram előtt kössünk be egy RGB ledet, amin „kijelezheted” az aktuális hőfok értéket, illetve azt, hogy a mért hőmérséklet túllép-e egy előre beállított határértéket. A bekötést az alábbi rajz alapján végezheted el:
# ** malnasuli.hu 2018 ** import time import RPi.GPIO as GPIO GPIO.setmode(GPIO.BOARD) ## Use board pin numbering GPIO.setup(11, GPIO.OUT) ## RED GPIO.setup(13, GPIO.OUT) ## BLUE GPIO.setup(15, GPIO.OUT) ## GREEN templimit = 25 while 1: tempfile = open("/sys/bus/w1/devices/28-0000092c68a0/w1_slave") thetext = tempfile.read() tempfile.close() # get the temperature tempdata = thetext.split("\n")[1].split(" ")[9] temperature = float(tempdata[2:]) temperature = temperature / 1000 # print out the temperature print (temperature) # LED change if temperature > templimit: GPIO.output(11,GPIO.HIGH) GPIO.output(15,GPIO.LOW) else: GPIO.output(11,GPIO.LOW) GPIO.output(15,GPIO.HIGH) time.sleep(1) GPIO.cleanup()
A programban az RGB led működtetését a 11, 13, 15-ös GPIO kimenetek végzik, alaphelyzetben a zöld, a határérték átlépése esetén a piros LED világít. Azt a hőmérsékletet, ahol a váltás történik a „templimit” változóban adhatod meg.
A kapcsolás kiegészítésével, pl. ha a program nem csak egy RGB LED-et, hanem egy relét is kapcsol, az alkalmazás egy lakás hűtés-fűtés rendszerét is szabályozhatja.
A cikk folytatásában megnézzük, hogy ezt hogyan tudod megtenni!
A két forráskód letölthető:
- Egyszerűbb, csak az érzékelő folyamatos kiolvasására szolgáló program
- RGB LED hőmérséklet kijelző program
A cikkben használt DS18B20 1-wire hőmérséklet érzékelő megvásárolható a MálnaPC Webshopjában!