Raspberry Pi

Raspberry Pi: Temperatur und Luftfeuchtigkeitssensor DHT22

Raspberry Pi DHT22

Ein gängiges Einsatzgebiet des Raspberry Pi ist die Erfassung der Temperatur und weiteren Wetterdaten in Form einer Wetterstation, eines Klimaloggers oder zur wetterabhängigen Steuerung von Komponenten. Mit dem Temperatursensor DHT22 bzw. DHT11 lässt sich mit dem Raspberry Pi die Temperatur und Luftfeuchtigkeit messen. Im Folgenden wird erklärt, wie man den Temperatur- und Luftfeuchtigkeitssensor DHT22 mit dem Raspberry Pi ansteuern und verwenden kann.

Temperatur und Luftfeuchtigkeitssensor DHT22

Gegenüber dem bisher vorgestellten 1-Wire Temperatursensor DS1820 kann man mit dem DHT22 einen Wert mehr erfassen – konkret die Temperatur und die Luftfeuchtigkeit der Umgebung. Neben dem DHT22 Sensor, auch bekannt als AM2302, gibt es das Vorgängermodell, den DHT11. Die beiden Sensor-Modelle unterscheiden sich grundlegend lediglich nur in der Messgenauigkeit. Der Temperatursensor DHT22 hat eine Temperatur-Messgenauigkeit von ±0,5°C und etwa 2% maximale Abweichungen bei der Luftfeuchtigkeit. Mit einer Abweichung von ±2°C und 5% bei Temperatur und Luftfeuchtigkeit ist die Genauigkeit beim DHT11 etwas schlechter. Inwieweit sich diese Auswirkung bemerkbar macht kann ich an dieser Stelle nicht sagen, da für dieses Tutorial der DHT22 verwendet wird. In diversen Diskussionen im Netz wird allerdings darauf hingewiesen, dass die Messgenauigkeit des DHT11 sehr ungenau sein soll, sodass ich empfehle den DHT22 zu nutzen.

DHT22 AM2302 Temperatursensor und Luftfeuchtigkeitssensor
535 Bewertungen
DHT22 AM2302 Temperatursensor und Luftfeuchtigkeitssensor
  • Der DHT22 ist ein zuverlässiger Sensor zur Ermittlung von Temperatur und Luftfeuchtigkeit.
  • Da der Sensor sowohl mit 3,3V als auch 5V betrieben werden kann, eignet er sich zum Anschluss an alle gängigen Boards wie RN-Control, Raspberry Pi und alle anderen Mikrocontroller.

Der DHT22 ist in Sachen Pins baugleich zum DHT11, sodass diese Anleitung für beide Sensoren genutzt werden kann. Der Temperatursensor verfügt über 4 Pins, wovon aber nur 3 verwendet bzw. benötigt werden. Der DHT22 kann theoretisch mit einer Spannung zwischen 3,3 und 5,5 Volt versorgt werden. Das digitale Signal, welches wir dann vom DHT22 auswerten, hat als High-Pegel die angelegte Betriebsspannung. Da die GPIO-Pins des Raspberry Pi nur 3,3 Volt vertragen versorgen wir den DHT22 mit 3,3. Zum Auslesen der Sensordaten benötigen wir lediglich einen GPIO Pin (Pin 2: DATA). Pin 3 des DHT22 wird in diesem Tutorial nicht belegt. Im Folgenden sind die Pins und deren Bedeutung des DHT22 bzw DHT11 zu betrachten.

DHT22 Pins

DHT22 Pins

  • Pin 1: VDD, Betriebsspannung 3,3 Volt
  • Pin 2: DATA, Datenleitung (an GPIO)
  • Pin 3: Null
  • Pin 4: GND, Masse

Schaltungsaufbau

Anhand der bisherigen Erläuterungen lässt sich der Schaltungsaufbau zur Ansteuerung des DHT22 mit dem Raspberry Pi bereits erahnen. Versorgt wird der Sensor mit 5 Volt des Raspberry Pi. Dazu verbinden wird Pin 1 des Sensors mit dem 3,3 Volt Pin (Pin 1) des Einplatinencomputers. Der GND Pin wird an den GND Pin des Pi (Pin 6) angeschlossen. Die Datenleitung des Sensors (Pin 2) wird an einen GPIO Pin deiner Wahl angesteckt. Hinzu kommt, dass zwischen die Datenleitung des DHT22 und die 5 Volt Versorgung ein 4,7 kOhm Pull-Up-Widerstand geschalten wird. Optional geht auch ein Widerstand mit einem Wert zwischen 4,7 kOhm und 10 kOhm. Das resultierende Schaltbild wird im Folgenden ersichtlich.

