Temperatursensor DHT22 am Raspberry Pi

dht22titelSehr 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:

  1. Sensor DHT22 (z.B. hier halbwegs günstig)
  2. Widerstand 10 kΩ
  3. Anschlusskabel (z.B. solche)
  4. 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:

 

dht22

 

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.

 

Update
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.