ESP8266 und DHT22 Sensor "nan" bei Fehler in der Datenübertragung

Hallo zusammen,
ich habe eine Frage zur Thematik DHT22 Sensor an einem ESP8266.

Der Sensor ist mit 3,3V versorgt, 1m Leitungslänge und am Sensor ist ein 1µF Kondensator , sowie der 4,7k Pull Up. Die 3,3 V kommen sauber am DHT22 an.

Nun breche ich mal auf das wesentliches zusammen.
Sagen wir der Einfachheit, ich habe ein Skript mit nur einem DHT22, mehr nicht.
Im Setup nur den DHT und im Loop mit 2 Sek. Delay die Sensorabfrage.

Das funktioniert sehr gut, aber 1 bis 2x von 100 oder so bringt der Wert "nan" in der Anzeige oder auf dem Serial Monitor und nicht den Sensorwert.

Das scheint auch im gewissen Maße normal zu sein.

Meine Frage ist, wie kann ich das "nan" einfangen zum auswerten ?
Der DHT22 Wert ist als Float definiert.
Dabei erscheint dann ab und zu "nan" statt der Wert.
Ich hab vieles probiert den "nan" einzufangen, auch mit char usw.

Leider bisher alles erfolglos.

Also die Frage lautet:
Wie kann ich ein "nan" eines DHT22 als "Variable" einfangen und weiterverarbeiten um
einen Fehlercounter o.ä. damit bedienen.

Viele Grüße
R.

https://www.cplusplus.com/reference/cmath/isnan/

Wie wäre es mit einfach testen?

Hallo,

ich weiß nicht was du mit einfangen meinst. Aber nan bedeutet "not a number". Das heißt deine Variable wird vermutlich durch irgendeine Rechnung mit einem ungültigen Wert beschrieben. Aus eigener Erfahrung kann ich sagen das es bei mir eine Division durch 0 war die zu "nan" führte.

Ja so ist es.
"einfangen" =nan als Wert in eine Varibale zu bekommen.
Und die Berechnung ist irgendwo in der Lib des DHT22 , ich ruf nur die Funktion auf.
Das Isnan oben scheint der richtige Weg zu sein, aber ich verstehe es noch nicht so ganz.

  dht.begin();                 
  float DHT22Temp = dht.readTemperature();
  float DHT22RH   = dht.readHumidity();

Whandall ,wie meinst du das mit den testen genau?

  if (isnan(meinFloat)) {
    Serial.println(F("irgendwas ist mit meinFloat falsch gelaufen."));
    meinFloat = sicherheitsWert;
 }

Wirf das delay() raus und stad dessen millis()
such hach delay() ersetzen loswerden
danach ist das nan Geschichte, oder Du hast irgendwo losen Kontakt
Grüße

Hallo ,

oder sowas , dann wird der falsche nicht genommen

if (isnan( dht.readTemperature() ==0 )) float DHT22Temp = dht.readTemperature();

Heinz

Was für Bibliothek benutzt Du?
im meinem Fall

[code]
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C LCD(0x3F, 16, 2);
#include "DHT.h"

#define DHTPIN 13
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

#include <IRremote.h>
IRrecv irrecv(2); // Ausgangs-Pin von TSOP4838 (IR)
decode_results results;


unsigned long previousMillis = 0; // speichert den Zeitpunkt an dem zuletzt geschalten wurde 0;
const long intervall = 5000;

void setup() {
  Serial.begin(9600);
  LCD.init();
  LCD.backlight();
  dht.begin();
  irrecv.enableIRIn();
}

