Tutorial DHT22, DHT11 und AM2302 Temperatursensor / Feuchtigkeitsensor am Raspberry Pi anschließen und ansteuern

Geposted von Maximilian Batz am

Einleitung

Die Sensoren DHT11, DHT22 und AM2302 sind drei Varianten digitaler Temperatur- und Feuchtigkeitssensoren.

Der große Vorteil: diese Sensoren sind recht kostengünstig, und man benötigt nicht viele Komponenten um sie mit einem Raspberry Pi anzusteuern. Sie sind digital, d.h. es ist kein Analogkonverter und keine spezielle Kalibration nötig um sie auszulesen. Damit sind sie perfekt für den Einstieg mit Sensoren am Pi.

Die Nachteile dieser Sensoren möchte ich aber auch kurz anreißen:

  • relativ langsam ( Abfragerate empfohlen jede dritte Sekunde bei DHT22)
  • Sensor kann "abstürzen" bzw. "einfrieren", und muss dann vom Strom genommen werden für einen Neustart
  • Protokoll zum Sensor ist timing-sensitiv und spezifisch nur für diese Sensoren

Ich stelle hier die Unterschiede der drei Varianten, die Anbindung und das Auslesen der Sensoren mit zwei verschiedenen Methoden vor. Am Ende sehen wir auf der Kommandozeile die Werte, die der Sensor im Moment ermittelt. Und es gibt von mir noch einen Spezial-Tipp, wie man den Sensor gleich testen kann :-)

Die drei Varianten

links der DHT11, rechts der DHT22. Foto: lady ada  / Adafruit, CC-BY-SA

 

DHT11

  • besonders kostengünstig
  • 3 - 5 V Spannungsversorgung und I/O
  • 2,5 mA Stromaufnahme
  • 20 bis 80 % Luftfeuchtigkeit-Messbereich, mit 5 % Genauigkeit
  • 0 bis 50° Temperatur-Messbereich, mit +- 2°C Genauigkeit
  • maximal 1 Hz Sampling Rate ( 1 x pro Sekunde)
  • Abmessungen: 15,5 mm x 12 mm x 5,5 mm (ohne Pins)
  • 4 pins mit 0.1'' Abstand (geeignet für Breadboards)

Pinbelegung: siehe DHT22 (identisch).

DHT22

  • kostengünstig
  • 3 - 5 V Spannungsversorgung und I/O
  • 2,5 mA Stromaufnahme
  • 0 bis 100 % Luftfeuchtigkeit-Messbereich, mit 2 bis 5 % Genauigkeit
  • -40 bis 80° Temperatur-Messbereich, mit +- 0,5°C Genauigkeit
  • maximal 0.5 Hz Sampling Rate ( einmal jede zweite Sekunde)
  • Abmessungen: 15,1 mm x 25 mm x 7,7 mm (ohne Pins)
  • 4 pins mit 0.1'' Abstand (geeignet für Breadboards)

Pinbelegung:

(Sensor von vorne betrachtet, Seite mit dem Lufteinlassgitter)

Der dritte Pin von links gezählt (zwischen DATA und GND)  ist nicht belegt.

AM2302

Foto: Adafruit

Der AM2302 ist eine Version des DHT22 mit Anschlusskabeln statt Pins in einem großen Plastikgehäuse, mit Loch zum montieren.  Es gelten die gleichen Spezifikationen wie beim DHT22.

Kabelbelegung:

  • rot:                3 - 5 V Spannungsversorgung (Pluspol)
  • gelb:                Daten
  • schwarz: Erde / Ground / Minuspol

Die 3 Kabel sind 23 cm lang (9''). Sensorabmessungen (ohne Kabel): 27 mm x 58,75 mm x 13,30 mm

Diese Sensorvariante enthält bereits einen 5,1 K Pullup-Widerstand zwischen Plus und Daten, daher muss kein weiterer Widerstand hinzugefügt werden (siehe unten).

Welchen Sensor wählen?

Zum Verbauen ist die Variante AM2302 vermutlich die einfachste und praktischste. Für das Experimentieren mit dem Breadboard empfehle ich den DHT22 oder den DHT11, wenn es besonders günstig sein soll und die Genauigkeit nicht so wichtig ist.

 

