ich habe ein Setup mit einem einfachen Code, was zunächst auch fehlerfrei funktioniert. Aber nach einer zufälligen Zeit steigen die DHT22-Sensoren aus und es kommt statt Temperaturmesswert und Feuchtemesswert nur noch nan (ausgabe im serial port zeigt nan als Messwert) an.
Das Setup:
SainSmart Mega 2560, mit Netzteil 5V betrieben
3 Stück DHT22 (mit Platine und 3 Pins), angeschlossen mit ca. 4m Kabel, Querschnitt ca 0,5mm²
I2C Analogausgangsbaugruppe von Horter und Kalb; 0-10V; Mit Netzteil 12V betrieben
Das Programm liest die drei Sensoren aus, wobei momentan nur ein Sensorsignal weiterverarbeitet wird. Je nach Temperatur dieses Sensors wird ein 0-10V-Signal ausgegeben, zur Drehzahlsteuerung eines Lüfters.
Wie gesagt es funktioniert nur eine gewisse Zeit, dann bringen die DHT22 nur noch "nan".
Ist dieses Problem bekannt? Kann mir irgendjemand helfen?
Anbei der Code:
//Inklusion der Bibliothek DHT.h für die Sensoren
// DHT sensor library - Version: Latest
#include <DHT.h>
#include <Wire.h>
#define I2C_AOUT_ADDR 222 >> 1 // I2HAA-Addresse als 7 Bit (Alle Jumper oben)
#define DHT_Innen_PIN 2 //Anschlusspin Sensor Innen DHT22
#define DHT_Zuluft1_PIN 3 //Anschlusspin Sensor Zuluft1 DHT22
#define DHT_Zuluft2_PIN 4 //Anschlusspin Sensor Zuluft2 DHT22
#define DHTTYPE DHT22 //DHT 22 (AM2302)
//Variablen Analogausgang I2C von Horter und Kalb
int AW_CH0=400; // Analogwert Kanal 1
int AW_CH1=0; // Analogwert Kanal 2
int AW_CH2=0; // Analogwert Kanal 3
int AW_CH3=0; // Analogwert Kanal 4
byte LBy=0; // Low-Byte
byte HBy=0; // High-Byte
//Variablen für Drehzahlsteuerung
int iMinDrehzahl = 400; //entspricht 1V, 66m³/h (1V)
int iMaxDrehzahl = 800; //entspricht 1V, 660m³/h (10V)
DHT dht_Innen(DHT_Innen_PIN, DHTTYPE); //Initialisierung der DHTs
DHT dht_Zuluft1(DHT_Zuluft1_PIN, DHTTYPE); //Initialisierung der DHTs
DHT dht_Zuluft2(DHT_Zuluft2_PIN, DHTTYPE); //Initialisierung der DHTs
void setup() {
Serial.begin(9600); // Öffnet die serielle Schnittstelle bei 9600 Bit/s:
dht_Innen.begin();
dht_Zuluft1.begin();
dht_Zuluft2.begin();
Wire.begin(); // I2C-Pins definieren
}
void loop() {
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
//Auslesen der Klimasensoren
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
// Wait a few seconds between measurements.
delay(5000);
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
//Auslesen Sensor 1
float fLuftfeuchteInnen = dht_Innen.readHumidity();
// Read temperature as Celsius
float fTemperaturInnen = dht_Innen.readTemperature();
//Auslesen Sensor 2
float fLuftfeuchteZuluft1 = dht_Zuluft1.readHumidity();
// Read temperature as Celsius
float fTemperaturZuluft1 = dht_Zuluft1.readTemperature();
//Auslesen Sensor 3
float fLuftfeuchteZuluft2 = dht_Zuluft2.readHumidity();
// Read temperature as Celsius
float fTemperaturZuluft2 = dht_Zuluft2.readTemperature();
// Check if any reads failed and exit early (to try again).
if (isnan(fLuftfeuchteInnen) || isnan(fTemperaturInnen)) {
Serial.println("Failed to read from DHT sensor 'Innen'!");
return;
}
// Check if any reads failed and exit early (to try again).
if (isnan(fLuftfeuchteZuluft1) || isnan(fTemperaturZuluft1)) {
Serial.println("Failed to read from DHT sensor 'Zuluft1'!");
return;
}
// Check if any reads failed and exit early (to try again).
if (isnan(fLuftfeuchteZuluft2) || isnan(fTemperaturZuluft2)) {
Serial.println("Failed to read from DHT sensor 'Zuluft2'!");
return;
}
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
//ENDE Auslesen der Klimasensoren
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
//Drehzahlsteuerung
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
// lineare Berechnung des Sollwertes: y=m*x+b=66,67*x-1200 (mit 24°C-->400 und 30°C-->800)
AW_CH0=(fTemperaturInnen*66.67)-1200;
if (AW_CH0<iMinDrehzahl){AW_CH0=iMinDrehzahl;}
else if (AW_CH0>iMaxDrehzahl){AW_CH0=iMaxDrehzahl;}
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
//ENDE Drehzahlsteuerung
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
//Ansteuerung Analogausgang
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
//Analogausgang 1 ansteuern
// Spannung am Ausgang 1 z.B. 2,5V
HBy = AW_CH0 / 256; //HIGH-Byte berechnen
LBy = AW_CH0 - HBy * 256; //LOW-Byte berechnen
Wire.beginTransmission(I2C_AOUT_ADDR); // Start Übertragung zur ANALOG-OUT Karte
Wire.write(0); // Kanal schreiben
Wire.write(LBy); // LOW-Byte schreiben
Wire.write(HBy); // HIGH-Byte schreiben
Wire.endTransmission(); // Ende
delay(20);
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
//ENDE Ansteuerung Analogausgang
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
//Ausgabe im Serial Monitor
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
// \t ist gleich TAB
// ..ln ist gleich carriage return / neue Zeile nach Ausführung
Serial.print("LuftfeuchtigkeitInnen: ");
Serial.print(fLuftfeuchteInnen);
Serial.println(" %\t");
Serial.print("TemperaturInnen: ");
Serial.print(fTemperaturInnen);
Serial.println(" *C");
Serial.print("LuftfeuchtigkeitZuluft: ");
Serial.print(fLuftfeuchteZuluft);
Serial.println(" %\t");
Serial.print("TemperaturZuluft: ");
Serial.print(fTemperaturZuluft);
Serial.println(" *C ");
Serial.print("Sollwert Lüfter: ");
Serial.println(AW_CH0);
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
//ENDE Ausgabe im Serial Monitor
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
}
Datt ging flott.
Mach einfach eine 1 dahinter. Also fLuftfeuchteZuluft1.
Ich gestehe ich habe die Mittelwertbildung der Zuluftsensoren 1 und 2 herausgenommen, um code für euch zu sparen. Die Sensoren hatten starke Abweichungen und der Mittelwert hat etwa gepasst...
Ich weiss schon, wie das geht.
Aber es ist nicht der Code, den Du verwendest. Oder Du erklärst, das dieses Phänomen auch nur mit einem Sensor auftriit.
Und das tauschen eben diesem Sensor kein Erfolg brachte.
Haben deine Sensoren einen Pullup-Widerstand ?
Wie groß ist der ?
Kann der Fehler behoben werden, und wenn ja, wie ?
Tritt das Problem auch ohne Lüfter und I2C-Modul auf ?
Moin,
ich habe die DHT22 Ausführung mit Platine. Da ist Widerstand drauf. Der Wert ist unbekannt.
Kann ich mal messen.
Ohne I2C-Modul und Lüfter habe ich noch nicht getestet. Kann ich mal machen.
N'abend, habe nur noch einen DHT22 angeschlossen und habe die Leitungen zu den Sensoren und zum Lüfter getrennt verlegt (waren vorher zusammen im Rohr verlegt) . Hat nicht geholfen. Habe auch nochmal alle 3 DHT22 einzeln versucht. Immer noch "nan"....
Morgen schaue ich, wie es sich ohne I2C-Gerät verhält. GN8
4m Leitung sind schon was, wurde versuchen den Pullup runter zeichen am DHT noch einen 10K Widerstand dran damit die Flanken saubrer werden Im DB gehen Die sogar bis 1K Runter
Hi,
bei mir laufen seit ca. 6 Jahren DHT22 Sensoren an alten Leitungen der Heizungsteuerung.
Sind weit mehr als 4m. Ich habe an jedem Sensor 1 Kondensator mit 4,7 µF und am entferntesten Sensor noch einen Widerstand von 4k7 Ohm an die Datenleitung.
Läuft Stabil. Nur manchmal beim Schalten von Licht kommt kurz ein "nan".