Raspberry Pi DHT22 Temperatur Sensor

Aus Laub-Home Wiki

Um an einen Raspberry Pi einen Temeperatur und Luftfeuchtigkeitssensor anzuschließen habe ich mich für den Sensor DHT22 entschieden und diesen auch gleich fertig mit Widerstand auf einer Platine samt Kabel gekauft. Um diesen Auszulesen gibt es verschiedene Methoden, die leider auch nicht alle auf allen Raspberry Pis gleich funktionieren. Wie ihr den Sensor mit eurem Raspberry Pi auslesen könnt findet ihr weiter unten.

Der von mir verwendete Sensor ist von AZDelivery (DHT22 AM2302):

Einen Vergleich verschiedener Temperatur Sensoren findet ihr hier:

Seid ihr auf der Suche nach einer Anleitung den DHT22 Sensor an einem Raspberry Pi Pico zu betreiben, schaut hier weiter:

Anschluß des Sensors am GPIO

hier die Belegung des GPIO Boards direkt von https://www.raspberrypi.org/documentation/usage/gpio/

Unser AZDelivery DHT22 AM2302 hat drei Anschlüsse + out -, wir schließen nun folgendes zusammen:

Verkabelung
Raspberry Pi GPIO Pin DHT22 AM2302 Pin
1 +
11 (GPIO17) out
9 -

Auslesen der Daten des Sensors

Für das Auslesen der Daten gibt es einige verschiedene Lösungen, die leider nicht alle auf allen Raspberry Pi Boards lauffähig sind. Gängigste Lösung ist auf jeden Fall die Adafruit Library adafruit-circuitpython-dht zu verwenden. Diese ist bei mir unter den folgenden Raspberry Pi Boards unter Raspberry Pi OS (Bullseye) lauffähig:

  • Raspberry Pi 4
  • Raspberry Pi 3
  • Raspberry Pi zero w 2

Die alte, deprecated Library Adafruit_DHT läuft bei mir auf den folgenden Devices

  • Raspberry Pi 3
  • Raspberry Pi zero w (v1)
  • Raspberry Pi zero w 2

Adafruit-Circuit Python Libraries

Die neue Variante mittels Adafruit Library den DHT22 auszulesen ist die mittels der Circuit Python Libraries. Diese funktioniert bei mir auf meinem Raspberry Pi 4, 3 und zero w 2 problemlos, wohingegen nur die alte Adafruit Library auf dem Raspberry Pi zero w (v1) funktioniert und nicht auf dem Pi 4. Man muss jedoch use_pulseio=False setzen, dafür einfach die Zeile dhtDevice = adafruit_dht.DHT22(dhtboard, use_pulseio=False) aktiviert lassen.

Zuerst müssen einige System Abhängigkeiten installiert und konfiguriert werden:

apt install python3 python3-pip python3-rpi.gpio libgpiod2 -y
pip3 install --user adafruit-circuitpython-dht

nun können wir ein Python Script anlegen, welches uns den Sensor ausliest:

Download hier möglich: https://raw.githubusercontent.com/alaub81/rpi_sensor_scripts/main/dht22.py

/usr/local/sbin/dht22.py

#!/usr/bin/python3
import time, adafruit_dht, board

# set the variable
dht22gpiopin = 'D17'


# Initial the dht device, with data pin connected to:
dhtboard = getattr(board, dht22gpiopin)

# you can pass DHT 22 use_pulseio=False if you don't want to use pulseio
# this may be necessary on the Pi zero but will not work in
# circuit python
dhtDevice = adafruit_dht.DHT22(dhtboard, use_pulseio=False)
# Standard is, but not working on the raspberry pi boards
#dhtDevice = adafruit_dht.DHT22(dhtboard)


try:
  # Print the values to the serial port
  temperature, humidity = dhtDevice.temperature, dhtDevice.humidity
  print("Temperature: {:.1f} °C  Humidity: {:.1f} %".format(temperature, humidity))

except RuntimeError as error:
  # Errors happen fairly often, DHT's are hard to read, just keep going
  time.sleep(2.0)
  # Print the values to the serial port
  temperature, humidity = dhtDevice.temperature, dhtDevice.humidity
  print("Temperature: {:.1f} °C  Humidity: {:.1f} %".format(temperature, humidity))

