2 DHT11 zeigen unterschiedliche Werte

Nachdem ich die ersten Probleme mit Hilfe dieses hervorragenden Forums lösen konnte habe ich 2 DHT11 und ein 2 Zeilen Display an den UNO angeschlossen.
Was mich als Neuling wundert die Sensoren sind auf dem Steckbrett 4 cm auseinander,zeigen aber unterschiedliche werte an.
Den Code habe ich im WWW gefunden und auf meine Bedürfnisse angepasst.


Da kommt bestimmt die Frage zum Code .

/*  Original Code von Dräger IT 
    Anpassung an DHT11
    am 3.3.25 
    erweitert 2'tes Relais
              2'ten Sensor
*/
//Bibliothek zum speichern & lesen von Daten
//aus dem internen Speicher
#include <EEPROM.h>

//Bibliothek zum entprellen eines Tasters
#include <Bounce2.h>

//Bibliotheken um mit dem LCD-Display zu
//kommunizieren
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

//DHT Bibliothek um den Temperatursensor
//DHT11 auszulesen
#include "DHT.h"  //DHT Bibliothek wird laden


//Die Relais sind an den digitalen Pins D10 / D11 angeschlossen.
#define relais 10
#define relais1 11


//Der Sensor ist an PIN 2 (D2) angeschlossen
#define DHTPIN 2
//Der Sensor ist an PIN 2 (D2) angeschlossen
#define DHTPIN1 4
//Es handelt sich um den DHT11 Sensor
#define DHTTYPE DHT11

//Taster "select" am digitalen Pin D12 angeschlossen.
#define tasterSelect 7  // #### 12 gegen 7
//Taster "hoch" am digitalen Pin D5 angeschlossen.
#define tasterHoch 8  // #### 5 gegen 8
//Taster "runter" am digitalen Pin D2 angeschlossen.
#define tasterRunter 12  // #### 2 gegen 12


//minimale Temperatur
int minTemp, minTemp1 = 18;
//maximale Temperatur
int maxTemp, maxTemp1 = 22;
//aktuelle Temperatur
int currentTemp, currentTemp1;

//Bounce2 Objekte für die Taster
Bounce btnSelect = Bounce();
Bounce btnUp = Bounce();
Bounce btnDown = Bounce();

//Intervall für das entprellen der Taster
const int BTN_INTERVALL = 25;

//Auswahl
//0 - min. Temperatur einstellen
//1 - max. Temperatur einstellen
//2 - aktuelle Temperatur
//3 - min. Temperatur1 einstellen
//4 - max. Temperatur1 einstellen
//5 - aktuelle Temperatur
int auswahl = 5;

// Initialisieren des LCD Displays mit der I2C Adresse 0x27
LiquidCrystal_I2C lcd(0x27, 20, 2);

// Initialisieren des Tempsensors wird mit „dht" initiiert
DHT dht(DHTPIN, DHTTYPE);
// Initialisieren des Tempsensors wird mit „dht" initiiert
DHT dht1(DHTPIN1, DHTTYPE);

//Intervall in welcher der Sensor gelesen werden soll
const int INTERVALL = 2000;
//Feld zum speichern des Zeitstempels der letzten Aktualisierung.
long lastUpdate = 0L;

const int ADRESSE_MINTEMP = 30;
const int ADRESSE_MAXTEMP = 40;

void setup() {

  //der Pin des Relais als Ausgang definieren
  pinMode(relais, OUTPUT);
  pinMode(relais1, OUTPUT);

  // Eingefügt
  Serial.begin(9600);  //Serielle Verbindung starten 9600
                       //lief mit 115600 nicht weil nicht eingestellt
  dht.begin();         //DHT Sensor starten
  dht1.begin();        //DHT Sensor starten
  // ######################


  //beginn der Kommunikation mit dem LCD-Display
  lcd.init();
  lcd.backlight();

  //Initialisieren der Taster
  //die Taster sind über den internen 10 kOhm Widerstand verbunden
  btnSelect.attach(tasterSelect, INPUT_PULLUP);
  btnSelect.interval(BTN_INTERVALL);

  btnUp.attach(tasterHoch, INPUT_PULLUP);
  btnUp.interval(BTN_INTERVALL);

  btnDown.attach(tasterRunter, INPUT_PULLUP);
  btnDown.interval(BTN_INTERVALL);

  //lesen der Werte aus dem internen Speicher
  //beim erstmaligen Upload sind die Werte -1
  minTemp = readFromEEPROM(ADRESSE_MINTEMP);
  maxTemp = readFromEEPROM(ADRESSE_MAXTEMP);

  writeLcdDisplay();
}

void writeToEEPROM(int adresse, int wert) {
  EEPROM.write(adresse, wert >> 8);
  EEPROM.write(adresse + 1, wert & 0xFF);
}

int readFromEEPROM(int adresse) {
  return (EEPROM.read(adresse) << 8) + EEPROM.read(adresse + 1);
}

//Schreibt eine Zeile auf dem Display
void printTextAt(int lineNumber, int column, String text) {
  lcd.setCursor(column, lineNumber);
  lcd.print(text);
}

