DHT22-Sensor kalibrieren ?

Hallo,

ich hab jetzt seit einigen Wochen einen DHT22-Sensor im Freien und zeichne damit im Halbstundentakt Temperatur und Feuchtigkeit auf.
Jetzt fällt mir aber auf, dass seit der ersten Messung die Messwerte um ca. 2 Grad von den Sensoren meines Homematic-Sensors abweichen.
Zur Evaluierung hab ich seit gestern abend einen DS18B20 daneben liegen und die beiden Sensoren weichen um konstant 2.2 Grad voneinander ab.
Das ist wahrscheinlich im Rahmen der Messungenauigkeit des DHT22 ok.

Meine Frage:
Ist es möglich den DHT22 zu kalibrieren, dass es von selbst den Messfehler berücksichtigt ?
Oder muss ich einfach den Messfehler DIESES Sensors im Programm mit einer Konstante von -2 abziehen ?

lG
Gawan

Was sagt denn das Datenblatt darüber?

Ich kann mich schwach erinnern, darüber mal gelesen zu haben:

"measurement error: +-2 degrees"

Ist aber schon etwas her und habe mich daher für den "DS18B20" entschlossen.
Temperatur war erst mal wichtig.

Ja, Messungenauigkeit von 2 Grad - soweit ok.

Aber kann ich das irgendwie dauerhaft kalibrieren oder muss ich manuell im Programm "dreinpfuschen" ?

Kurz mal klugscheißen: was Du möchtest ist nicht kalibrieren, sondern abgleichen :smiling_imp:

Das geht bei den Dingern nicht, also ab mit den Korrekturen in den Sketch.
Ob natürlich Dein Homematic Sensor und der DS so akkurat sind ... wer weiß das schon.

Gawan:
Ja, Messungenauigkeit von 2 Grad - soweit ok.

Aber kann ich das irgendwie dauerhaft kalibrieren oder muss ich manuell im Programm "dreinpfuschen" ?

Leider kenne ich den nicht (weil andern gewählt).
Aber ich denke, wenn sich das über längere Zeit gezeigt hat, im Code anpassen.

Klaus_ww:
Kurz mal klugscheißen: was Du möchtest ist nicht kalibrieren, sondern abgleichen :smiling_imp:

Ich würde eher sagen "korrigieren". :wink: :wink:

Hm, für mich ist das kalibrieren - dieser eine Baustein zeigt immer um 2 Grad zu wenig.
--> Drehe an einem Rädchen damit der immer 2 Grad mehr anzeigt
Ja, korrigieren passt auch :slight_smile:

Der Homematic und der DS decken sich zumindest gegenseitig und decken sich auch mit den offiziellen Temperaturen der diversen Wetter-Services.
Natürlich ist dabei auch der Montageort relevant (an der Wand, in der Sonne, etc.) aber tendenziell möchte ich dass mein Außensensor die "offizielle" Temperatur zeigt :slight_smile:

Gawan:
Hm, für mich ist das kalibrieren - dieser eine Baustein zeigt immer um 2 Grad zu wenig.
--> Drehe an einem Rädchen damit der immer 2 Grad mehr anzeigt

Klick

Einfach 2 Grad addieren ist die einfachste - und einzige - Lösung.

Dann enden wir bei "Justierung" :smiley:

Einverstanden :slight_smile:

Die DHT22 und vor allem auch der DHT11 sind "Schätzeisen"
Denke mal, du hast diesen Sensor nicht nur zur Temperaturmessung gewählt, sondern auch für die Messung der rel. Luftfeuchte.

Diese Werte sind auch nicht wirklich genau, wenn schon die Temperaturmessung nicht genau ist kein Wunder.

Wenn du die Temperaturabweichung softwaremässig justieren willst, braucht es zuerst eine Messreihe bei verschiedenen Temperaturen.

Wenn dies linear ist, dann einfach addieren oder subtrahieren.
Bei !linear, die Stützpunkte wo eine größere Änderung(Integral groß an dieser Stelle) stattfindet ermitteln.

Dann hast du eine Tabelle. (zweidimensionales array)
Aus dieser kannst du mit linearer Interpolation den Wert ermitteln, der dem tatsächlichen Wert am Nächsten kommt.

Ein Beispiel der linearen Interpolation von guntherb (es ist schon verstanden was da gemacht wird)
schaut so aus.
Das musst du natürlich auf deine Bedürfnisse anpassen. (Die Messreihe im Array ändern)

