DHT-11 mit Python

Wie im letzten Beitrag angekündigt, schreibe ich hier nun meine Erfahrungen mit DHT-11-Driver-Python auf.

Zunächst hab ich die „README“ Datei angeschaut. Dort ist folgendes vermerkt:

Nun wie ich so bin, habe ich die ersten Zeilen übersprungen und sofort mit dem Befehl „python setup.py build“ angefangen. Soweit so gut. Nachdem ich mich an die Anleitung des nächsten Absatzes gehalten habe, kopierte ich die Datei „dhtreader.so“ in mein Testverzeichnis. Daraufhin natürlich sofort probiert, die Library zu importieren. Fehlanzeige!

Die Fehlermeldung hatte irgendetwas mit „clocktime“ angezeigt. Ersten google-Suchen haben frustrierender Weise nichts ergeben. Also noch ein weiteres Mal die README Datei gelesen und siehe da, die Librarys „python-dev“ und „bcm2835“ sollten zuvor installiert werden. Nun gut, also kurz gegooglet und folgende Anleitungen gefunden:

– die bcm2835 Installation wird hier beschrieben
– python-dev:

Nach der erfolgreichen Installation dieser beiden Librarys konnte ich die dhtreader.so erfolgreich importieren.

Nun also versucht die Werte zu messen:

Tipp zum ausprobieren:
Wenn Du es so gemacht hast wie ich (Tomato Pi), dann stimmen die Eintragungen „(11, 4)“ ansonsten musst Du es, wie in der README beschrieben, mit der Typ Nummer (11 für DHT-11 oder 22 für DHT-22) und der GPIO Nummer des Raspberry Pi machen.

So das hat alles bestens funktioniert. Nun habe ich mir überlegt, ob ich die Werte in eine Datenbank oder in ein Textfile schreiben soll. Hierbei habe ich mich für die schnelle Lösung mit dem Textfile entschieden.

Mein erstes Skript, das mir die Werte im Minutentakt in ein Textfile schreibt sah so aus:

Hierbei habe ich nicht auf Performance oder andere schöne Sachen geachtet. Auch der Code schein zunächst ein wenig verwirrend. Vereinfacht sieht es dann so aus (Selbe Wirkung, nur dass keine Zeit und kein Datum vor die Werte geschrieben wird):

Einziger Unterschied: Hier wird nicht zur Minute xx:xx:00, sonder zu dem Zeitpunkt, an dem Du das Script gestartet hast gemessen.

Für Python Code liefert die Doku gute Beispiele. Zudem ist diese Sprache sehr leicht zu lernen. Zumindest was ich bisher benutzt und gelernt habe (also eben die Basics).

Was habe ich bis jetzt geschafft?

  • Shell-Ausgabe mit dem Messwerten des DHT-11
  • Importieren der „dhtreader.so“ Library
  • Python-Shell Ausgabe der Messwerte
  • Python Script mit Ausgabe der Messwerte und schreiben in ein Text-File

Im nächsten Schritt werde ich erklären, wie ich die Messwerte auslesen und auswerte. Hierbei werde ich PHP benutzen.

