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 szenzor lábkiosztása

A szenzor bekötése

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!

null

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:

null
A mintaprogram:

# ** 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!

null

A két forráskód letölthető:

A cikkben használt DS18B20 1-wire hőmérséklet érzékelő megvásárolható a MálnaPC Webshopjában!