In dem Beitrag stelle ich die Anbindung und das Auslesen des Sensors mit zwei verschiedenen Methoden vor. Ich habe auch den Quellcode vom https://sebastianhemel.blogspot.com/2018/05/raspberry-pi-oled-display-ssd1306-i2c.html angepasst, damit eine Ausgabe auf dem OLED I2C Display erfolgen kann.
Der DHT22-Sensor ist kostengünstig, lässt sich einfach
ansteuern und ist digital (kein Analogkonverter/Kalibration notwendig).
Der große Nachteil ist aber, dass er relativ langsam
ist (Abfrage max. alle 3 Sekunden) und der Sensor stürzt oft ab und er
muss vom Strom genommen werden, damit er neu gestartet werden kann.
Technische Daten des DHT22:
- 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)
- der dritte Pin (zwischen DATA und GND) ist nicht belegt
- siehe auch https://cdn-shop.adafruit.com/datasheets/DHT22.pdf
Anschluss am Pi
Der Sensor darf am nur mit 3,3V Spannungsversorgung angeschlossen werden. Wichtig ist auch der 10 kilo-Ohm Widerstand, damit die Datenleitung nicht "gefloated" wird.
Als Alternative kann man auch den DHT22 mit integrierten Widerstand verwenden:
Sensor ansteuern mit pigpio
Mit der pigpio Bibliothek (C und Python) kann man beim Pi auf den GPIO Port zugreifen.Damit dies funktioniert, muss pigpio als Daemon immer im Hintergrund laufen, damit ein Zugriff auf die Pins via Sockets und Pipes erfolgen kann.
Installtion erfolgt mit dem folgenden Befehl:
sudo apt-get install pigpio
Jetzt muss der pigpio daemon (pigpiod) als "root" gestartet werden:
sudo pigpiod
Am besten kann man dies auch gleich mit in der crontab vom "root" aufnehmen:
sudo crontab -e
@reboot pigpiod #start pigpio daemon
Über das folgenden Beispiel aus der pigpio Bibliothek, kann der Sensor angesprochen werden: https://github.com/joan2937/pigpio/raw/master/EXAMPLES/Python/DHT22_AM2302_SENSOR/DHT22.py (Download z.B. mit wget)
In der Datei "DHT22.py" muss jetzt noch der korrekte Daten-Pin eingestellt werden:
nano DHT22.py (Zeile 257)
...
s = DHT22.sensor(pi, 4, LED=16, power=8)
...
Je Zeile:
- fortlaufende Nummer, Luftfeuchtigkeit, Temperatur, Staleness, Bad Checksum Counter, Short Message Counter, Missing Message Counter, Sensor Resets
Traceback (most recent call last):
File "DHT22.py", line 8, in <module>
import pigpio
ImportError: No module named pigpio
Müssen noch die folgenden Module installiert werden:
sudo apt-get install python-pigpio python3-pigpio
def GetTempDHT22():
s.trigger()
time.sleep(0.2)
#print ("{:5.1f} °C {:.0f} %".format(s.temperature(), s.humidity()))
value = "{:5.1f} °C {:.0f} %".format(s.temperature(), s.humidity())
value = unicode(value, 'utf-8')
return value
wget http://www.shemel.de/download/raspberry/OLEDdisplayTempDHT22pigpio.py
Sensor ansteuern mit Adafruit
Der Open Source Treiber von Adafruit (C und Python) kann auch für die Ansteuerung verwendet werden.Vor dem Download muss ggf. das System vorbereitet werden (Pakete build-essentail und python-dev):
sudo apt-get update
sudo apt-get install build-essential python-dev
Jetzt kann das GitHub Repository geklont werden:
git clone https://github.com/adafruit/Adafruit_Python_DHT.git
Anschließend muss der Quellcode noch konfiguriert werden:
cd Adafruit_Python_DHT/
sudo python setup.py install
Danach kann man die Library verwenden und das folgende Beispiel aufrufen:
cd examples
sudo ./AdafruitDHT.py 22 4
Temp=28.4* Humidity=51.1%
Gibt es ein Problem oder wurde der falsche Pin verwendet, erscheint folgende Ausgabe:
Failed to get reading. Try again!
Um die Daten jetzt auch im OLED I2C Display anzeigen zu können, habe ich folgende Methode hinzugefügt:
...
import Adafruit_DHT
...
def GetTempDHT22():
humidity, temperature = Adafruit_DHT.read_retry(Adafruit_DHT.DHT22, 4)
if humidity is not None and temperature is not None:
print('Temp={0:0.1f}* Humidity={1:0.1f}%'.format(temperature, humidity))
value = '{0:0.1f}* {1:0.1f}%'.format(temperature, humidity)
else:
print('Failed to get reading. Try again!')
value = 'Failed'
return value
Keine Kommentare:
Kommentar veröffentlichen