Um mit dem Raspberry Pi die Temperatur und die Luftfeuchtigkeit zu messen, habe ich mir einen entsprechenden Sensor zugelegt. Dabei handelt es sich um den AM2301.
Diese ist dem typischen DHT 22 sehr ähnlich und lässt sich auch mit den gleichen Python Libarys ansprechen.
Aufbau des AM2301 in einer Teststellung
Für unsere kleine Teststellung habe ich einen Raspberry Pi 3, einen AM2301, ein Breadboard und ein paar Jumper Kabel verwendet. Alles angeschlossen sieht dann so aus:
Sicherheitshalber habe ich auch nochmal eine kleine Zeichnung erstellt =)
Adafruit Python DHT Sensor Library
Zum Ansteuern des AM2301 verwende ich die DHT Sensor Library. Diese steht unter MIT Lizenz und kann einfach von GitHub geladen werden. Vor dem Download sollten wir das System noch darauf vorbereiten. Dafür installieren wir die Pakete build-essentail und python-dev.
1 2 | sudo apt-get update sudo apt-get install build-essential python-dev |
Anschließend können wir das GitHub Repository klonen.
1 | git clone https://github.com/adafruit/Adafruit_Python_DHT.git |
Nach dem nun der Quellcode auf unserem System ist, müssen wir diesen konfigurieren. Dafür wechseln wir in den Ordner Adafruit_Python_DHT und führen anschließend den Setup Aufruf durch.
1 2 | cd Adafruit_Python_DHT/ python setup.py install |
Nun können wir auf die Library zurückgreifen.
Erster Test mit AdafruitDHT.py
Im Ordner examples gibt es Beispiele für die Verwendung. In diesen wechseln wir nun.
1 | cd examples |
Hier verwenden wir die für einen ersten die AdafruitDHT.py. Schauen wir uns das Skript erstmal etwas mit einem Editor an. Für die Übersicht habe ich die ganzen Kommentare erstmal entfernt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #!/usr/bin/python import sys import Adafruit_DHT sensor_args = { '11': Adafruit_DHT.DHT11, '22': Adafruit_DHT.DHT22, '2302': Adafruit_DHT.AM2302 } if len(sys.argv) == 3 and sys.argv[1] in sensor_args: sensor = sensor_args[sys.argv[1]] pin = sys.argv[2] else: print('usage: sudo ./Adafruit_DHT.py [11|22|2302] GPIOpin#') print('example: sudo ./Adafruit_DHT.py 2302 4 - Read from an AM2302 connected to GPIO #4') sys.exit(1) humidity, temperature = Adafruit_DHT.read_retry(sensor, pin) if humidity is not None and temperature is not None: print('Temp={0:0.1f}* Humidity={1:0.1f}%'.format(temperature, humidity)) else: print('Failed to get reading. Try again!') sys.exit(1) |
Für uns sind erstmal nur die Zeilen 7 – 9 und 10 – 12 interessant.
In den Zeilen 7 – 9 wird eine Key/Value Liste aufgebaut. Dabei handelt es sich um die Möglichen Sensor Typen (22, 11 und 2302) und dem entsprechenden Verweis in die Library. Das heißt für uns, dass wir mit der Adafruit Python DHT Sensor Library die Sensoren von Typ DHT 22, DHT 11 oder AM2302 ansprechen können.
In den Zeilen 10 – 12 werden nun die entsprechenden Informationen für den Sensor Typ und der GPIO Port an dem der Sensor angeschlossen ist eingelesen. Das ist bei uns der Port 4.
Ein Testaufruf auf dem Terminal sehe dann so aus:
1 2 | root@raspberrypi:~/Adafruit_Python_DHT/examples# ./AdafruitDHT.py 2302 4 Temp=26.2* Humidity=51.3% |
Als Rückgabe bekommen wir die Temperatur und die Luftfeuchtigkeit.
Wichtig hierbei ist, dass der Sensor nicht jede Sekunde abgefragt werden kann. Er hat eine leichte Verzögerung. Dies hat zur folge das man nur alle 2 – 3 Sekunden auch einen Wert zurückbekommt. Dies fällt relativ schnell auf, wenn er versucht den Befehl mehrere male hintereinander auszuführen.
# Temperaturverleich mit 2 DHT22
#!/bin/bash
ZAEHLER=1
cd /home/pi/adafruit/Adafruit-Raspberry-Pi-Python-Code-master/Adafruit_DHT_Driver/
while [ $ZAEHLER -le 10000 ]
do
DATUM=
date '+%d.%m.%Y'
ZEIT=
date '+%H:%M:%S'
COUNTER1=0
COUNTER2=0
LUFT1=““
LUFT2=““
TEMP1=““
TEMP2=““
while [ „$LUFT1“ == „“ ]; do
WERTE=$(sudo ./Adafruit_DHT 22 4)
TEMP1=( $(echo $WERTE | awk ‚{print $13}‘))
LUFT1=( $(echo $WERTE | awk ‚{print $17}‘))
let COUNTER1=COUNTER1+1
done
while [ „$LUFT2“ == „“ ]; do
WERTE2=$(sudo ./Adafruit_DHT 22 25)
TEMP2=( $(echo $WERTE2 | awk ‚{print $13}‘))
LUFT2=( $(echo $WERTE2 | awk ‚{print $17}‘))
let COUNTER2=COUNTER2+1
done
LUFTDIFF=$(echo „$LUFT1 $LUFT2“ | awk ‚{ print($1 – $2) }‘)
TEMPDIFF=$(echo „$TEMP1 $TEMP2“ | awk ‚{ print($1 – $2) }‘)
echo -e „$DATUM \t $ZEIT \t $ZAEHLER \t $TEMP1 \t $TEMP2 \t $TEMPDIFF \t $LUFT1 \t $LUFT2 \t $LUFTDIFF“
sleep 1s
((ZAEHLER++))
done
Danke für das Script =)
many thanks for this very good blog article !
I would like hereby to confirm, all this is working very well in python3, too.
on some systems (e.g. Raspbian) you only have to install the „python3-dev“ instead of python-dev.
And install then with:
cd Adafruit_Python_DHT/
python3 setup.py install
The given example is already python3-style.
Vielen Dank fuer diesen sehr guten Blog-Artikel.
Ich moechte hier sagen, dass alles oben genannte auch mit Python3 sehr gut funktioniert. Auf manchen Systemen (insbesondere Raspbian) muss man aber das python3-dev – Paket installieren und den Setup-Aufruf ala:
python3 setup.py install
durchfuehren.Das o.g. Beispiel ist schon Python3 kompatibel..
Cheers,
Andre