//Beschreibt das Display mit Text in abhängigkeit mit der
//aktuellen Auswahl.
void writeLcdDisplay() {
  lcd.backlight();
  lcd.clear();
  if (auswahl < 2) {
    printTextAt(0, 0, auswahl == 0 ? ">" : " ");
    printTextAt(1, 0, auswahl == 1 ? ">" : " ");

    printTextAt(0, 1, "min. Temp.:" + String(minTemp, DEC));
    printTextAt(1, 1, "max. Temp.:" + String(maxTemp, DEC));
  } else if (auswahl == 2) {
    printTextAt(0, 0, " max. Temp.:" + String(maxTemp, DEC));
    printTextAt(1, 0, ">akt. Temp.:" + String(currentTemp, DEC));
  } else if (auswahl == 3) {
    printTextAt(0, 0, ">min1. Temp.:" + String(minTemp1, DEC));
    printTextAt(1, 1, "max1. Temp.:" + String(maxTemp1, DEC));
  } else if (auswahl == 4) {
    printTextAt(0, 1, "min1. Temp.:" + String(minTemp1, DEC));
    printTextAt(1, 0, ">max1. Temp.:" + String(maxTemp1, DEC));
  } else if (auswahl == 5) {
    printTextAt(0, 0, "akt.  Temp.:" + String(currentTemp, DEC));
    printTextAt(1, 0, "akt1. Temp.:" + String(currentTemp1, DEC));
  } else {
  }

  //schreiben der Werte für minTemp & maxTemp in den internen Speicher
  // gilt nur für Temp nicht zugefügt Temp1
  writeToEEPROM(ADRESSE_MINTEMP, minTemp);
  writeToEEPROM(ADRESSE_MAXTEMP, maxTemp);
}

void loop() {

  //aktualisieren der Taster
  btnSelect.update();
  btnUp.update();
  btnDown.update();

  //Wenn der Taster "select" gedrückt wurde, dann...
  if (btnSelect.fell()) {
    if (auswahl < 6) {
      auswahl++;
    } else {
      auswahl = 0;
    }

    writeLcdDisplay();
  }

  //Wenn der Taster "hoch" gedrückt wurde, dann...
  if (btnUp.fell()) {
    if (auswahl == 0) {
      minTemp += 1;
    } else if (auswahl == 1) {
      maxTemp += 1;
    } else if (auswahl == 3) {
      minTemp1 += 1;
    } else if (auswahl == 4) {
      maxTemp1 += 1;
    }
    writeLcdDisplay();
  }

  //Wenn der Taster "runter" gedrückt wurde, dann...
  if (btnDown.fell()) {
    if (auswahl == 0) {
      minTemp -= 1;
    } else if (auswahl == 1) {
      maxTemp -= 1;
    } else if (auswahl == 3) {
      minTemp1 -= 1;
    } else if (auswahl == 4) {
      maxTemp1 -= 1;
    }
    writeLcdDisplay();
  }

  //Wenn der Zeitpunkt der letzten Ausführung plus dem Wert
  //des INTERVALLs kleiner als die aktuellen Millisekunden sind, dann...
  if ((lastUpdate + INTERVALL) < millis()) {

    //auslesen der Temperatur in Grad Celsius
    float a = dht.readTemperature();
    // wandeln des float wertes
    // in integer
    currentTemp = (int)a;
    //auslesen der Temperatur in Grad Celsius
    float a1 = dht1.readTemperature();
    // wandeln des float wertes
    // in integer
    currentTemp1 = (int)a1;
    //überschreiben des Wertes für die letzte Ausführung
    lastUpdate = millis();

    //nur wenn die Auswahl auf 5 steht dann soll das LCD-Display aktualisiert werden
    //(Auswahl 5 zeigt die aktuelle Temperatur an)
    if (auswahl == 5) {
      writeLcdDisplay();
    }

    //Wenn die gelesene Temperatur kleiner / gleich als der Wert der Konstante MIN_TEMP ist,
    //dann soll das Relais aktiviert werden.
    if (currentTemp <= minTemp) {
      digitalWrite(relais, LOW);
      Serial.println("min");
    } else if (currentTemp >= maxTemp) {
      //Ist der gelesene Wert jedoch größer / gleich als der Wert der Konstante MAX_TEMP so
      //soll das Relais deaktiviert werden.
      digitalWrite(relais, HIGH);
      Serial.println("max");
    }
    if (currentTemp1 <= minTemp1) {
      digitalWrite(relais1, LOW);
      Serial.println("min1");
    } else if (currentTemp >= maxTemp) {
      //Ist der gelesene Wert jedoch größer / gleich als der Wert der Konstante MAX_TEMP so
      //soll das Relais deaktiviert werden.
      digitalWrite(relais1, HIGH);
      Serial.println("max1");
    }
    // Ausgabe zum Test
    Serial.println(a);
    Serial.println(a1);
    Serial.println(currentTemp);
    //Serial.println(minTemp);
    //Serial.println(maxTemp);
    Serial.println(auswahl);
    //Serial.println();
    //
  }
}

Gruß Walter