int gettime (unsigned long time)
{    

  
  const int Tablength = 8;
  const int Tab[Tablength][2]={ 
                        {5,300},                          
                        {13,250 },                        
                        {15,130},                      
                        {20,100 },                    
                        {30,80 },                   
                        {40,40 },                 
                        {50,10},                                              
                       {200,1 },                 
                               };                                 
                                  
                                  
         if (time>200) time=200;
               if (time<5) time=5;                                                        
                int _MoD=time;
      

            // In Tabelle das passende Wertepaar suchen
      int i = 0;
      while (i < Tablength && _MoD > Tab[i][0])  i++;  
      
       
      // aus dem ermittelten Wertepaar und dem nächsten darüber den korrekten Wert interpolieren
      int _out = (   ((Tab[i][1] - Tab[i-1][1])*( _MoD - Tab[i-1][0] ))
      		 	  / (Tab[i][0] - Tab[i-1][0] ))
     		 + Tab[i-1][1];      
  
     
     return _out;
}

Hallo,
kurze Frage.
Ihr sagt: Einfach 2 Grad addieren ist die einfachste - und einzige - Lösung.

Das habe ich auch versucht - habe aber im Sketch nicht den richtigen Punkt gefunden, an dem ich die Addition einfüge.

Kann mir einer helfen wie und wo ich das machen kann?

Vielen Dank für Eure Hilfe.

kunbsi:
Hallo,
kurze Frage.
Ihr sagt: Einfach 2 Grad addieren ist die einfachste - und einzige - Lösung.

Das habe ich auch versucht - habe aber im Sketch nicht den richtigen Punkt gefunden, an dem ich die Addition einfüge.

Kann mir einer helfen wie und wo ich das machen kann?

Vielen Dank für Eure Hilfe.

Dann müssen wir raten, da wir deinen Sketch nicht kennen.

Da wo du deinen Wert auf das Display schreibst.

Hallo,
ich habe das richtig gelesen? Du nutzt einen DHT22?

Der nimmt die Temperatur mit einer Toleranz von ±0,2°C auf.
Bei der Feuchtigkeit sind es ±2%rF

Der DS18BS20 nimmt die Temperatur mit einer Toleranz von ±0,5°C auf.

Nun möchtest Du, das Deine Sensoren die "offizielle" Temperatur anzeigen.
Das ist so nicht möglich.

Gruß und Spaß
Andreas

Genau,
ich habe einen DHT22 an einem Uno Wifi der Temperatur und Luftfeuchtigkeit als Server anzeigt. Die Temperatur ist im vergleich OK, die Luftfeuchtigkeit muss angepasst werden, liegt aber in der angegeben Toleranz.

Der Sketch ist der folgende:

/*********
  Rui Santos
  Complete project details at http://randomnerdtutorials.com  
*********/

// Including the ESP8266 WiFi library
#include <ESP8266WiFi.h>
#include "DHT.h"

// Uncomment one of the lines below for whatever DHT sensor type you're using!
//#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321

// Replace with your network details
const char* ssid = "xxxxxx";
const char* password = "xxxxxxxx";

// Web Server on port 80
WiFiServer server(80);

// DHT Sensor
const int DHTPin = 5;
// Initialize DHT sensor.
DHT dht(DHTPin, DHTTYPE);

// Temporary variables
const int ex = 7;
static char celsiusTemp[7];
static char fahrenheitTemp[7];
static char humidityTemp[7];


// only runs once on boot
void setup() {
  // Initializing serial port for debugging purposes
  Serial.begin(115200);
  delay(10);

  dht.begin();
  
  // Connecting to WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  
  // Starting the web server
  server.begin();
  Serial.println("Web server running. Waiting for the ESP IP...");
  delay(10000);
  
  // Printing the ESP IP address
  Serial.println(WiFi.localIP());
}