DHT22 Bundles bei buyzero

Wir bieten in unserem Onlineshop zwei praktische Bundles - einmal mit Pi 3B+ und Zubehör im Lieferumfang, einmal das Basisset mit Breadboard (beispielsweise um den DHT22 an einen Pi Zero WH anzuschließen).

zum Online Shop: DHT 22 Pi 3B+ Full Bundle mit Breadboard 

zum Online Shop: DHT22 Breadboard Bundle

 Anschluss am Pi

Die Sensoren können zwar mit bis zu 5 V Eingangsspannung umgehen, nutzen diese aber dann auch am digitalen Ausgang. Der Pi kann an seinen GPIO Eingängen nur mit 3.3V (max 3.6 V) Spannung umgehen. Daher dürfen wir diese Sensoren für den Pi nur mit 3,3V Spannungsversorgung anschließen. Die 5 V Option ist eher für den Arduino interessant.

Im Folgenden beschreibe ich wie man den Raspberry Pi mit dem DHT22 verbindet. Der Aufbau ist für den DHT11 identisch, sie unterscheiden sich nur später in der Softwareansteuerung. Der Anschluss des AM2303 ist ebenso gleich (er wird als DHT22 angesteuert), allerdings wird der Pullup Widerstand weggelassen.

In dem Bild sind sowohl der Anschluss auf dem Breadboard, als auch ein Übersichtsdiagramm dargestellt.

Wichtig: Ich empfehle diese Anschlüsse bei ausgeschaltetem Pi, mit abgetrenntem 5 V Netzteil vorzunehmen - um die Komponenten vor Schäden zu schützen. Die GPIO Pins am Pi sind besonders empfindlich, und sollten beispielsweise nicht gegen 5 V kurzgeschlossen werden, da sie nur 3,3V tolerieren. GPIO steht übrigens für General Purpose Input Output.

Kurze Einführung in das Breadboard

(Für Einsteiger relevant, die noch nie mit einem Breadboard gearbeitet haben)

Das Breadboard hilft, Schaltungen schnell und mit wechselbaren Anschlüssen, Widerständen, etc. aufzubauen, bis man zufrieden ist und die Schaltung "fester" macht (bspw. indem man eine Lochrasterplatine nimmt und die Komponenten einlötet, eine Platine designed, u.s.w.). Für Experimente mit dem Pi und Elektronikkomponenten, bspw. um LEDs blinken zu lassen, verschiedene Sensoren anzusteuern, etc. ist das Breadboard optimal geeignet.

Das Breadboard verfügt über vier Bereiche, zwei davon zur Spannungsversorgung gedacht (oben und unten, hier mit durchgezogenen Linien markiert), und zwei Bereiche für Komponenten in der Mitte (mit Buchstaben A-E und F-J markiert) .

Das Besondere dabei ist, dass die einzelnen Steckplätze miteinander auf eine spezielle Art und Weise verbunden sind. Bei den Bereichen der Spannungsversorgung sind jeweils alle Pins entlang der Linie / horizontal miteinander verbunden. (siehe Bild, schwarze Linien illustrieren was alles verbunden ist).

D.h. ich stecke meine 3,3V Spannungsversorgung vom Pi an einen der Pins entlang der blauen Linie (egal welchen - aber beispielsweise den ersten von links), und alle anderen entlang der Linie sind auch auf 3,3V Spannung.

Genauso mache ich es mit GND (Erde), aber ich stecke ihn hier in einen Pin entlang der schwarzen Linie "darüber" - sonst gibt es gleich einen Kurzschluss! Alle Pins entlang der schwarzen Linie sind jetzt auch auf Erdpotential / GND.

Auf der gegenüberliegenden Seite des Breadboards befindet sich ein zweiter Spannungsversorgungsbereich. Er ist vom ersten unabhängig, könnte also zum Beispiel für 5 V vom Pi verwendet werden. Oder wir können ihn mit einem male/male Jumperkabel an den ersten Bereich anschließen, und damit auf das gleiche Potential bringen. Oder er könnte dazu dienen mehrere Komponenten entlang einer Linie miteinander zu verbinden (bspw. I2C, ...). Wichtig ist, dass die Verbindung hier auch horizontal ist, wie meine Illustration es andeutet.