Solltet ihr den Sensor an einem anderen GPIO Pin als den von mir verwendetet GPIO17 verwenden, dann einfach die Zahl bei dht22gpiopin = 'D17' (D17) in den von euch verwendeten GPIO Pin ändern. Achtung hier wird nicht die PIN Nummer sonder der GPIO Name verwendet. GPIOPin 17 wäre Pin Nummer 11.

Nun geben wir dem Script noch das execute Recht.

chmod +x /usr/local/sbin/dht22.py

die Ausführung dann einfach:

dht22.py

Die Ausgabe sollte dann so aussehen:

Temperature: 23.6 °C  Humidity: 48.2 %

Adafruit DHT Python Libraries

Diese Lösung ist zwar deprecated, allerdings die mir bisher einzige bekannte Lösung die auf einem Raspberry Pi zero w funktioniert. Läuft auch auf dem Raspberry Pi 3 und zero w 2.

apt install python3 python3-pip -y
pip3 install --user Adafruit_DHT

das kleine folgende Script gibt dann die Sensorwerte aus:

dht22-adafruit.py

#!/usr/bin/python3
import Adafruit_DHT

gpiopin=17

humidity, temperature = Adafruit_DHT.read_retry(Adafruit_DHT.AM2302, gpiopin)
print("Temperature: {:.1f} °C  Humidity: {:.1f} %".format(temperature, humidity))

Falls ihr einen anderen GPIO Pin als den von mir verwendeten GPIO17 verwendet, einfach die Zahl hinter gpiopin=17 ändern. Nun geben wir dem Script noch das execute Recht.

chmod +x /usr/local/sbin/dht22-adafruit.py

die Ausführung dann einfach:

dht22-adafruit.py

Die Ausgabe sollte dann so aussehen:

Temperature: 23.2 °C  Humidity: 49.7 %

sollte es damit nicht klappen, am besten mit der Adafruit-Circuit Python Libraries Methode testen.

pigpiod und python Script

Falls pgpiod nicht installiert ist, einfach nachinstallieren:

apt install pigpiod python-pigpio python3-pigpio

nun brauchen wir noch ein Python Script um die Daten auszulesen

cd /usr/local/sbin
wget https://github.com/joan2937/pigpio/raw/master/EXAMPLES/Python/DHT22_AM2302_SENSOR/DHT22.py
chmod +x DHT22.py

nun müssen wir im Script noch den PIN ändern, an dem wir den DATA Source des Sensors angeschlossen haben. Bei uns der GPIO mit der ID 2:

DHT22.py

...

   # Intervals of about 2 seconds or less will eventually hang the DHT22.
   INTERVAL = 3

   pi = pigpio.pi()

   s = DHT22.sensor(pi, 4, LED=16, power=8)

   r = 0

   next_reading = time.time()
   
...

s = DHT22.sensor(pi, 2, LED=16, power=8) diese Zeile muss abgeändert werden. Nun können wir einen ersten Test starten:

DHT22.py

Die Ausgabe sieht dann so aus:

1 50.1 23.7 0.20 0 0 0 0
2 51.8 23.7 0.20 0 0 0 0
3 51.8 23.6 0.20 0 0 0 0
4 51.9 23.6 0.20 0 0 0 0
5 51.9 23.6 0.20 0 0 0 0
6 51.9 23.6 0.20 0 0 0 0
7 51.9 23.6 0.20 0 0 0 0
8 52.0 23.6 0.20 0 0 0 0
9 52.3 23.6 0.20 0 0 0 0
10 51.9 23.6 0.20 0 0 0 0
11 52.0 23.6 0.20 0 0 0 0
12 52.1 23.6 0.20 0 0 0 0
13 51.9 23.6 0.20 0 0 0 0
14 51.9 23.6 0.20 0 0 0 0

Das Programm führt kontinuierlich eine Messung durch und muss via CTRL + C beendet werden. Der Zweite Wert ist die Luftfeuchtigkeit und der Dritte die Temperatur.

Senden der Daten an MQTT Broker

Möchte man die Daten des DHT22 Sensors an einen MQTT Broker senden um sie dann zum Beispiel mit openHAB auszulesen, kann man dies mit einem Python Script machen Dafür muss man zu allererst noch die paho-mqtt library nach installieren:

apt install -y python3-paho-mqtt

# oder via pip3
pip3 install paho-mqtt

