Raspberry Pi Sensor für Luftfeuchtigkeit
Am Raspberry Pi kann man einen Sensor für Luftfeuchtigkeit verwenden. Damit ist es möglich sowohl Temperatur als auch die aktuelle Luftfeuchtigkeit zu bestimmen. Die Genauigkeit hängt dabei von der Qualität des Sensors ab, ich habe einen DHT11 angeschlossen und dessen Werte ausgelesen. Im letzten Teil habe ich euch gezeigt wie ihr die Hardware vorbereitet und anschließt, nun geht es um die Software.
Raspberry Pi Sensor für Luftfeuchtigkeit
Das erste Problem auf das man stößt ist, dass man den Sensor für Luftfeuchtigkeit nicht ohne weiteres über Python auslesen kann. Das hat damit zu tun, dass Raspbian Linux und alle anderen Distributionen keine Echtzeit Betriebssysteme sind, die Rechenzeit wird reihum den laufenden Programmen zugewiesen. Will man also einen Datenstrom Milli- oder gar Mikrosekunden genau auslesen macht einem der Scheduler einen Strich durch die Rechnung. Ich habe das mit einem Python Code funktioniert und die eingelesenen Werte sahen recht gut aus, bis auf die Tatsache, dass die Prüfziffern nie stimmten, deshalb sind die empfangenen Werte unbrauchbar. Ohne einen Hardwaretreiber nichts zu machen…oder doch?
Eine viel bessere Lösung ist ein C++ Programm. Das klappt und Adafruit hat dazu auch eine Lösung gefunden die man verwenden kann. Eine bessere Zwischenlösung für uns ist folgendes:
- ein unter C++ geschriebener und kompilierter Header für die DHT Sensoren
- diesen Header binden wir über Python ein
Warum das ganze? Weil ich eine einheitliche Lösung bevorzuge. Wenn man sich zum Beispiel eine Wetterstation bauen möchte, dann macht es Sinn, wenn alle Komponenten als separate Python Codes vorliegen die man zu einem großen Programm zusammenfügen kann. Wenn große Teile dann in anderen Programmiersprachen geschrieben sind, dann wird das unübersichtlich und praktisch nicht wartbar. Deshalb sollte man so wenig wie möglich als kompilierte Header Dateien in eine andere Programmiersprache auslagern.
Software
Wir beginnen indem wir uns den DHT Treiber herunterladen. Adafruit hat dafür ein C++ Programm erstellt, welches man im Python Code als Header einbauen kann. Wir laden uns also den Adafruit DHT Driver für Python herunter.
Den Treiber müssen wir zuerst kompilieren, dafür benötigen wir 2 Dinge:
- python-dev
falls man diese Bibliothek noch nicht installiert hat, dann geht das mit:sudo apt-get install python-dev
- bcm2835 Bibliothek
damit bekommt man unter C++ Zugriff auf die GPIO Schnittstelle. Diese Bibliothek wird beim DHT Treiber vorausgesetzt.
BCM2835 installieren
Um unter C++ die GPIO Schnittstelle ansprechen zu können benötigt man die BCM2835 Bibliothek. Diese kann man recht einfach am Raspberry Pi verwenden. Zuerst muss man die Quelldateien herunterladen: http://www.airspayce.com/mikem/bcm2835/
Die gepackten Daten extrahieren und in das neue Verzeichnis wechseln:
tar zxvf bcm2835-1.42.tar.gz cd bcm2835-1.42
Möglicherweise unterscheidet sich die Versionsnummer von der angegebenen. Es ist nicht auszuschließen, dass die Bibliothek noch weiterentwickelt wird. Nun müssen wir die Bibliothek nur noch kompilieren und installieren. Das geht mit folgenden Kommandos:
./configure make sudo make check sudo make install
Hat das funktioniert, dann wechseln wir in das Verzeichnis des Adafruit Codes und erstellen nun den DHT Treiber:
python setup.py build
das sollte nun ebenfalls problemlos durchlaufen. Es wird ein neuer Ordner build erstellt in dem man eine Datei dhtreader.so findet.
C++ DHT Header in Python verwenden
Die neu erstellte dhtreader.so Datei können wir nun für unsere eigenen Python Projekte verwenden in denen wir den DHT11 Sensor ansprechen wollen.
Diese müssen wir nun ins Verzeichnis kopieren in dem der Python Code liegt, welcher diesen dhtreader mit import dhtreader einbindet. Nun erscheint die Fehlermeldung ImportError: No Module named dhtreader nicht mehr, sondern der Python Code funktioniert mit diesem Reader!
Der Code von Adafruit unterstützt mehrere Sensoren.
je nach angeschlossenem Sensor muss man den Typ in den Parametern angeben. Neben dem Sensortyp gibt man auch die Nummer jenes GPIO Pins ein, in an dem man den Sensor angeschlossen hat. In meinem Fall ist das die GPIO mit der Nummer 4. Die gemessenen Werte werden auf der Kommandozeile ausgegeben:
Der Aufruf geht so:
sudo python dht.py [SENSOR TYP] [GPIO PIN]
Man benötigt root Rechte, damit man die GPIO Schnittstelle verwenden kann. Als Parameter gibt man zwei Werte an:
- SENSOR TYP
die Nummer des Sensors. Das ist 11 für DHT11, 22 für DHT22 und 2302 für den AM2302. - GPIO PIN
die Nummer des GPIO Pins an denen der Daten Pin des Sensors angeschlossen wird. Von dem Pin wird gelesen.
Dieses Python Skript kann man nun in externe Python Skripte einbauen und somit den Sensor für Luftfeuchtigkeit ansprechen. Man kann sich nun eine Wetterstation bauen die immer aktuelle Werte grafisch ausgibt. Genau so kann man aber auch ein automatisches Skript programmieren, welches periodisch diese Messwerte erfasst und in eine Datenbank speichert. Von dort kann man die Daten ausgeben oder längere Zeiträume auswerten.
Fazit
Mit dem Raspberry Pi und einem Sensor für Luftfeuchtigkeit kann man schon eine kleine Wetterstation bauen. Die Messwerte der DHT11 oder DHT22 Sensoren stehen über ein Python Skript zur Verfügung, die Sensoren messen neben der Luftfeuchtigkeit auch die Temperatur. Dank dem C++ kompilierten Header funktioniert die Kommunikation mit dem Sensor für Luftfeuchtigkeit auch unter Python und liefert korrekte Werte.
Hallo,
Ich habe verschiedene setup.py auf dem Raspberry, wo finde ich das set.py für den dht22???
Hat das funktioniert, dann wechseln wir in das Verzeichnis des Adafruit Codes und erstellen nun den DHT Treiber: python setup.py build
Im bcm2835-1.45 Ordner finde ich nur eine setup.py Datei. Den dht22 Sensor verwendet man, indem man bei Sensortyp im Kommando 22 eingibt.
Huhu, ich habe mir vor ein paar Tagen denn DHT11 gekauft und wollte ihn nun ausprobieren. Ich hab mir die Datei gezogen, entpackt und alle Schritte bis auf den „python setup.py install“ klappen … ich finde diese Datei in keinem der erstellten Ordner 🙁
Was mach ich verkehrt?