17 Gedanken zu „DHT-11 mit Python“

  1. Hallo!

    Ich habe versucht deine Anleitung nachzuvollziehen, hänge aber bereits am ersten Schritt – die Datei dhtreader.so zu generieren. In welchem Verzeichnis bzw. wie hast du den Befehl python setup.py build ausgeführt?

    1. Hallo Patrik,

      hier habe ich den Link zu dem GitHub Projekt von Adafruit mit den ganzen Treibern: GitHub Adafruit
      Dort kannst du das ganze Verzeichnis auch gleich runterladen oder über den link gleich per Zip downloaden:
      https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code/archive/master.zip

      Danach das Zip Archiv entpacken, hierzu musst du ggf. als erstes noch das Programm „unzip“ auf den Raspberry herunterladen.
      apt-get install unzip

      Wenn du das alles gemacht hast, wechsle in das entpackte Verzeichnis und darin wiederum in das Verzeichnis „Adafruit_DHT_Driver_Python“. Wenn du dort bist, solltest du den Befehl
      python setup.py
      ausführen können. Vorgabe hierfür ist natürlich, dass du die beiden Librarys bcm2835 und python-dev installiert hast. Die Anleitung findest du oben im Beitrag.

      Ich hoffe ich konnte dir helfen und würde mich über ein kurzes Feedback freuen, ob es funktioniert hat oder nicht.

      Viele Grüße
      Johannes

  2. Ein Teilproblem habe ich damit gelöst, aber gleichzeitig ein neues bekommen.
    Die Datei dhtreader.so konnte ich jetzt erstellen. Danach habe ich die Datei gemeinsam mit dem Python-Skript:

    import dhtreader
    type = 22
    pin = 24
    dhtreader.init()
    print dhtreader.read(type, pin)

    in ein Verzeichnis gelegt. Lasse ich das Skript nun im Python Shell ablaufen kommt nur folgender Eintrag:

    >>> ============RESTART==========
    >>>

    >>>============RESTART==========
    >>>

    Also nur eine leere Zeile. Der Sensortyp und der Pin stimmen. Sensor funktioniert auch, denn eine Abfrage der Sensorwerte über LXTerminal funktioniert. Hast du eine Ahnung warum das Skript keine Werte zurückgibt?

    1. Ich habe gelesen, dass der Sensor zwischen
      dhtreader.init()
      und
      dhtreader.read(type, pin)
      3 Sekunden Zeit benötigt. Versuche mal folgenden Code:

      import dhtreader
      import time

      type = 22
      pin = 4
      dhtreader.init()
      time.sleep(3)
      print dhtreader.read(type, pin)

    1. Ja, das habe ich gestern auch gelesen und daraufhin meine Code wie folgt verändert:

      import dhtreader
      import time

      type = 22
      pin = 4

      while True:
      dhtreader.init()
      print „INIT“
      time.sleep(10)
      print „SLEEP“
      print dhtreader.read(type, pin)
      print „PRINT“

      Das Programm gibt dann INIT und SLEEP aus, danach folgt wieder eine leere Zeile und RESTART. Die Schleife bricht also beim dhtreader.read Befehl ab und es kommt gar nicht mehr zur letzten Zeile.

      1. Also jetzt weis ich auch nicht mehr weiter. Du hast ja gesagt, der Sensor funktioniert. Dein Skript sieht auch gut aus. Das einzige was du noch machen könntest wäre den „init“ Befehl aus der Schleife zu nehmen. Musst du nur ein mal am Anfang machen.
        [code]
        import dhtreader
        import time

        type = 22
        pin = 4

        dhtreader.init()
        print “INIT”
        time.sleep(10)
        print “SLEEP”

        while True:
        print dhtreader.read(type, pin)
        print “Ausgabe Temperatur und Sleep 5 Sekunden”
        sleep(5)
        [/code]

        Den Sleep nach dem Lesen benötigst du, damit der Sensor wieder neue Werte lesen kann.
        Was benutzt du denn für ein OS? Hast du schon mehr mit den GPIOs gemacht. Bei mir war es einmal so, dass ich alle GPIOs „resetten“ musste, über wiringPi z.B. oder RPi.GPIO, kommt auf die Library drauf an, die du benutzt.

        1. Ja, ich verstehe es auch nicht ganz. Hab gestern nach intensiver Suche im Internet genervt aufgegeben. Vor allem verstehe ich nicht, dass ich über die shell die Werte auslesen kann.
          Mit den GPIOs habe ich sonst nichts gemacht, das Auslesen des Temperatursensors war sozusagen mein Einstieg in die Programmierung des PI. Werde heute Abend eine jungfräuliches Raspbian Image verwenden und deiner Anleitung nochmal folgen. Alternativ habe ich im Netz eine andere Möglichkeit über ein Shell-Skript gefunden die ich noch ausprobieren möchte.
          Würde es trotzdem schade finden, wenn das mit dem Python Skript nicht klappt und ich nicht herausfinden kann warum.

          Eine Frage noch, welche Version von Raspbian verwendest du? Ich nutze das Noobs-Image und habe mir damit Raspbian installiert. Könnte es daran liegen?

          1. Hmm, das könnte gut sein, auch wenn mir dazu keine passende Erklärung einfällt.
            Ich habe das Raspbian Image genommen. Mit Noobs hab eich noch gar nichts gemacht.
            Hier mal der Link, den ich verwendet habe:
            Raspbian Image (wheezy)

            Versuch es damit mal. Python musst du natürlich dann auch wieder installieren. Ich habe Python 2.7 verwendet, aber das müsste eigentlich egal sein.

            Würde ich über eine Rückmeldung freuen, wenn es dann funktioniert. 😀

          2. Ich habe es jetzt nochmal ganz von vorne versucht, bringt aber keine Veränderung. Ich weiß nicht woran es liegt. Heute habe ich leider keine Zeit mehr. Sobald ich dazu komme, werde ich es über ein Shell-Skript probieren. Danke auf jeden Fall für deine Hilfe!

          3. Wenn du das Betriebssystem nochmal aufgesetzt hast und es funktioniert oder du es irgendwie anders hinbekommst, kannst du deine Lösung hier posten? Würde mich sehr stark interessieren woran es gelegen hat.
            Viele Grüße und gutes Gelingen.

          4. So, hab es endlich geschafft. Die Messung läuft mittlerweile schon seit 4 Tagen ohne Probleme.
            Nachdem ein neuer Start mit einem frischen Betriebssystem auch nichts half, bin ich einen anderen Weg gegangen.
            Ich habe mir die pigpio library von http://abyz.co.uk/rpi/pigpio/index.html runtergeladen und installiert. Dort gab es auch ein Beispielskript in Python zum Auslesen des Sensors. Dieses habe ich etwas erweitert. Es liest mir nun bis zu einem vorgegebenen Datum die Werte alle 30 Sekunden aus und speichert mir die Werte in eine csv Datei. Diese kann ich dann mit Excel auf meinem Windows-PC einfach auswerten. Funktioniert so sehr gut.
            Warum es mit deiner Anleitung nicht geklappt hat, kann ich dir also auch nicht sagen. Vielleicht habe ich irgendwas falsch gemacht oder es lag am Sensor oder an der bcm2835-library.
            Trotzdem danke nochmal für deine Hilfe!

  3. Hallo,

    danke für die Anleitung! Ich stelle die Messwerte vom meinem DHT11-Sensor auf meinem 2×16 LCD Display dar. Das Problem ist jedoch, dass ich nicht weiß wie ich die zwei Werte (Temperatur und Feuchtigkeit) in zwei Objekte von einander trennen kann, um sie getrennt von einander mit Einheiten darzustellen, können Sie mir bitte weiterhelfen?

    LG

    1. Hi,

      die Werte verarbeite ich in PHP weiter und trenne sie dort. In meinem Beitrag beschreibe ich in Zeile 15 und 16, wie ich das mache.
      Für Python wäre das die „Split()“ Funktion. Wie diese genau funktioniert weis ich leider nicht genau, da ich sie noch nie benutzt habe.

      Bestimmt finden Sie aber dazu etwas im Netz.
      Viel Glück und Erfolg

      1. Hi,

        also, ich habe es geschafft! Erst musste Ich die Float-Zahlen vom dhtreader.read in ein String umwandeln, dann die Klammern und Komma entfernen und anschließend mit dem Split-Befehl den String auftrennen. Es werden dann zwei Strings daraus gemacht, die in einer Liste landen. Diese Strings aus der Liste habe ich dann an zwei Objekte geschrieben. Bei Interesse kann ich gerne den Code hier hochladen.

        Jetzt muss ich nur noch eine klevere Lösung finden um die Werte regelmäßig zu aktualisieren- Ideen?

        Vielen Dank!

        LG

        1. An dem Skript hätte ich natürlich Interesse.

          Zum aktuallisieren der Werte könnten Sie einen Cronjob benutzern, oder in dem Skript einen Sleep Befehl einbauen. Da ich nicht weis, wie das Display die Werte darstellt, kann ich Ihnen keine andere Lösung sagen.

Schreibe einen Kommentar

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