Die Pins im Komponentenbereich des Breadboards sind hingegen vertikal miteinander verbunden. Auch hier ist das Breadboard zweigeteilt: die Pins A,B,C,D,E liegen jeweils auf einer Verbindung, und F,G,H,I und J ebenso.

Der Sensor ist im Bild etwas aus dem Breadboard herausgezogen worden, für eine gute Anschlussqualität empfiehlt es sich, ihn bis auf Anschlag hereinzuschieben.

Ich stecke den DHT-22 Sensor also mit seinen vier Pins horizontal ein, so dass ich mit jedem Pin Jumperkabel individuell verbinden kann. Würde ich den Sensor stattdessen vertikal einstecken (bspw. in 5 A B C D E), würden alle Pins vom Sensor miteinander kurzgeschlossen werden.

Jumper zum Pi

Von hier aus ist es keine große Hexerei mehr. Wie beschrieben wird der linke untere GPIO Pin des Pi (links in der unteren Reihe direkt über dem WLAN-Modul mit dem Raspberry Pi Logo) an die 3,3V "Schiene" des Breadboards angeschlossen. Ich benutze dazu ein female auf male Jumperkabel, da der Pi "männliche" Pins hat, und das Breadboard "weibliche" (zum Einstecken).

Die 3,3V Schiene wird mit einem weiteren Jumperkabel an den VCC Pin des Sensors angeschlossen (bspw. wenn der VCC Pin des Sensors in C6 steckt, stecke ich den Jumper in E6).

GND wird an den 3 Pin oben von links am GPIO Port des Pi's, und in die GND Schiene gesteckt. Ein weiteres Jumperkabel bringt das Erdpotential (GND) zum Sensor - das GND Beinchen des Sensors steckt in meinem Fall in C9, und das Jumperkabel entsprechend in E9.

Der Datenpin des Sensors ist C7. Ich stecke hier ein gelbes Jumperkabel in D7, und dann in den zweiten Pin unten von links in der GPIO Leiste des Pi's. Das ist ein GPIO Pin, mit der Broadcom Nummer (BCM) 2. Es ist wichtig diese Nummer für die Ansteuerung des Sensors zu wissen.

Wenn man hier für die Daten am Pi einen anderen GPIO Pin wählen möchte (man kann übrigens auch mehrere Sensoren parallel anschließen! Aber jeder braucht seinen eigenen Daten-Pin), sollte man "Rasberry Pi GPIO Pinout" suchen, und sich informieren welche Broadcom Nummer der gewählte Pin hat, und dass es tatsächlich ein GPIO Pin ist.

Der Pullup Widerstand

Wie bereits beim AM2303 erwähnt wird für den DHT22 und den DHT11 ein Pullup-Widerstand benötigt. Dieser Widerstand sorgt dafür, dass die Datenleitung nicht "floated" (d.h. auf einem undefinierten Zustand ist), sondern entweder auf +3,3V oder auf GND / 0 V (der Sensor zieht die Leitung zum kommunizieren auf GND, bzw. die Datenleitung wird durch den Pi auf GND / 0 V gezogen um die Auslesung zu starten). Im AM2303 ist dieser Widerstand bereits eingebaut, daher trifft dieser Abschnitt auf ihn nicht zu.

Üblicherweise sind Pullupwiderstände im Bereich von 10 kilo-Ohm. Falls der Sensor das Beinchen auf Ground zieht, entsteht ein Stromkreis, und Strom fließt von der Versorgungsspannung ab - durch einen relativ hohen Widerstandswert wird der unnötige Verlust hier in diesem Fall minimiert (U = R*I, wenn der Widerstand R hoch ist, ist der Strom I klein).

Das eine Beinchen des Widerstandes stecke ich dazu in die 3,3V Schiene - in einen beliebigen Steckplatz dort. Das andere Beinchen des Widerstandes stecke ich in E7, da der Datenpin des Sensors bei mir auf C7 steckt, und daher in einer vertikalen Linie fortgesetzt gedacht werden muss.

