Problem mit DHT22

Guten Abend Leutz…
ich sitze hier gerade ziemlich irritiert vor dem Sensor DHT22. Diesen möchte ich halt auslesen, eigentlich keine große Sache. Um dem Problem möglichst nahe zu kommen, habe ich das Programm auf das Nötigste heruntergebrochen:

#include "DHT.h"

DHT dht;

void setup(){
  Serial.begin(115200);
  Serial.println();
  Serial.println("Testprogramm");
  dht.setup(D5);
}

void loop(){
  delay(2000);
  String dhtStatus=dht.getStatusString();
  float humidity=dht.getHumidity();
  if(dhtStatus=="OK"){
    float temperature=dht.getTemperature();
    //float humidity=dht.getHumidity();
    Serial.println(temperature);
    Serial.println(humidity);
  }else{
    Serial.println("Error");
  }
}

Zunächst wird überprüft, ob der Sensor funktioniert. Ist dies der Fall, wird er ausgelesen und die Werte von Temperatur und Feuchtigkeit werden ausgegeben.
Das Problem: wird der Wert für die Feuchtigkeit IN der If-Anweisung (auskommentierte Zeile) ausgelesen, wird ein unrealistischer Wert (z.B.: 390961632.00) zurückgegeben. Nur wenn ich den Wert außerhalb dieser Anweisung auslese, bekomme ich den richtigen Wert. Auch wenn ich den Wert außerhalb auslese und in humidity einspeicher, und dann in der Anweisung mittels Serial.println(dht.getHumidity()); nochmal auslesen und ausgeben lasse, bekomme ich wieder (für beide Auslesemöglichkeiten) diese unrealistischen Werte.
Was mir noch aufgefallen ist: bei einem Arduino Uno funktioniert das einwandfrei, aber es soll auf NodeMCU (also einem ESP8266 12E) laufen…

Weiß Jemand woher dieser Fehler kommen könnte?

Hast Du evtl. eine ältere Lib? Die hier schein relativ aktuell zu sein.

Gruß Tommy

Hallo,

ich sehe in dem Sketch folgende Punkte bzw. ich sehe sie nicht:

Meines Wissens nach benötigt die DHT-Library die Mitteilung, an welchen Pin der Sensor angeschlossen ist. Außerdem ist die Library eine universelle Library für alle verfügbaren DHT Sensoren,also auch DHT11 und (wie der dritte DHT-Sensor heisst habe ich gerade vergessen).

Ich habe meine DHTs immer nach folgendem Schema an die Arbeit geschickt:

#include "DHT.h" //Einbinden der Bibliothek

#define DHTPIN 2 //Konstante mit der Nummer des Anschlußpin definieren

#define DHTTYPE DHT11 // Konstante mit dem Sensortyp als Inhalt definieren

DHT dht(DHTPIN, DHTTYPE); //Sensor initialisieren, und dabei dem Sensor den Namen "dht" zuweisen

DHT ist hierbei ein Schlüsselbegriff der Library und sollte von der IDE auch in orange gehighlighted werden.

Im Zweifel mal die anderen verfügbaren DHTs im Setup ausprobieren, ob dann sinnvolle Werte rauskommen. Ich hatte es leider auch schon, dass sich ein DHT22 von Opa Wu aus China im Nachhinein als DHT11 entpuppt hat, der als DHT22 angesprochen nur Unfug vermeldet, korrekt als DHT11 tituliert aber problemlos seinen Dienst versehen hat.

VG
Confused Electron

Diese Sensoren sind sehr Zeitkritisch.
Warum liest du die Werte nicht generell vor der “if-Abrage” aus und nur im Fehlerfall springst du per weiterer “if-Abfrage” in die Fehlermeldung.

So wird es auch in anderen Libraries für den DHT22 gelöst.

Danke für Eure Antworten soweit....

Hast Du evtl. eine ältere Lib? Die hier schein relativ aktuell zu sein.

-->Guter Einwand, in meinem Post war gar nicht ersichtlich, welche Library ich nutze, nämlich die hier.
Werde morgen denn mal diese Geschichte mit der Bibliothek von Adafruit versuchen.

Meines Wissens nach benötigt die DHT-Library die Mitteilung, an welchen Pin der Sensor angeschlossen ist.

-->Das wäre die Zeile dht.setup(D5);
Anscheinend hast Du eine andere Bibliothek, auch die Angabe des Typs ist angeblich nicht notwendig (bei meiner verwendeten Bibliothek), da der Sensor automatisch erkannt wird

Ich hatte es leider auch schon, dass sich ein DHT22 von Opa Wu aus China im Nachhinein als DHT11 entpuppt hat

-->Natürlich sehr ärgerlich^^ Aber ich glaube den Sensor kann ich ausschließen, er läuft immerhin am Uno, und ich hatte ihn zuvor schon über ein Jahr lang im Dauereinsatz :wink:

Diese Sensoren sind sehr Zeitkritisch.

-->Der Gedanke kam mir auch schon, habe dann in jede zweite Zeile ein delay(2000), gesetzt, gleiches Ergebnis. Im Umkehrschluss habe ich am Uno mal die Abfragen direkt hintereinander ausgeben lassen, nur ein delay(100) am Ende der loop()... hat ohne Probleme funktioniert

Warum liest du die Werte nicht generell vor der "if-Abrage" aus und nur im Fehlerfall springst du per weiterer "if-Abfrage" in die Fehlermeldung.

-->Darauf wird es wohl hinauslaufen müssen (wobei es noch wichtig wäre zu wissen, wie sich das Auslesen eines defekten Sensors auf den Programmablauf auswirkt), wobei mich die Ursache dieses Verhaltens dennoch interessiert, es scheint ja irgend ein Unterschied zwischen Arduino Uno und NodeMCU zu sein....

DerLehmi:
-->Darauf wird es wohl hinauslaufen müssen (wobei es noch wichtig wäre zu wissen, wie sich das Auslesen eines defekten Sensors auf den Programmablauf auswirkt), wobei mich die Ursache dieses Verhaltens dennoch interessiert, es scheint ja irgend ein Unterschied zwischen Arduino Uno und NodeMCU zu sein....

Das wird keine weiteren Auswirkungen haben. Die variable bleibt leer und anschließend läuft der Sketch in die Fehlermeldung.

Der Unterschied der beiden Controller liegt vermutlich auch in der Rechengeschwindigkeit.

Werde morgen denn mal diese Geschichte mit der Bibliothek von Adafruit versuchen

-->Habe ich mal gemacht, kann den Fehler damit nicht hervorrufen. Scheint also ein Problem der Bibliothek mit diesem Board zu sein...... Werde also bei der Adafruit-Bibliothek bleiben.

Der Unterschied der beiden Controller liegt vermutlich auch in der Rechengeschwindigkeit.

-->dann müsste der Fehler ja generell auftauchen....
Mir erschließt sich halt nicht der Unterschied, wenn ich den Sensor vor oder in der If-Anweisung auslese.... Eine Lösung hab ich ja nun, mich würde das dennoch interessieren^^