Montag, 19. August 2019

Raspberry Pi - Temperatursensor DHT22

Mit dem Temperatursensor DHT22 (ca. 5 EUR) kann man Luftfeuchtigkeit und Temperatur messen. Der Verkabelung ist analog zu dem Temperatursensor DS18B20.

In dem Beitrag stelle ich die Anbindung und das Auslesen des Sensors mit zwei verschiedenen Methoden vor. Ich habe auch den Quellcode vom https://sebastianhemel.blogspot.com/2018/05/raspberry-pi-oled-display-ssd1306-i2c.html angepasst, damit eine Ausgabe auf dem OLED I2C Display erfolgen kann.


Der DHT22-Sensor ist kostengünstig, lässt sich einfach ansteuern und ist digital (kein Analogkonverter/Kalibration notwendig). 
Der große Nachteil ist aber, dass er relativ langsam ist (Abfrage max. alle 3 Sekunden) und der Sensor stürzt oft ab und er muss vom Strom genommen werden, damit er neu gestartet werden kann.


Technische Daten des DHT22:
  • 3 - 5 V Spannungsversorgung und I/O
  • 2,5 mA Stromaufnahme
  • 0 bis 100 % Luftfeuchtigkeit-Messbereich, mit 2 bis 5 % Genauigkeit
  • -40 bis 80° Temperatur-Messbereich, mit +- 0,5°C Genauigkeit
  • maximal 0.5 Hz Sampling Rate (einmal jede zweite Sekunde)
  • Abmessungen: 15,1 mm x 25 mm x 7,7 mm (ohne Pins)
  • 4 pins mit 0.1'' Abstand (geeignet für Breadboards)
    • der dritte Pin  (zwischen DATA und GND)  ist nicht belegt
  • siehe auch https://cdn-shop.adafruit.com/datasheets/DHT22.pdf

Anschluss am Pi

Der Sensor darf am nur mit 3,3V Spannungsversorgung angeschlossen werden. Wichtig ist auch der 10 kilo-Ohm Widerstand, damit die Datenleitung nicht "gefloated" wird.


Als Alternative kann man auch den DHT22 mit integrierten Widerstand verwenden:


Sensor ansteuern mit pigpio

Mit der pigpio Bibliothek (C und Python) kann man beim Pi auf den GPIO Port zugreifen.
Damit dies funktioniert, muss pigpio als Daemon immer im Hintergrund laufen, damit ein Zugriff auf die Pins via Sockets und Pipes erfolgen kann.

Installtion erfolgt mit dem folgenden Befehl:
sudo apt-get install pigpio

Jetzt muss der pigpio daemon (pigpiod) als "root" gestartet werden:
sudo pigpiod

Am besten kann man dies auch gleich mit in der crontab vom "root" aufnehmen:
sudo crontab -e
@reboot pigpiod #start pigpio daemon

Über das folgenden Beispiel aus der pigpio Bibliothek, kann der Sensor angesprochen werden: https://github.com/joan2937/pigpio/raw/master/EXAMPLES/Python/DHT22_AM2302_SENSOR/DHT22.py (Download z.B. mit wget)

In der Datei "DHT22.py" muss jetzt noch der korrekte Daten-Pin eingestellt werden:
nano DHT22.py (Zeile 257)
...
s = DHT22.sensor(pi, 4, LED=16, power=8)
...


Je Zeile:
  • fortlaufende Nummer, Luftfeuchtigkeit, Temperatur, Staleness, Bad Checksum Counter, Short Message Counter, Missing Message Counter, Sensor Resets
Kommt es bei der Ausführung "python DHT22.py" zu der folgenden Fehlermeldung:
Traceback (most recent call last):
  File "DHT22.py", line 8, in <module>
    import pigpio
ImportError: No module named pigpio


Müssen noch die folgenden Module installiert werden:
sudo apt-get install python-pigpio python3-pigpio
Um die Daten jetzt auch im OLED I2C Display anzeigen zu können, habe ich folgende Methode hinzugefügt:

def GetTempDHT22():
    s.trigger()
    time.sleep(0.2)
    #print ("{:5.1f} °C {:.0f} %".format(s.temperature(), s.humidity()))
    value = "{:5.1f} °C {:.0f} %".format(s.temperature(), s.humidity())
    value = unicode(value, 'utf-8')
    return value


wget http://www.shemel.de/download/raspberry/OLEDdisplayTempDHT22pigpio.py


Sensor ansteuern mit Adafruit 

Der Open Source Treiber von Adafruit (C und Python) kann auch für die Ansteuerung verwendet werden.

Vor dem Download muss ggf. das System vorbereitet werden (Pakete build-essentail und python-dev):
sudo apt-get update
sudo apt-get install build-essential python-dev


Jetzt kann das GitHub Repository geklont werden:
git clone https://github.com/adafruit/Adafruit_Python_DHT.git

Anschließend muss der Quellcode noch konfiguriert werden:
cd Adafruit_Python_DHT/
sudo python setup.py install


Danach kann man die Library verwenden und das folgende Beispiel aufrufen:
cd examples
sudo ./AdafruitDHT.py 22 4

Temp=28.4*  Humidity=51.1%

Gibt es ein Problem oder wurde der falsche Pin verwendet, erscheint folgende Ausgabe:
Failed to get reading. Try again!

Um die Daten jetzt auch im OLED I2C Display anzeigen zu können, habe ich folgende Methode hinzugefügt:
...
import Adafruit_DHT
...
def GetTempDHT22():
    humidity, temperature = Adafruit_DHT.read_retry(Adafruit_DHT.DHT22, 4)
    if humidity is not None and temperature is not None:
        print('Temp={0:0.1f}*  Humidity={1:0.1f}%'.format(temperature, humidity))
        value = '{0:0.1f}* {1:0.1f}%'.format(temperature, humidity)
    else:
        print('Failed to get reading. Try again!')
        value = 'Failed'
    return value


Keine Kommentare:

Kommentar posten