void loop() {
  //IR /////
  unsigned int IRwert = results.value;
  if (irrecv.decode(&results)) {
    irrecv.decode(&results);
    Serial.println(IRwert,HEX);
    irrecv.resume();
  }
  if (IRwert == 14535) LCD.noBacklight();
  if (IRwert == 57375) LCD.backlight();
  LCD.setCursor(0, 0);

  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= intervall) // Falls mehr als 2000 ms vergangen sind
  {
    previousMillis = currentMillis; // Zeitpunkt der letzten Schaltung wird festgehalten

    float h = dht.readHumidity();
    float t = dht.readTemperature();
    LCD.print (F("Temp.  "));
    LCD.print(t , 1 );
    LCD.print((char)223);//  /223=° Grad Zeichen
    LCD.print(F("C"));

    LCD.setCursor(0, 1);
    LCD.print (F("rh:    "));
    LCD.print((int)h);
    LCD.print(F(".0 %"));
  }
}
[/code]

gibst keine nan
mit anderen schon öfters.
Ok ist für Uno, mega nano

hi egal ob milli oder delay... das nan kommt trotzdem.
Wo sehe ich die Version der Lib des DHT 22 den genau ?
--> "isnan" ist das das ganze Geheimniss ?
Das wäre ja ganz einfach, ich werde es probieren und euch berichten

Gruss Rainer

such nach

DHT_sensor_library

meine habe die vom GitHub
Grüße Bernhard

Ich könnte die in zip verpacken und hier einfügen, aber das sollte man nicht machen

...klappt noch nicht, ich mache morgen weiter und berichte euch.
schönen Abend noc.h..

bei der Libary ändert man #define DHTTYPE DHT11`
auf

#define DHTTYPE DHT22

Hallo,
erstmal sorry das ich mich so spät wieder melde.
Ich bin erst heute wiedr zum "basteln" gekommen.

Ich habe wie folgt probiert:
PS: ( nicht wundern ich habe mittweile den DHT als T5 deklariert.)

if (isnan( dht.readTemperature() ==1 )) 
  {
    T5  = dht.readTemperature();
    Error_T5 = Error_T5 +1;
  }

Sollte jetzt nicht der Error_T5 bei einem "nan" hochzählen ?
Er macht es nicht. Ich habe in der If ... auch schon 0 und 1 probiert. Ohne Erfolg.

Liebe Grüße
Rainer

Hallo
Wo hast du denn die Variable deklariert und wo zeigst du sie an
Geltungsbereich von Variablen beachten
Heinz

Hallo ,
die entsprechenden Variablen habe ich vor dem Void Setup deklariert.
Die T5 Abfrage ist innerhalb der Void loop.

Der Wert des Sensors wird auch zu 99% sauber angezeigt. ( an einem SPI Display ... )
... gleiches gilt bei "nan" auch das wird angezeigt....

T5 als float
Error T5 als INT

Das "nan" kann ich jetzt durch einfaches abstecken des DHT22 Sensors auslösen.
Also, wenn der Sensor nicht angeschlossen ist kommt auch das "nan".

Was genau meinst du mit Geltungsbereich ?

Ich habe jetzt kurz so probiert, das der Zähler nach jeder Messung hochzählt, das geht.
Dann scheint es nicht wegen der "Erfassung" des "nan" zu liegen , oder ?

if (isnan( dht.readTemperature() ==0 )) 
  {
    T5  = dht.readTemperature();
    Error_T5 = (Error_T5 +1);
  }
  
    Error_T5 = (Error_T5 +1);

und wieder zurück.. auf:

if (isnan( dht.readTemperature() ==1 )) 
  {
    T5  = dht.readTemperature();
    Error_T5 = (Error_T5 +1);
  }
  

Viele Grüße
Rainer

Habe gerade was im Web gefunden, gelesen.... probiere und berichte gleich.

.... funktioniert :grinning: :grinning: :grinning:

Eure Tips mit "isnan" waren genau was ich gesucht habe...

Vielen herzlichen Dank für den Anstoß zu isnan.

so geht es:

T5            = dht.readTemperature();
delay(50);   
H1            = dht.readHumidity();  
delay(50);                               

if (isnan(T5) || isnan(H1))                 // DHT isnan Fehlerzähler
  {
    Error_T5 = (Error_T5 +1);
  }

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.