Damit ist der Sensor angeschlossen, und wir können uns an die Softwareseite machen.

DHT22 Sensor ansteuern

Die folgenden Ausführungen gelten natürlich auch sinngemäß für den DHT11 und den AM2302.

Grundlagen: Protokoll

Der Raspberry Pi unterstützt verschiedene Kommunikations- und Schnittstellen-Protokolle in Hardware, bspw. UART ("serielle Schnittstelle"), SPI, I2C.

Es gibt auch etwas, das sich "Dallas 1-Wire" nennt - hier wird die gleiche Leitung für Spannungsversorgung und Daten genutzt. Üblicherweise würde man unter 1-Wire Schnittstelle diese Dallas 1-Wire Schnittstelle verstehen.

Der Hersteller des Sensors sagt im Datenblatt spezifisch, dass es ein selbtdesigntes "1-Wire" Protokoll ist, das nicht mit dem Dallas 1-Wire kompatibel ist.

Daher brauchen wir einen speziellen Treiber, und betreiben sogenanntes "Bit-Banging" vom Pi aus - wir timen in Software, statt in Hardware. Das macht das ganze etwas anfälliger für Kommunikationsstörungen, und Softwareseitig etwas aufwändiger, aber deutlich flexibler.

Grundlagen: GPIO Pins

Abbildung CC-BY-SA: https://www.raspberrypi.org/documentation/usage/gpio/

Nicht alle 40 Pins am Pi sind GPIO Pins. Es gibt zusätzlich Spannungs-Versorgungs-Pins (5 V und 3,3V sowie GND), und  die ID EEPROM pins (für HATs reserviert). Das Schema oben zeigt diese Pins mit ihren Broadcom (BCM) GPIO Nummern.

Die GPIO Pins am Raspberry Pi können per Software auf verschiedene Funktionen eingestellt werden. Einerseits kann man sie als Eingabe Pins verwenden, oder als Ausgabepins, oder für spezielle Funktionen, die je nach Pin unterschiedlich sind.

Da wir den Pin nicht für spezielle Funktionen (wie UART, SPI, I2C etc) verwenden, sondern als GPIO Pin, ist es prinzipiell egal welchen der GPIO Pins man am Pi nutzt. Ich habe mich für den mit BCM 2 bezeichneten Pin entschieden, da er direkt neben der Spannungsversorgung liegt, und das ganze Kabelgewirr am Pi dann übersichtlicher wird.

Wir arbeiten mit digitaler Logik, die durch analoge Spannungen dargestellt wird. Dabei stehen Spannungsbereiche in der Nähe von 0 V (bspw 0 - 0,8 V) für eine logische 0 (oder auch "low"), und Spannungsbereiche in der Nähe von 3,3 V (bspw. 2.0 - 3,3 V) für eine logische 1 (oder auch "high"). Dazwischen ist der Zustand undefiniert.

Grundlagen: Ansteuerung DHT22 "behind the scenes"

Der Pullup Widerstand zieht den Input unseres DHT22 normalerweise auf VCC (+3,3V). D.h. am Pi UND am Sensor liegt ständig eine logische 1 an.

Um den Kommunikationsprozess mit dem Sensor zu starten zieht der Pi den Pin für eine bestimmte Zeit auf GND, und anschließend wieder hoch.

Der Sensor wacht aus seinem Stromsparmodus auf, und führt eine Messung durch. Anschließend sendet der Sensor 40 bit Daten, in denen die Luftfeuchtigkeit und die Temperatur kodiert sind, und geht wieder in den Schlafmodus. Dabei wechselt er periodisch zwischen High und Low. Die Daten sind hier durch die Länge der  Periode in der der Sensor VCC an den Datenpin anlegt definiert. 26-28 microsec Länge entspricht einer 0, und 70 microsec Länge einer 1. Daher ist ein präzises Timing sehr wichtig um diesen Sensor auszulesen, was daher nicht aus beispielsweise Python oder Java direkt erfolgen kann, da diese Sprachen nicht nahe genug an der CPU ausgeführt werden. Es wird kompilierter C Code benötigt.

