DHT22 oft keine Daten

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo zusammen,

    ich habe an meinen Raspberry Pi b+ einen DHT 22 (mit 4,7k Widerstand) angeschlossen und logge damit die Temperatur und Luftfeuchte mit - alle 10min. Das klappt auch wunderbar. Jedoch hab ich das Problem dass nicht immer ein Wert ankommt.

    Jetzt war meine Idee ins Script eine Überprüfung mit einzubauen ob auch Werte vorhanden sind. Wenn nicht, 2-5 Sek. später einfach nochmal eine Abfrage zu starten, bis es klappt.

    Jedoch fehlt mir da ein wenig das Knowledge zu. Daher die Frage ob wer von euch da - sicher im Handumdrehen - helfen könnte?

    Ich hab in der SuFu jetzt direkt nichts gefunden, bzw. wenn dann überlesen :P

    Hier mein Script.

    Falls Fragen aufkommen sollten - die Kabel sind keine 15cm lang.... ;)

    Danke im Voraus!

    Rupert

  • Zu deinem Script kann ich nichts sagen.

    Allerdings betreibe ich ca. 8 DHT22 mit verschiedenen Leitungslängen und habe bis es zuverlässig lief mit verschiedenen Widerstandswerten experimentiert.

    Lange Leitung, rund 10 Meter Widerstand etwa 2,2 Kilo Ohm, kurze Leitung bis auf 10 Kilo Ohm.

    Bei deiner kurzen Leitung von 15 cm würde ich es erst einmal mit einem Widerstand zwischen 8 und 10 Kilo Ohm probieren.

    Dann kannst Du dir den Umweg über das Script vielleicht sparen. Bei deiner kurzen Leitungslänge sollten keinerlei Fehler auftreten.

  • Danke für den Tipp! Der wird mir sicher später auch gut weiterhelfen.

    Mein Ziel ist es ja auch mehrere DHTs laufen zu lassen. Aber das mal Step by Step ;)

    Jedoch sehe ich auch diese Scriptanpassung für Später als Sinnvoll um Fehlerquoten kleinzuhalten. ;)

    Also wäre es dennoch nett wenn sich jemand an dem Script noch versuchen könnte :D

    Einmal editiert, zuletzt von Rupert85 (27. August 2015 um 14:44)

  • Hallo,

    vlt hilft dir dies weiter:

    Spoiler anzeigen


    Den Adafruitpfad entsprechend anpassen und mit GPIO-Pin als Argument aufrufen:

    Code
    sudo ./test.sh 4
  • Tach'chen,

    dass der DHT22 gelegentlich keine Daten liefert ist ein alter Hut und wurde im Adafruit-Forum ausführlich diskutiiert.
    Das hat wohl was mit dem timing zu tun, mit dem der Sensor abgefragt wird. Python ist dafür wohl ein wenig zu lahm.

    Ich verwende daher rpi_dht22; den C-Quellcode gibts auf github (https://github.com/sweetpi/rpi_dht22). Das Programm
    funktioniert sehr viel zuverlässiger als der Python-Code.

    Weil ich recht viele Sensoren an meinen Pi angeschlossen habe, versenke ich die Daten in einer MySQL Datenbank.

    Für die grafische Darstellung kann man sich dann einen Datensatz (Woche/Tag/Monat) in einer CSV-Datei zusammenstellen.
    Ein cron-job macht mir daraus mit GNUplot eine PNG-Grafik, die man dann auf einer Webseite einbinden kann.
    Das finde ich Ressourcen-schonender als die Grafiken on-the-fly, d.h. bei Seitenaufruf zu generieren. Außerdem ändert sich
    die Außen- oder Zimmertemperatur in der Regel nicht nicht abrupt, so dass es völlig ausreicht die Grafik viertel- oder halbstündlich
    zu erneuern.

    Eine Besonderheit ist noch, dass man mit GNUplot die Daten auch umformen kann, um z.B. den Taupunkt zu berechnen.

    Bei Interesse stelle ich das shell-script gerne zur Verfügung.

    day.png

  • Also gut, ich versuche hier mal eine etwas ausführlichere Beschreibung wie ich die Daten von meinem DHT22 und anderen Sensoren einsammele.
    Statt in einer CSV-Datei speichere ich meine Daten in einer MySQL-Datenbank. Das ist vielleicht ein bisschen aufwendiger zu konfigurieren. Es gibt
    sicher auch Nachteile bzgl. der Performance auf dem Pi1, aber dort kann man evtl. auf SQLite zurückgreifen. Auf einem Pi2 sollte MySQL in jedem Fall
    vernünftig laufen.

    Ich werde hier nicht beschreiben wie man eine SQL-Datenbank anlegt, dafür gibt es gute Tutorials im Netz und Programme wie z.B. HeidiSQL, DBEAVER oder
    phpMyAdmin mit denen man das ruckzuck bewerkstelligen kann.

    Für meine Sensordaten habe ich eine Datenbank names 'raspi' angelegt. Wenn mehrere Sensoren am Pi zur gleichen Zeit abgefragt werden, dann kann man die Werte
    in einer gemeinsamen Tabelle speichern. Besser ist es jedoch, pro Sensor eine eigene Tabelle anzulegen. Dann kann man die Abfrage etwas flexibler gestalten.
    Ich habe z.B. einen "fest" installierten DHT22, einem BMP085 sowie mehrere Funksensoren die zu unterschiedlichen Intervallen ihre Daten senden.

    In die Tabelle (sensors) für den DHT22 kommen mindestens 3 Variablen, d.h. timestamp, tmp und hum. Beim Anlegen der MySQL Tabelle sollte man einen
    geeigneten Datentyp auswählen, also für die timestamp z.B. BIGINT und VARCHAR für tmp und hum. Für tmp und hum sollte Platz für mindestens 6 Zeichen sein,
    bei der timestamp entsprechend mehr.

    Auch wenn ich für den DHT22 nicht das Adafruit-Pyhon Skript benutze (s.o), verwende ich dennoch Python zum schreiben der Messwerte in die Datenbank:
    Das Skript habe ich hier aus Gründen der Übersichtlichkeit gekürzt, weil es ursprünglich auch Daten vom BMP085 eingesammelt hat. Mit dem Python-Modul
    commands lassen sich recht bequem die Ausgaben von Systembefehlen zerlegen. Die Ausgabe von rpi_dht22 wird hier in einer Liste gespeichert auf deren Elemente
    man per Index zugreift, z.B. dht22[0] (unbedingt vor dem Schreiben in die Datenbank mal mit "print" testen, ob die Daten auch korrekt formatiert werden!).

    Spoiler anzeigen

    Dieses Python-Skript kann man dann z.B. alle 5 min aufrufen, indem man es in die crontab einträgt.


    Code
    */5 * * * * /usr/local/bin/read_sensors.py >/dev/null 2>&1

    Mit diesen Einstellungen kann man nun 24/7 Daten vom DHT22 sammeln. Zum Erzeugen von Grafiken aus den Sensordaten habe ich mich für GNUplot entschieden.
    Es erzeugt PNG-Dateien, die man dann auf einer statischen Webseite unterbringen kann. GNUPlot ist recht gut dokumentiert, so dass sich damit relativ einfach
    Skalierung/Intervalle/Achsenbeschriftungen/Legenden der Grafik konfigurieren lassen. Das kann man alles in einem Shell-Skript unterbringen und dann ebenfalls in die
    crontab eintragen, um die Grafik halb- oder viertelstündlich zu aktualisieren. Das ist ressourcen-schonender als die Plots "on-the-fly" zu generieren; außerdem ändern sich
    Zimmertemperatur und Luftfeuchte meist nicht abrupt, so daß keine Notwendigkeit für "on-the-fly" besteht.

    Hier zeigt sich dann auch der Vorteil einer SQL-Datenbank gegenüber dem Speichern der Messwerte in einer CSV Datei. Mit einem geeigneten SQL-Query kann man nämlich
    unerwünschte Messwerte herausfiltern, z.B. Aussreißer nach oben oder unten bzw. Zeilen mit fehlenden Werten, falls der DHT22 mal keine Daten geliefert hat (Sowas könnte
    man zwar schon mit dem Python-Skript abfangen, bevor in die Datenbank geschrieben wird, aber ich sammele lieber die Rohdaten, weil man daran besser einschätzen kann,
    wie zuverlässig die Sensoren arbeiten).

    Das Skript ist auf den ersten Blick zwar Komplex, besteht im Wesentlichen aber nur aus Formatierungsanweisungen für die Legenden und Achsbeschriftung. Zunächst sorgt es dafür,
    dass ein Datensatz (hier die Messwerte der letzten 24 Stunden) aus der Datenbank exportiert werden. Die Werte landen in einer CSV-Datei. Diese wird anschließend von GNUPlot verwendet.

    Damit die X-Achse korrekt beschriftet wird, muss man sich noch um den Offset der UNIX-Epoch-Time kümmern. Die Unix-timestamp zählt die Sekunden, die seit dem 01.01.1970 vergangen sind.
    GNUplot zählt jedoch ab dem 01.01.2000. Damit GNUplot ein korrektes Datum aus der timestamp errrechnet, muss der Offset entsprechend korrigiert werden. Leider ist das recht schlecht
    dokumentiert, so dass ich mich beim Entwickeln des Skripts zunächst über die 30 Jahre Differenz zum aktuellen Datum gewundert habe ... :s

    Das folgende Skript erzeugt einen Plot aus Messwerten von einem DHT22 und BMP085 und berechnet zudem noch den Taupunkt. Für Eure Zwecke müsst Ihr es natürlich anpassen.
    Beispiele für die Plots kann man auf meinem Blog in der "Sensor Gallery" besichtigen.

    Spoiler anzeigen

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!