Noch nicht ganz.
Dein Bedürfnis ist doch, rauszufinden, warum die beiden Sensoren unterschiedliche Werte anzeigen. Da musst du also erstmal noch viel mehr Zeugs rausschmeissen, und dich dann genauer um die Messwerte kümmern.

Ich sehe nur eine 21 und eine 22. Das ist erstmal nur der kleinstmögliche Unterschied überhaupt.
Eine genauere Analyse, welche unterschiedlichen Daten die Sensoren liefern, und welche Abweichung im normalen Bereich ist, wäre schon erforderlich.

Grundsätzlich sagt der ganzzahlige Temperaturwert nichts über die Differenz aus. Sind die Werte gerundet oder sind die Nachkommastellen abgeschnitten? Die Differenz könnte alles zwischen 0.000...1 und 1 sein. Weiterhin sollte man berücksichtigen, dass die Billig-Temperatursensoren nicht kalibriert sind, sie weisen immer Abweichungen auf. Ich habe mehrere DS18B20 im einsatz, die ebenfalls erhebliche Abweichungen haben. Um das auszugleichen, habe ich die Temperaturen, mit einem 'normalen' Thermometer verglichen und verwende die Differenz als Offset zur Temperatur des Sensors. Unter der Annahme, dass die Abweichung halbwegs linear ist, habe ich so annähernd gleiche Temperaturen.

Aber nach dir keine Gedanken. Genauer wird es mit den "billigen" Teilen nichts. Die haben leider die schlechteste Qualität.

Wenn man 5 für 2€ kauft kein Wunder.
Originale kosten über 2€ das Stück, die sind kalibriert, alle zeigen das gleiche.

Stell das hier mal auf gelöst da es wohl an den Sensoren an sich liegt,ich fuchse mich dann mal weiter durch die unendliche Arduino Welt.
Gruß Walter

Hallo walter_meister

Wie sehen die Temperatur Werte im FP-Format aus ?

Laut Datenblatt von Reichelt hat der DHT11 bei der Temperaturmessung eine Genauigkeit von +/- 2 Grad. Genauer wird's halt nicht. Wie ich schon geschrieben hatte, da der TO ja aktuell nur einen ganzzahligen Wert anzeigt, könnte die tatsächliche Differenz bei ihm irgendwo zwischen 0.0625 und 1 Grad bewegen, wenn der DHT11 die gleiche Auflösung besitzt wie der DS18B20 (der laut Datenblatt von Dallas und Maxim übrigens eine Genauigkeit zwischen +/- 0,5 und +/-2 Grad haben soll, präziser gibt's den DS18B20 wohl auch nicht). Wem das nicht reicht, der muss eben Sensoren in Labor-Qualität nehmen.

Ich würde das Testen mit den Sensoren.

Dazu einfach ein Minimal-Aufbau machen. Und ein Demo-Programm starten.
Je minimaler desto besser.

EIN Sensor einstecken und auslesen.
Dann den anderen Sensor einstecken und Auslesen.

Daneben ein "richtiges" Thermometer legen.

Auf die Weiße weiß ich was ich von jeden Sensor halten kann /muss. :wink:
Und kann nebenbei Kalibrierungswerte errechnen.

Gruß

Pucki

Aber kein Thermometer vom Reste-Wühl-Tisch.

Gruß Tommy

Danke für den Tip
Dies mein Versuch.
Im Serialmonitor sehe ich nichts was mir weiterhilft.

18:09:40.545 -> DHT = nan

18:09:40.578 -> DHT1 = 11.30

18:09:40.578 -> LM35 = 22

18:09:43.615 -> DHT = nan

18:09:43.615 -> DHT1 = nan

//DHT Bibliothek um den Temperatursensor
//DHT11 auszulesen
#include "DHT.h"  //DHT Bibliothek wird lalen
//Der Sensor ist an PIN 2 (D2) angeschlossen
#define DHTPIN 2
//Der Sensor ist an PIN 2 (D4) angeschlossen
#define DHTPIN1 4
//Es handelt sich um den DHT11 Sensor
#define DHTTYPE DHT11
//Der Sensor LM35 ist an PIN 0 (A0) angeschlossen
int LM35 = 0;


// Initialisieren des Tempsensors wird mit „dht" initiiert
DHT dht(DHTPIN, DHTTYPE);
// Initialisieren des Tempsensors wird mit „dht" initiiert
DHT dht1(DHTPIN1, DHTTYPE);


void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
float a = dht.readTemperature();
float b = dht1.readTemperature();
int c = analogRead(LM35);
// der LM35 geht von -55 bis 150 grad in 1 grad 
// Schritten 
// der Analog eingang 0 - 1023 
// hab dann dies gefunden
// T = Wert * 5 * 100/1024
// und die 5 durch 2.8 ersetzt 
int d = (c*2.8*100)/1024.0;

Serial.print(" DHT = ");
Serial.println(a);
Serial.print("DHT1 = ");
Serial.println(b);
Serial.print("LM35 = ");
Serial.println(d);
delay (3000);
}

Gruß Walter

Dass dieser Sensor nichts liefert, sieht man. Was deine lib sonst noch liefern könnte, sagt dir deine Bibliothek DHT.h

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