Der Sensor DHT22 sollte nicht öfter als alle drei Sekunden abgefragt werden, da er sich sonst aufhängen kann. Wenn er aufgehängt ist und nicht mehr antwortet, kann man den VCC Jumper aus dem Breadboard kurz herausziehen, und wieder einsetzen um ihn zurückzusetzen.

Den DHT11 kann man alle zwei Sekunden abfragen.

Glücklicherweise müssen wir keinen eigenen C Code schreiben, sondern können eine der zwei folgenden Methoden anwenden:

Adafruit Methode

Adafruit hat einen Open Source Treiber für die Sensoren entwickelt. Wie oben bereits erwähnt ist der Grundcode in C, da der Sensor sehr genaues Timing erfordert und wir das Timing in Software durchführen müssen. Adafruit stellt auf Basis dieses C Codes eine Pythonschnittstelle zur Verfügung, über die der Sensor in eigenen Anwendungen eingebunden werden kann.

Führe die folgenden Kommandos in der Konsole aus:

sudo apt-get update

               sudo apt-get install build-essential python-dev python-openssl git-core

               cd ~

Die ersten zwei Kommandos installieren benötigte Pakete, das zweite Kommando wechselt in das Heimverzeichnis des momentanen Nutzers (vermutlich der Nutzer "pi")

git clone https://github.com/adafruit/Adafruit_Python_DHT.git

cd Adafruit_Python_DHT

Das kopiert den Code von Adafruit in das Verzeichnis Adafruit_Python_DHT, in das wir auch gleich wechseln.

sudo python setup.py install

Das kompiliert den Code und installiert ihn so, dass alle Python Programme auf das Modul zugreifen können.

Bild: ein kleiner Ausschnitt aus der Ausgabe des Kommandos.

Wichtiger Hinweis: Das Timing ist Pi-Modell spezifisch. D.h. man kann die selbe SD Karte potentiell nicht in Pi 1 und Pi 3 verwenden um den Sensor anzusteuern! Daher kompilieren wir den Code lieber gesondert für jedes Pi Modell auf dem er zum Einsatz kommt.

Im Ordner examples befindet sich ein Beispielskript, das den C Code ansteuert. Damit können wir jetzt dann gleich starten. Das zweite Kommando erwartet zuerst den Typ des Sensors (11, 22 oder 2302 für jeweils DHT11, DHT22 und AM2302) und als zweiten Parameter den GPIO Pin des Pis als Broadcom BCM Nummer. Ich habe beispielsweise den DHT22 and den BCM Pin Nummer 2 angeschlossen, daher:

cd examples

sudo ./AdafruitDHT.py 22 2

So schaut die Ausgabe des Skriptes aus:

Temp=21.0* Humidity=59.8%

Wenn ich zum Beispiel den falschen Pin angegeben hätte, würde das Skript wesentlich länger warten, und dann folgendes ausgeben:

Failed to get reading. Try again!

Das ist an dieser Stelle auch schon alles - man kann sich den Code des Skriptes anschauen, und dann eigenen Python Code schreiben, zum Beispiel um die Temperatur und Luftfeuchtigkeit zu loggen. Oder einfach das Beispielskript manuell aufrufen wenn man den Sensor auslesen möchte.

pigpio Methode

pigpio ist eine Bibliothek für den Pi die Zugriff auf den GPIO Port ermöglicht. Dabei erlaubt pigpio ein ziemlich präzises Timing, PWM (Pulse Width Modulation) und vieles mehr. Auch pigpio nutzt Broadcom Nummern zum Zugriff auf die GPIO Pins.

pigpio kann als Daemon konstant im Hintergrund laufen, und den Zugriff auf die GPIO Pins verwalten. Er erlaubt den Zugriff auf die Pins via Sockets und Pipes. Eine C Bibliothek und ein Python Modul stehen zur Verfügung um mit dem pigpio daemon zu kommunizieren.

pigpio sollte auf aktuellen Raspbian Versionen bereits dabei sein. Falls nicht, kann man es so installieren:

               sudo apt-get update

               sudo apt-get install pigpio