Das folgende Script liest dann die Sensor Daten (mittels der Adafruit-circuit Library) aus und sendet sie einmalig an den MQTT Broker.

Download hier möglich: https://github.com/alaub81/rpi_sensor_scripts/raw/main/dht22-mqtt.py

/usr/local/sbin/dht22-mqtt.py

#!/usr/bin/python3

# Import required Python libraries
import paho.mqtt.client as mqtt
import adafruit_dht
import time, board, ssl

# set the variables
dht22gpiopin='D17'
broker='FQDN / IP Adresse'
port=8883
publish_topic="house/pi-dht22"
clientid='python-mqtt-dht22'
username='mosquitto'
password='password'
insecure=True
qos=1
retain_message=True

# do the stuff
# Initial the dht device, with data pin connected to:
dhtboard = getattr(board, dht22gpiopin)

# Standard 
#dhtDevice = adafruit_dht.DHT22(dhtboard)

# you can pass DHT 22 use_pulseio=False if you don't want to use pulseio
# this may be necessary on the Pi zero but will not work in
# circuit python
dhtDevice = adafruit_dht.DHT22(dhtboard, use_pulseio=False)

#MQTT Connection
client=mqtt.Client(clientid)
client.username_pw_set(username, password)
client.tls_set(cert_reqs=ssl.CERT_NONE) #no client certificate needed
client.tls_insecure_set(insecure)
client.connect(broker, port)
client.loop_start()

try:
  temperature, humidity = dhtDevice.temperature, dhtDevice.humidity
  client.publish("{}/temperature".format(publish_topic),"{:.1f}".format(temperature),qos,retain_mes$
  client.publish("{}/humidity".format(publish_topic),"{}".format(humidity),qos,retain_message)
except RuntimeError as error:
  print(error.args[0])
  time.sleep(5)
  temperature, humidity = dhtDevice.temperature, dhtDevice.humidity
  client.publish("{}/temperature".format(publish_topic),"{:.1f}".format(temperature),qos,retain_mes$
  client.publish("{}/humidity".format(publish_topic),"{}".format(humidity),qos,retain_message)

time.sleep(1)
client.disconnect()
client.loop_stop()

Editiert das Scrip im oberen Bereich nach euren Bedürfnissen, dann gebt ihm das Execute Recht und startet es.


Möchte man das Ganze zum Beispiel alle Minute haben, kann man das Script einfach als cronjob laufen lassen.

/etc/cron.d/mqtt

# sends data from DHT22 Sensor to MQTT Broker
* * * * * root /usr/local/sbin/dht22-mqtt.py >/dev/null 2>&1

Adafruit_DHT Library

Für die alte Adafruit_DHT Library, zum Beispiel für den Raspberry Pi zero w:

Download hier möglich: https://github.com/alaub81/rpi_sensor_scripts/raw/main/dht22-mqtt-adafruit.py

/usr/local/sbin/dht22-mqtt-adafruit.py

#!/usr/bin/python3

# Import required Python libraries
import paho.mqtt.client as mqtt
import Adafruit_DHT
import time
import ssl

# set the variables
dht22gpiopin=17
broker='FQDN / IP ADRESS'
port=8883
publish_topic="house/pi4-dht22"
clientid='python-mqtt-dht22'
username='mosquitto'
password='password'
insecure=True
qos=1
retain_message=True

# do the stuff
#MQTT Connection
client=mqtt.Client(clientid)
client.username_pw_set(username, password)
client.tls_set(cert_reqs=ssl.CERT_NONE) #no client certificate needed
client.tls_insecure_set(insecure)
client.connect(broker, port)
client.loop_start()

humidity, temperature = Adafruit_DHT.read_retry(Adafruit_DHT.AM2302, dht22gpiopin)
client.publish("{}/temperature".format(publish_topic),"{:.1f}".format(temperature),qos,retain_message)
client.publish("{}/humidity".format(publish_topic),"{:.1f}".format(humidity),qos,retain_message)

time.sleep(1)
client.disconnect()
client.loop_stop()

DHT22 Homie MQTT Script

Möchtet ihr die ausgelesenen Daten direkt in eurem Smart Home (via Homie MQTT Convention) nutzen, dann schaut hier am besten mal rein:

Git Repository

Alle Skripte die zu den Raspberry Pi Sensoren gehören findet ihr in diesem Repository:

Quellen