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.
- 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.
- 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.
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.
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 2021-09-01 / Affiliate Links / Bilder von der Amazon Product Advertising API
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 :)
Moin Tony,
vielen Dank. Ich wollte nämlich gerne die Temperatur-, Luftfeuchtigkeitsverläufe, sowie die aktuellen Werte auf einer Webseite ausgeben. Habe bisher aber keine passende Lösung gefunden :/
Hallo Leon,
um die aktuellen Werte und Verläufe auf einer Webseite darzustellen benötigst du einen Webserver auf deinem Pi (Apache, nginx, etc). Man könnte entweder einen Python Skript (via Cronjob) nutzen und die Daten zyklisch auslesen und beispielsweise in einer SQLite Datenbank ablegen. Alternativ gibt es auch vorgefertigte Tools wie das rrdtool.
Das würde mich auch sehr interessieren!
Ich habe dazu im Web was gefunden, frei verfügbar für jeden. Allerdings derzeit noch für den BMP180-Sensor: http://www.raspberrypi-spy.co.uk/2015/06/basic-temperature-logging-to-the-internet-with-raspberry-pi/
Mit dem DHT11/22 klappt das Script aus mir unerfindliche Gründen nicht. Aber ich denke da gibt es hier sicherlich eine Lösung dafür ;-)
Hallo Tony,
ich habe eine Webseite mit Webcam. Mich interessiert auch eine Grafik. Ich habe momentan 2 x DHT22 angeschlossen und möchte eine Grafik von der innen und aussen Temperatur mit einbringen.
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.
Wer die Temperatur etc. loggen will sollte sich mal Volkszähler ansehen. Raspi Image gibt es.
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.
Der AM2302 ist der DHT22 aber mit Kabeln statt Pins. So wie ich das sehe.
http://docs.gadgetkeeper.com/pages/viewpage.action?pageId=7700673
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,
kann man diese anleitung auch für einen Banana Pi nutzen?
Gruß
MisterX
Sollte funktionieren (ungetestet) :)
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!
Hallo könnte mir jemand hier das php script geben welches die Daten auf einer Webseite anzeigt? Danke
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'”
Ergänze den folgenden mit der Zahl drei (für Python 3.7 aktuell) Befehl:
sudo python 3 setup.py install
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