Anschließend starten wir den pigpio daemon, pigpiod:

               sudo pigpiod

Der Daemon muss als root gestartet werden, Programme können aber anschließend von beliebigen Nutzern aus auf pigpio zur Kontrolle auf die GPIO Pins zugreifen.

Wir können wie folgt verifizieren dass der Daemon läuft:

               ps aux | grep pigpio

In der ersten Zeile sehen wir, dass der Prozess pigpiod läuft. (Die zweite Zeile ist das von uns aufgerufene Kommando).

Joan, der Autor der mächtigen pigpio Anwendung hat auch Beispiele in Python für den Zugriff auf den DHT22 geschrieben. Die Timing-sensitiven Anteile werden komplett vom pigpio - Daemon übernommen, in Python sagen wir der pigpio Bibliothek nur was sie tun hat.

cd ~

               mkdir DHT22

               cd DHT22

               wget https://github.com/joan2937/pigpio/raw/master/EXAMPLES/Python/DHT22_AM2302_SENSOR/DHT22.py

Wir müssen die Datei noch bearbeiten um den korrekten Daten-Pin einzustellen:

               nano DHT22.py

Suche die Zeile 257 (relativ weit unten), die wie folgt aussieht:

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

Ersetze 22 durch 2 bzw. die GPIO Broadcom Nummer des GPIO Pins an der du den Sensor angeschlossen hast.

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

Hinweis: der Code erlaubt hier auch noch bei jedem Auslesevorgang zusätzlich eine LED blinken zu lassen, sowie nach einigen fehlgeschlagenen Ausleseversuchen den Sensor neuzustarten indem er von einem GPIO Pin aus mit Strom versorgt wird, statt von dem +3.3V Pin. Diese weitergehenden Möglichkeiten habe ich in diesem Artikel nicht verwendet, da es den Rahmen sprengen würde.

Wir speichern mittels Ctrl + O, Enter, Ctrl + X, und führen das Programm aus:

python3 DHT22.py

Wie man sieht gibt dieses Programm kontinuierlich Messwerte aus.

Die erste Zahl ist eine fortlaufende Nummer der Messung, die zweite Zahl die Luftfeuchtigkeit (56,6 %). Die dritte Zahl die Temperatur ( 22,0° C). Die dritte ist die "Staleness" der Messung (0.19), die vierte Bad Checksum Counter (0), die fünfte Short Message Counter (0), die sechste Missing Message Counter (0), die siebte Sensor Resets (0). Wirklich wichtig sind natürlich nur Temperatur und Luftfeuchtigkeit - die anderen Parameter dienen zum Debugging.

Sensor testen

OK, wir wissen jetzt wie man den Sensor anschließt und ansteuert - wie kann man Veränderungen herbeiführen?

Ein einfacher Trick ist den Sensor anzufassen und zu halten - dazu habe ich meinen Daumen vorne auf ihn gelegt, und meinen Zeigefinger hinten. Quasi wie als ob man ihn aus dem Breadboard herausziehen würde:

Eine andere Idee ist, eine Tischlampe mit Glühbirne direkt vor dem Sensor einzuschalten und damit den Sensor künstlich zu beheizen. Die Glühbirne darf natürlich keine Energiesparbirne sein :-)

Ich hoffe euch hat der Artikel gefallen und unterstützt euch beim Einstieg mit Sensoren am Raspberry Pi, und speziell mit dem DHT22.

Quellen

Bei der Erstellung dieses Artikels dienten mir folgende Grundlagen, ich danke herzlich:

 

DHT22 Bundles bei buyzero

Wir bieten in unserem Onlineshop zwei praktische Bundles - einmal mit Pi 3B+ und Zubehör im Lieferumfang, einmal das Basisset mit Breadboard (beispielsweise um den DHT22 an einen Pi Zero WH anzuschließen).

zum Online Shop: DHT 22 Pi 3B+ Full Bundle mit Breadboard 

zum Online Shop: DHT22 Breadboard Bundle

0 Kommentare

Hinterlassen Sie einen Kommentar

Bitte beachten Sie, dass Kommentare vor der Veröffentlichung freigegeben werden müssen