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

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

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:

Hat das funktioniert, dann wechseln wir in das Verzeichnis des Adafruit Codes und erstellen nun den DHT Treiber:

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:

Raspberry Pi DHT11 messen

Der Aufruf geht so:

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.

(Visited 5.067 times, 1 visits today)

Das könnte auch interessant sein...

3 Antworten

  1. Phil sagt:

    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

  2. Martin Rieger sagt:

    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?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.