Raspberry Pi DHT22 Temperatur Sensor
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:
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
- https://learn.adafruit.com/circuitpython-on-raspberrypi-linux/installing-circuitpython-on-raspberry-pi
- https://learn.adafruit.com/dht-humidity-sensing-on-raspberry-pi-with-gdocs-logging/python-setup
- https://buyzero.de/blogs/news/tutorial-dht22-dht11-und-am2302-temperatursensor-feuchtigkeitsensor-am-raspberry-pi-anschliessen-und-ansteuern
- https://www.raspberrypi.org/documentation/usage/gpio/