// runs over and over again
void loop() {
  // Listenning for new clients
  WiFiClient client = server.available();
  
  if (client) {
    Serial.println("New client");
    // bolean to locate when the http request ends
    boolean blank_line = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        
        if (c == '\n' && blank_line) {
            // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
            float h = dht.readHumidity();
            // Read temperature as Celsius (the default)
            float t = dht.readTemperature();
            // Read temperature as Fahrenheit (isFahrenheit = true)
            float f = dht.readTemperature(true);
            // Check if any reads failed and exit early (to try again).
            if (isnan(h) || isnan(t) || isnan(f)) {
              Serial.println("Failed to read from DHT sensor!");
              strcpy(celsiusTemp,"Failed");
              strcpy(fahrenheitTemp, "Failed");
              strcpy(humidityTemp, "Failed");         
            }
            else{
              // Computes temperature values in Celsius + Fahrenheit and Humidity
              float hic = dht.computeHeatIndex(t, h, false);       
              dtostrf(hic, 6, 2, celsiusTemp);             
              float hif = dht.computeHeatIndex(f, h);
              dtostrf(hif, 6, 2, fahrenheitTemp);         
              dtostrf(h, 6, 2, humidityTemp);
              // You can delete the following Serial.print's, it's just for debugging purposes
              Serial.print("Humidity: ");
              Serial.print(h);
              Serial.print(" %\t Temperature: ");
              Serial.print(t);
              Serial.print(" *C ");
              Serial.print(f);
              Serial.print(" *F\t Heat index: ");
              Serial.print(hic);
              Serial.print(" *C ");
              Serial.print(hif);
              Serial.print(" *F");
              Serial.print("Humidity: ");
              Serial.print(h);
              Serial.print(" %\t Temperature: ");
              Serial.print(t);
              Serial.print(" *C ");
              Serial.print(f);
              Serial.print(" *F\t Heat index: ");
              Serial.print(hic);
              Serial.print(" *C ");
              Serial.print(hif);
              Serial.println(" *F");
            }
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html");
            client.println("Connection: close");
            client.println();
            // your actual web page that displays temperature and humidity
            client.println("<!DOCTYPE HTML>");
            client.println("<html>");
            // client.println("<head></head><body><h1>ESP8266 von J E N S</h1><h3>Temperature in Celsius: ");
            client.println("<head></head><body><h1>ESP8266 von J E N S</h1><h3>Temperatur in Celsius: ");
            client.println(celsiusTemp);
            client.println("*C</h3><h3>Revidierte Luftfeuchtigkeit: ");
            client.println(humidityTemp - 7 ); // ORG FahrenheitTemp
            client.println("%</h3><h3>Luftfeuchtigkeit: ");
            client.println(humidityTemp);
            client.println("%</h3><h3>");
            client.println("</body></html>");     
            break;
        }
        if (c == '\n') {
          // when starts reading a new line
          blank_line = true;
        }
        else if (c != '\r') {
          // when finds a character on the current line
          blank_line = false;
        }
      }
    }  
    // closing the client connection
    delay(1);
    client.stop();
    Serial.println("Client disconnected.");
  }
}

Die "revidierte Luftfeuchtigkeit" soll den angepassten Wert anzeigen.
Im vergleich habe ich einen Messfehler von minus sieben.
Auf dauer möchte ich dann auch weiter vergleichen ob der Wert immer der gleiche bleibt.

Vielen Dank Euch aber schon mal für die schnellen Antworten.

kunbsi:
Genau,
ich habe einen DHT22 an einem Uno Wifi der Temperatur und Luftfeuchtigkeit als Server anzeigt. Die Temperatur ist im vergleich OK, die Luftfeuchtigkeit muss angepasst werden, liegt aber in der angegeben Toleranz.

Die "revidierte Luftfeuchtigkeit" soll den angepassten Wert anzeigen.
Im vergleich habe ich einen Messfehler von minus sieben.
Auf dauer möchte ich dann auch weiter vergleichen ob der Wert immer der gleiche bleibt.

Vielen Dank Euch aber schon mal für die schnellen Antworten.

Womit willst Du denn den Wert der Luftfeuchtigkeit im laufenden Betrieb vergleichen?

Gruß Tommy

Mit einem Luftfeuchtemessgerät aus dem Supermarkt und dem Luftfeuchtsensor im Luftrockner.
Brauche das alles um die Luftfeuchtigkeit im Keller im Auge zu behalten.

Im Grunde ist das nachträgliche Berechnen des Wertes nicht wirklich schwer - habe es nur leider noch nicht hinbekommen.

Du meinst, die sind genauer, als der DHT22? Ein Meßgerät, mit dem man ein anderes kalibriert, sollte etwa um den Faktor 10 genauer sein. Das schaffen die nie.

Gruß Tommy