Das DHT22 ist ein preiswertes Sensormodul, dass uns Daten zur Umgebungstemperatur und zur Luftfeuchtigkeit liefert.
Der DHT22 Sensor
Dieser Sensor kommt meist in auf einer kleinen Platine in einem weißen Kunststoffgehäuse daher und besitzt vier Anschlusspins. Wenn der Sensor flach vor dir liegt sind diese Pins von links nach rechts so belegt:
- VCC (+5V oder +3,3V)
- DATA
- unbelegt
- GND
Daran kannst du schon erkennen, dass der Sensor weder mit I²C noch mit SPI kommuniziert. Er benutzt ein sog. 1-wire Protokoll bei dem er in festgelegten Abständen seine Messwerte als Datenblock über die Leitung schickt.
Dataframe
Der DHT22 sendet einen Dataframe von 40 Bit Länge, die sich wie folgt aufteilen.
Nach meinen Recherchen ist der Dataframe so aufgebaut.
| Byte | Bit | Bedeutung |
|---|---|---|
| 0 | 0-7 | Feuchtigkeit (High Byte |
| 1 | 8-15 | Feuchtigkeit (Low Byte) |
| 2 | 16-23 | Temperatur (High Byte) |
| 3 | 24-31 | Temperatur (LowByte) |
| 4 | 32-39 | Checksumme |
Schaltungsaufbau
Da der dritte Pin nicht belegt ist, kommen wir mit drei Jumperkabeln aus. VCC wird mit 3,3V aus dem Raspberry Pi gespeist. Der Sensor verkraftet auch 5V. Allerdings kommen die nachher über DATA wieder in den Pi zurück. Das verkraften die GPIO Pins des Raspberry Pi 5 aber nicht. Daher achte am Raspi darauf, immer nur 3,3V in den DHT22 zu geben. Den DATA Pin schließen wir an GPIO 4 an, GND an einen der Masse Pins am Board. Ich benutze den direkt neben dem DATA Pin.

Du wirst im Netz vielleicht Schaltpläne finden, die einen 5-10kΩ Pull-Up Widerstand enthalten. Dieser ist notwendig, wenn die Kabellänge sehr lang ist (im Meterbereich) oder größere Funkstörungen in der Umgebung des Sensors bestehen. Ich habe ihn für dieses Beispiel weggelassen. Es gibt auch Bauformen bei denen das DHT22 Modul auf einer weiteren Platine sitzt, die nur drei Pins herausführt, dort ist wahrscheinlich auch ein Widerstand direkt verbaut.

Projekt einrichten
Um den Sensor in Python auslesen zu können, richte ich zunächst ein Projektverzeichnis mit uv ein. Unter trixie wird das apt Package liblgpio-dev benötigt, das ich installiere. Dazu kommen noch die projektbezogenen Dependencies adafruit-circuitpython-dht und lgpio. Ersteres kommuniziert mit dem Sensor und stellt uns die empfangenen Messwerte zur Verfügung, sie baut auf lgpio auf.
mkdir dht22
cd dht22
uv init .
sudo apt install -y liblgpio-dev
uv add adafruit-circuitpython-dht lgpioProgrammcode
Das Pythonprogramm ist dank adafruit-circuitpython-dht relativ simpel. Es liest einfach alle zwei Sekunden neue Messwerte vom Sensor und gibt sie aus. Du findest es auch im Repo
import adafruit_dht
import time
import board
def main():
dht_device = adafruit_dht.DHT22(board.D4)
while True:
try:
temperatur = dht_device.temperature
feuchte = dht_device.humidity
print("🌡{:.1f}°C - 💧 {}%".format(temperatur,feuchte))
except RuntimeError as err:
print(err.args[0])
time.sleep(2.0)
if __name__ == "__main__":
main()
In der Zeile dht_device = adafruit_dht.DHT22(board.D4) wird auch der Pin für die Datenleitung festgelegt. Zum Test stelle ich den gesamten Aufbau auf meinen Balkon. Es ist Tauwetter, das erklärt die Luftfeuchtigkeit.

Übertaktung
Zum Abschluss möchte ich sehen, wie die sich Kommunikation zum Sensor bei einem höheren Takt des SoC verhält.Dazu konfiguriere ich in der /boot/firmware/config.txt den Takt auf 3100MHz um.
#Overclocking
arm_freq=3100
over_voltage=8
Überraschenderweise werden auch dann noch problemlos Daten vom Sensor empfangen.

Fazit
Der DHT22 ist ein Sensormodul für Temperatur und Luftfeuchtigkeit, dass sehr einfach zu verdrahten und zu verwenden ist.