DHT22 an Raspberry Pi

DHT22 an Raspberry Pi

Raspberry Pi: DHT22 auslesen mit Python

Zum Ansteuern und Auslesen des Temperatur- und Luftfeuchtigkeitssensor DHT22 kann beispielsweise die Programmiersprache Python verwendet werden. Dafür nutzen wir die DHT Python Bibliothek von Adafruit. Bevor wir diese herunterladen brigen wir das System auf den neusten Stand und installieren, falls noch nicht vorher erledigt, wichtige Pakete.

sudo apt-get update
sudo apt-get install build-essential python-dev python-openssl

Anschließend können wir die Adafruit DHT-Bibliothek herunterladen und installieren.

git clone https://github.com/adafruit/Adafruit_Python_DHT.git
cd Adafruit_Python_DHT
sudo python setup.py install

Durch das Einbinden und nutzen der Adafruit DHT-Bibliothek können wir im eigenen Quellcode die Ansteuerung recht einfach realisieren. Für einen ersten Test kann die Temperatur und Luftfeuchtigkeit mit Hilfe des mitgelieferten Beispielprogramms der Adafruit Bibliothek genutzt werden. Dazu wechseln wir weiter in das Verzeichnis mit den Beispielskripten und führen die Datei AdafruitDHT.py mit entsprechenden Parametern aus.

cd examples
sudo ./AdafruitDHT.py 22 4

Dem Beispielskript übergeben wir insgesamt zwei Zahlen. Der erste Parameter beschreibt dabei die Art des DHT Sensors. In diesem Tutorial ist das der DHT22 Sensor, sprich die 22. Wer den DHT11 benutzt muss hier die 11 als ersten Parameter übergeben. Der zweite Parameter ist die Nummer des GPIO Pins, mit welchem die Datenleitung des DHT22 an den Raspberry Pi verbunden ist. In diesem Fall wird für diese Anleitung der GPIO Pin 4 (Pin 7) des Pi verwendet. Das Skript gibt anschließend die aktuelle Temperatur und Luftfeuchtigkeit aus.

DHT22 Adafruit Example

DHT22 Adafruit Example

Die Abfrage dauert rund 2 bis 3 Sekunden. Schnellere Abfrage-Intervalle funktionieren an dieser Stelle nicht.

Eigener Skript

Um den Temperatur und Luftfeuchtigkeitssensor DHT22 in einer eigenen Anwendung auszulesen kann die Adafruit Bibliothek gleichermaßen verwendet werden. Dazu erstellen wir mit dem Editor nano eine neue Datei.

nano dht22.py

In die Datei, hier beispielhaft angedeutet, fügen wir folgende Zeilen ein. Die Kommentare im Quellcode erklären die einzelnen Bedeutungen der Codezeilen. Mit den Variablen humidity und temperature kann anschließend weitergarbeitet werden.

# Adafruit Bibliothek importieren
import Adafruit_DHT


#Sensortyp und GPIO festlegen
sensor = Adafruit_DHT.DHT22
gpio = 4

# Daten auslesen
humidity, temperature = Adafruit_DHT.read_retry(sensor, gpio)

# Ausgabe
print 'Temperatur: {0:0.1f}*C Luftfeuchtigkeit: {1:0.1f}%'.format(temperature,humidity)

Letzte Aktualisierung am 1.09.2021 / Affiliate Links / Bilder von der Amazon Product Advertising API

Hinterlasse eine Antwort

