ich hatte bei einem DHT22 ständig sporadisch Meßfehler, also deutlich niedrigere Werte, durchaus mehrfach am Tag.
Zuerst hattte ich den Zeitabstand bei den Messungen im Verdacht, da der DHT22 im Gegensatz zum DHT11 einen Abstand von 2 Sekunden hat, der DHT11 nur 500 Millisekunden.
Daraufhin hatte ich die Library "sensors/Dht.h" angepasst:
Code: Alles auswählen
else if( measure > 0 ) {
if (TYPE == DHT11) {
_delay_ms(500);
} else {
_delay_ms(2500);
}
...
Dann habe ich eine Anpassung der Messung selbst vorgenommen, die die Meßfehler ausblendet. Dazu wird die prozentuale Abweichung zum letzten Meßwert ermittelt und entsprechend der zurück gegebene Meßwert gemittelt. Eventuell overkill, aber jetzt habe ich eine recht saubere, glatte Linie.
Code: Alles auswählen
if (!dht.measure()) {
DPRINTLN(F("DHT measurement NOT ok."));
} else {
uint16_t delta_h = 0;
if ( (!firstloop) && (humidity != 0) ) { // after second measure calc abs difference in %
delta_h = int( abs( (100.0 * ((float)dht.humidity() / (float)humidity)) - 100.0));
// DPRINT(F("### gemessen : "));DDECLN(dht.humidity());
// DPRINT(F("### alter wert: "));DDECLN(humidity);
// DPRINT(F("### delta H% : "));DDEC(delta_h);DPRINTLN(F("%"));
}
if ( (delta_h > 10) && (delta_h <= 25) && (!firstloop) ) { // use interpolation when more than 10% and less than 25% difference
humidity = int( (humidity + ((dht.humidity() - humidity) * 0.3) ) );
} else if ( (delta_h > 25) && (!firstloop) ) { // vey small interpolation when more than 25% difference
humidity = int( (humidity + ((dht.humidity() - humidity) * 0.01) ) );
} else {
humidity = dht.humidity(); // no interpolation on firstloop or lessequal 10% diffference
}
....
}
Als Hinweis:
humidity ist die Variable aus dem Sketch, die als Wert im Telegramm zurückgegeben wird, sie wird danach nicht gelöscht und behält so den Wert der letzten Meßwertrückgabe,
firstloop ist eine bool Variable, die nur bei der ersten Messung true ist, da dann noch kein humidity-Wert vorhanden ist. Außerdem wird nicht durch humidity=0 geteilt, dann ist delta_h=0 und der Meßwert wird nicht interpoliert.
Viel Erfolg damit und
ciao
Harvey