Temperatursensor DHT22 am Raspberry Pi
Sehr oft wird der relativ günstige Sensor DHT22 (oder auch AM2302) eingesetzt, um am Raspberry Pi Temperaturen und die Luftfeuchtigkeit auszulesen. Wie dieser angeschlossen wird und welche Software dazu verwendet werden kann, möchte ich in diesem Beitrag beschreiben.
Material
Für unser Projekt benötigen wir folgendes:
- Sensor DHT22 (z.B. hier halbwegs günstig)
- Widerstand 10 kΩ
- Anschlusskabel (z.B. solche)
- natürlich einen Raspberry Pi inkl. Zubehör
Schritt 1: Sensor anschließen
Nachdem wir den Raspberry Pi ordnungsgemäß mit
shutdown -h now
heruntergefahren und von der Spannungsversorgung getrennt haben,
können wir den DHT22-Sensor nach folgenden Schema anschließen:
Erläuterung:
Pin eins des Sensors wird mit einem freien 3,3V-PIN des Raspberrys verbunden, Pin zwei mit einem
GPIO-PIN (in unserem Beispiel GPIO 17, was dem PIN 11 entspricht). Der dritte Pin bleibt
ungenutzt und den vierten verbinden wir mit einem freien Ground-PIN (beispielsweise PIN 9 des Raspberrys).
Zwischen den Pins eins und zwei des Sensors verlöten wir zudem den 10 kΩ Widerstand wie im Bild gezeigt.
Schritt 2: wiringPi
Wir benötigen für diesen Artikel die winringPi-Bibliothek. Die Installation und Verwendung wird in diesem Beitrag erläutert.
Achtung! Die wiringPi-Library nutzt eine andere Nummerierung der GPIO-Ports.
Daher wird in unserem Beispiel aus dem Raspberry-GPIO-Port 17 der wiringPi-Port 0.
Eine Übersicht der Pin-Belegungen der verschiedenen Raspberry-Versionen zeigt dieser Beitrag.
Schritt 3: lol_dht22
Nun installieren wir auf der Himbeere ein Script, welches den Sensor abfragt und die
übermittelten Werte ausgibt. Neben vielen anderen Verfügbaren nutzen wir in diesem
Projekt „lol_dht22„. Zur Installation bedarf es weniger Schritte:
git clone https://github.com/technion/lol_dht22 cd lol_dht22 ./configure make
Das Script kann nun mittels (0=wiringPi-Port)
./loldht 0
gestartet werden und gibt nach einer kurzen Zeit die Datenwerte des DHT22 aus:
Raspberry Pi wiringPi DHT22 reader www.lolware.net Data not good, skip Humidity = 80.20 % Temperature = 17.90 *C
Sollte gelegentlich die Zeile „Data not good, skip“ erscheinen, ist das nicht weiter tragisch
und kann ignoriert werden. Zu beachten ist lediglich, dass der Sensor nicht öfter als alle
2 Sekunden ausgelesen werden kann.
Schritt 4: openHAB
Eine Einbindung des Sensors in das Hausautomatisierungssystem openHAB
habe ich in diesem Beitrag beschrieben.
Aufgrund dessen, dass es hin und wieder zu „Ausreißern“ bei den Messergebnissen kommt,
habe ich ein kleines Script gebastelt, um solche fehlerhaften Messergebnisse auszusortieren.
#!/bin/bash #Scriptname: /scripts/dht22.sh #Einstellungen MINTEMP=0 MAXTEMP=50 MINHUM=0 MAXHUM=100 ########################################### if [ ! -d /tmp/dht22vars/ ]; then mkdir /tmp/dht22vars/ fi GPIO=$2 INPUT=$(/usr/bin/ssh root@192.168.1.$1 "/scripts/lol_dht22/loldht $GPIO |grep "Temperature"") HUM=$(echo $INPUT|cut -d " " -f3) TEMP=$(echo $INPUT|cut -d " " -f7) if [ "$3" = "HUM" ]; then if [ $(echo "if (${HUM} > ${MAXHUM}) 1 else 0" | bc) -eq 1 -o $(echo "if (${HUM} < ${MINHUM}) 1 else 0" | bc) -eq 1 ]; then if [ -f /tmp/dht22vars/dht_$1_gpio$2_hum.txt ]; then cat /tmp/dht22vars/dht_$1_gpio$2_hum.txt fi else echo $HUM echo $HUM > /tmp/dht22vars/dht_$1_gpio$2_hum.txt fi fi if [ "$3" = "TEMP" ]; then if [ $(echo "if (${TEMP} > ${MAXTEMP}) 1 else 0" | bc) -eq 1 -o $(echo "if (${TEMP} < ${MINTEMP}) 1 else 0" | bc) -eq 1 ]; then if [ -f /tmp/dht22vars/dht_$1_gpio$2_temp.txt ]; then cat /tmp/dht22vars/dht_$1_gpio$2_temp.txt fi else echo $TEMP echo $TEMP > /tmp/dht22vars/dht_$1_gpio$2_temp.txt fi fi
Dieses Script liefert nur dann die Messwerte aus, wenn sie „MIN“ nicht unter- und „MAX“ nicht überschreiten. Sonst wird der vorherige Wert ausgegeben, der in einer temporären Datei bei der letzten erfolgreichen Messung hinterlegt wurde.
Das Script ist darauf ausgelegt, Messwerte remote von anderen Himbeeren auszulesen. Dazu ist ein passwortloser SSH-Login notwendig, wie es in diesem Beitrag beschrieben wurde. Aufgerufen wird das Script beispielsweise wie folgt:
/scripts/dht22.sh 123 4 TEMP
Dabei steht die Zahl „123“ für das letzte Oktett der IP-Adresse des Raspberry, die Ziffer „4“ für den GPIO-Port, an dem der DHT22-Sensor am entfernten Raspberry angeschlossen ist und der Begriff „TEMP“ dafür, dass man in diesem Beispiel die Temperatur abrufen möchte. Alternativ wäre hier „HUM“ anzugeben.
Daniel Wenzel
27.01.2016 @ 01:16
Hallo Peter,
danke für das nette Feedback. Irgendwo habe ich mitbekommen, dass Seiten mit „echten Inhalt“ grad im kommen sind, da sind wir mal auf den Zug aufgesprungen ;)
Gerne kannst du deine Fragen stellen, dafür ist das Kommentarsystem ja da.
Grüße, Daniel
Peter
26.01.2016 @ 23:30
Diese Seite habt ihr (beide?) optisch wirklich toll hinbekommen – ein echter Hingucker mit dieser Räumlichkeit! Dazu echter Inhalt. Ich beschäftige mich gerne mit dem Raspberry und seinen Möglichkeiten. Diese Seite hab ich zügig gefunden und sie hat mir tollen Input gegeben, vielen Dank! Eventuell frage ich euch auch noch Löcher in’n Bauch.
Gruß, P.
Klaus Mrkor
10.12.2015 @ 18:18
Hallo,
kann mir jemand helfen.
Wie bekomme ich die Daten nach Fhem
Danke
Klaus
Klaus Mrkor
09.12.2015 @ 20:47
Entschuldigung ich einen Fehler gemacht. Nach ./loldht 1
bekam ich auch die Daten.
Jetzt muß ich nur noch in Fhem einbinden.
Dazu werde ich noch googln müssen.
Gruß
Klaus
Klaus Mrkor
09.12.2015 @ 20:40
Hallo
Ich habe Pin 12 Gpio 18
./loldht 0
Raspberry Pi wiringPi DHT22 reader
http://www.lolware.net
lock file is in use, exiting….
Nach neustart
cd lol_dht22
./loldht 0 (./loldht 18)
Raspberry Pi wiringPi DHT22 reader
http://www.lolware.net
Data not good, skip
Data not good, skip
usw.
Gruß
Klaus
Daniel Wenzel
09.12.2015 @ 17:03
Hallo,
im Grunde sollten alle PINs funktionieren, die als GPIO vorgesehen sind.
Hier mal eine Tabelle der möglichen PINs:
https://klenzel.de/4162
Was heißt denn, du bekommst keine Daten?
Klaus Mrkor
09.12.2015 @ 15:03
Welche Pin kann ich noch nehmen? Die 4 ist für 1wire.
Habe alles probiert bekomme auser bei 4 keine Daten.
Gruß Klaus
Jochen
23.09.2015 @ 09:25
Hi,
leider kann ich ./configure bei lol_dht22 nicht ausführen:
root@xxx:/home/pi/lol_dht22# ./configure
checking for a BSD-compatible install… /usr/bin/install -c
checking whether build environment is sane… yes
checking for a thread-safe mkdir -p… /bin/mkdir -p
checking for gawk… no
checking for mawk… mawk
checking whether make sets $(MAKE)… yes
checking whether make supports nested variables… yes
checking for gcc… gcc
checking whether the C compiler works… yes
checking for C compiler default output file name… a.out
checking for suffix of executables…
checking whether we are cross compiling… no
checking for suffix of object files… o
checking whether we are using the GNU C compiler… yes
checking whether gcc accepts -g… yes
checking for gcc option to accept ISO C89… none needed
checking for style of include used by make… GNU
checking dependency style of gcc… gcc3
checking whether make sets $(MAKE)… (cached) yes
checking how to run the C preprocessor… gcc -E
checking for grep that handles long lines and -e… /bin/grep
checking for egrep… /bin/grep -E
checking for ANSI C header files… yes
checking for sys/types.h… yes
checking for sys/stat.h… yes
checking for stdlib.h… yes
checking for string.h… yes
checking for memory.h… yes
checking for strings.h… yes
checking for inttypes.h… yes
checking for stdint.h… yes
checking for unistd.h… yes
checking wiringPi usability… no
checking wiringPi presence… no
checking for wiringPi… no
checking /usr/local/include/wiringPi.h usability… yes
checking /usr/local/include/wiringPi.h presence… yes
checking for /usr/local/include/wiringPi.h… yes
checking for wiringPiSetup in -lwiringPi… no
configure: error: Fail to find wiringPi library
Ich habe es schon auf zwei verschiedenen Raspberrys probiert (RPi Model B und RPi2 Model B). Wiring Pi habe ich schon mehrfach neu installiert.
Danke
Jochen
Daniel Wenzel
21.02.2015 @ 02:29
Hallo,
du hast Recht, das ging aus dem Artikel leider nicht deutlich hervor. Daher habe ich den Artikel dementsprechend angepasst. Grundsätzlich ist es egal, wo wiringPi heruntergeladen wird, da „./build“ die ausführbare Datei immer nach „/usr/local/bin/“ kopiert. Der Installationsordner kann im Anschluss, egal wo er sich befindet, gelöscht werden.
Grüße, Daniel
Daniel Wenzel
21.02.2015 @ 02:20
Hallo, nochmals. Der Artikel ist nun endlich fertiggestellt und befindet sich unter
https://klenzel.de/3100
Grüße, Daniel
Paul
21.02.2015 @ 01:30
Hi,
welchen Ordner würdet Ihr empfehlen, um die Sourcen mit git clone zu laden? Sieht ja so aus, als wäre das, was man da runterlädt, nicht nur temporär, sondern müsste auch irgendwo liegen bleiben (auch nach der Installation/Konfiguration)… Oder?
Danke und schönen Gruß
Paul
Daniel Wenzel
17.12.2014 @ 17:50
Hallo Ralf,
der Link ist nicht „nicht mehr“ online, sondern „noch nicht“.
Da der Artikel über openHAB etwas länger ausfallen wird, dauert die Veröffentlichung leider noch ein wenig.
Ich hoffe, ich werde den Artikel an den Feiertagen fertigstellen können. Bis dahin bitte noch ein wenig Geduld.
Grüße, Daniel.
Ralf
17.12.2014 @ 15:35
Hi Daniel,
leider ist der Link zur Einbindung des DHT22 in OpenHab nicht mehr online. Bevor ich das Rad neu erfinde. Kannst Du mir die Informationen zukommen lassen? :D
Danke.
Gruß
Ralf