Kommentare

  • Hallo, vielen Dank für dieses Tutorial! Könnten Sie vielleicht noch eine Ergänzung dazu schreiben? Ich würde nämlich gerne die Temperatur (und Luftfeuchtigkeits) Verläufe mit einer Grafik auf einer Webseite ausgeben (rrdtool, glaube ich). Könnten Sie dies vielleicht noch ergänzen?

    Vielen Dank im Voraus!

    • Hallo Lean,

      danke für dein Feedback und den Anstoß zur Weiterführung des Artikels. Gerne schau ich mir die Sache an und verfasse eine Ergänzung bzw. das Thema in einem weiteren Artikel :=) Mir schwebt da auch eine Lösung mit SQLite vor, anstatt dem rrdtool :)

  • Hey Tony,

    klasse Tutorial,

    nur bräuchte ich ein bisschen Hilfe bzw. habe ein paar fragen:

    was genau kann ich mit der dht22.py anfangen?
    Ich habe einen Apache-Webserver auf meinem raspberry und möchte gerne die Temperatur auslesen lassen und in der index.php anzeigen lassen. Hier meine temperature.php:

    so wollte ich erstmal, dass überhaupt etwas angezeigt wird. Aber es wird leider nichts angezeigt, es fehlt der wert vor “raumtemperatur”.

    Hast du eine Idee?

  • Hi Tony,

    tolle Idee wieder und erstmal Danke für den Artikel.
    Hast du Erfahrungen mit unterschiedlichen Sensoren? Ich habe bei amazon welche für 5€ gefunden un der von dir verlinkte kostete 10€. Um das Geld geht es mir nicht aber wäre trotzdem interessant in wie weit sich die unterscheiden. Noch günstigere Angebote kommen für mich nicht in Frage, da es sich dann meistens im Angebote aus China handelt mit langer Lieferzeit.

    • Hallo Daniel,

      bisher habe ich mal welche auf eBay (aus China und Deutschland) und bei Amazon bestellt. Qualitativ habe ich dabei keine Unterschiede festgestellt :) Mit der langen Lieferzeit aus China liegst du leider richtig… Sensoren oder andere Hardware bestelle ich dennoch auch gerne in China, wenn sich die Lieferzeit im Rahmen hält und die Sensoren für mein Projekt / Vorhaben nicht all zu sehr eilen.

    • An sich nicht verkehrt, aber der VZ läuft mit MySQL. Das ist bisschen too much für ein paar Sensorwerte, vor allem weil MySQL auf dem Pi fleißig Ressourcen zieht.

  • Hallo,
    Das Tutorial hat mir auch sehr weiter geholfen aber die Visualiserung auf einer Webseite fehlt irgendwie. Gibt es das schon bei euch neue erkentnisse??

    Vielen dank

    • Im Rahmen jetzt speziell zu diesem Tutorial noch nicht. Aber ich schau mich die Tage mal. Eventuell wäre auch Cayenne etwas für dich. Dieses System bildet eine umfassende Visualisierung :)

  • Ist da ein Fehler im Text oder in der Grafik? Der 4,7 kOhm Widerstand ist laut Text zwischen 5 V und Data Pin zu schalten, laut Grafik aber zwischen Pin 1 des Raspberry (3,3 Volt) und Data. Auch im Text steht die GPIO Pins vertragen keine 5 Volt. Also Fehler im Text?

  • Hallo,

    erstmal vorweg: Dein Beitrag ist klasse. Nur irgendwie klappt es bei mir nicht.
    Wenn ich den Test mache für

    cd examples
    sudo python3 AdafruitDHT.py 11 4

    erhalte ich nur folgende Meldung:
    Traceback (most recent call last):
    File “AdafruitDHT.py”, line 41, in
    humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
    File “usr/local/lib/python3.2/dist-packages/Adafruit_DHT-1.3.1-py3.2-linux-armv71.egg/Adafruit_DHT/common.py”, line 90, in read_retry…
    ……………
    ……………
    RuntimeError: Error accessing GPIO
    Das ist mein erster Versuch mit dem Raspberry pi – dementsprechend kenne ich mich noch nicht besonders aus.
    Ich habe den DHT11 sowie einen Raspberry pi 2 b
    Kann mir hier jemand helfen? Bin am verzweifeln :-(

    LG
    Timo

  • Kann mir jemand erklären wie man ein .py script schreiben kann, mit dem man die Werte des DHT22 in 2 .csv Dateien abspeichern kann? Diese werte sollen dann alle 10 min überschrieben werden. Eine Datei soll für Temperatur sein, eine andere für Luftfeuchtigkeit.

    • einfach den stdout in eine Datei pipen per cronjob
      python dht22.py > output.log

      das als cron anlegen und die Datei auf einem Webserver parsen…..

  • Hallo,
    danke für die Anleitung.
    Eine Frage, wie kann ich einen Temperaturwert (oder Luftfeuchte) weiterverarbeiten?
    Ich möchte zum beispiel wenn temp > 25 dann sollte ein anderer GPIO angeschaltet werden?
    Ich finde nirgends eine Erklärung wie ich an den einzelnen Wert des Sensors komme um den weiter zu Verarbeiten.

    Vielen Dank!

  • Schade, leider funktioniert das nicht.
    Ich erhalte im Terminal folgende Fehlermeldung:
    “Failed to get reading. Try again!”

    Bei Ausführung mit Thonny erhalte ich folgende Fehlermeldung:
    “Traceback (most recent call last):
    File “/home/pi/Adafruit_Python_DHT/examples/AdafruitDHT.py”, line 24, in
    import Adafruit_DHT
    ImportError: No module named ‘Adafruit_DHT'”

  • Leider will das bei mir in Kombination mit dem Unipi-Board nicht klappen? Was mache ich verkehrt?
    Die 5V und Ground sind extern angeschlossen (Unipi-Meanwell-Netzteil)
    erster Sensor ist mit 4,7K eingebunden – die Datenleitung an DI1
    zweiter Sensor ist mit 10K eingebunden – die Datenleitung an DI2

    das liefert evok bei Abfrage von rest/input/1 oder 2
    {“bitvalue”: 0, “glob_dev_id”: 0, “value”: 0, “circuit”: “1”, “time”: 1739720023, “debounce”: 0, “counter_mode”: false, “dev”: “input”}
    {“bitvalue”: 1, “glob_dev_id”: 0, “value”: 1, “circuit”: “2”, “time”: 2125174448, “debounce”: 0, “counter_mode”: false, “dev”: “input”}

    das sagt sudo ./AdafruitDHT.py 22 4 (auch bei pin 17 – das ist DI2, das selbe https://kb.unipi.technology/_media/files:products:unipi1:unipi_1_technical_documentation-en.pdf )

    “Failed to get reading. Try again!”

    • Hallo Juri,

      hast du den GND richtig verbunden (gemeinsamer GND)? Prüfe außerdem nochmal die Verkabelung, sowie das du den richtigen Pin als Argument übergibst. Hier musst du darauf achten, dass es ja verschiedene Nummerierungen (Pinnummer, GPIO-Nummer,wiringPi-Nummerierung) gibt.

  • Hallo

    Die Abfolge von “sudo apt-get update” bis hin zum Verzeichniswechsel “cd Adafruit_Python_DHT” hat funktioniert.

    Die Befehlszeile “sudo python setup.py install” schlägt bei mir fehl und wird mit folgender Fehlermeldung quittiert:
    Traceback (most recent call last):
    File “setup.py”, line 1, in
    from setuptools import setup, find_packages, Extension
    ImportError: No module named setuptools

    Es wäre nett, wenn mir jemand helfen könnte.

    Falls es von Hilfe ist, hier ein paar Zusatzinformationen:
    – Ich habe bisher keine Ahnung vom RaspberryPi und möchte ihn aktuell lediglich mit OctoPi in Verbindung mit einem 3D-Drucker verwenden und den Sensor DHT22 abfragen.
    – Hilfestellung deshalb bitte möglichst ausführlich für einen Dummi
    – Linux octopi 4.19.75-v71+ #1290
    – OctoPi version: 0.17.0

  • hallo Tony
    ich habe dasselbe problem wie Jürgen
    x@y:~/Adafruit_Python_DHT $ sudo python3 setup.py install
    Traceback (most recent call last):
    File “setup.py”, line 1, in
    from setuptools import setup, find_packages, Extension
    ModuleNotFoundError: No module named ‘setuptools’
    x@y:~/Adafruit_Python_DHT $

    installiert ist:
    x@y:~/Adafruit_Python_DHT $ python3
    Python 3.7.3 (default, Jan 22 2021, 20:04:44)
    [GCC 8.3.0] on linux

  • so geht’s bei verwendung von python3 (Raspberry Pi 2 Model B Rev 1.1)
    1. pip3 installieren
    2. sudo pip3 install adafruit-circuitpython-dht
    3. lokal sudo nano dht_simpletest.py erstellen und den code aus Adafruit_CircuitPython_DHT/examples/ kopieren
    4. DHT-Pin anpassen und ggf. use_pulseio=False verwenden