Ardo Luftfeuchtigkeit Kammer DHT22 und 4 Kanal Relais

Hallo zusammen.

Ich bin blutiger Programmier-Anfänger und zerbreche mir schon seit einigen Tagen den Kopf.
Hier im Forum habe ich mich neu angemeldet, da ich das Forum sehr toll finde.

Ich habe jetzt schon viel in Foren und Google etc. gelesen und nach Fehlern gesucht,
und hoffe jetzt so auf eure Unterstützung.

Den Code habe ich nicht selber geschrieben, sondern abkopiert und angepasst.

#include "DHT.h" //DHT Bibliothek laden

#define DHTPIN 2 //Der Sensor wird an PIN 2 angeschlossen    

#define DHTTYPE DHT22    // Es handelt sich um den DHT22 Sensor

#define HEATERRELAY 8;   // Heizung an Relay

#define FOGGERRELAY 9;   // Luftbefeuchter an Relay


DHT dht(DHTPIN, DHTTYPE); //Der Sensor wird ab jetzt mit „dth“ angesprochen

void setup() {
  Serial.begin(9600); //Serielle Verbindung starten

  dht.begin(); //DHT22 Sensor starten
}

void loop() {
  
  delay(2000); //Zwei Sekunden Vorlaufzeit bis zur Messung (der Sensor ist etwas träge)

  
  float Luftfeuchtigkeit = dht.readHumidity(); //die Luftfeuchtigkeit auslesen und unter „Luftfeutchtigkeit“ speichern
  
  float Temperatur = dht.readTemperature();//die Temperatur auslesen und unter „Temperatur“ speichern
  
  Serial.print("Luftfeuchtigkeit: "); //Im seriellen Monitor den Text und 
  Serial.print(Luftfeuchtigkeit); //die Dazugehörigen Werte anzeigen
  Serial.println(" %");
  Serial.print("Temperatur: ");
  Serial.print(Temperatur);
  Serial.println(" Grad Celsius");

delay(2000);


if(dht.readHumidity < 80)
{
  digitalWrite(FOGGERRELAY, HIGH);
}
else
{
  digitalWrite(FOGGERRELAY, LOW);
}




}

Ich habe einen Arduino uno, einen DHT22 Sensor und ein 4 Kanals Relay Modul (Songle 10A 250VAC SRD-05CBD-SL-C)

Leider habe ich ständig nur Fehlermeldungen und komme nicht weiter.
Ziel ist es eine Nebelkammer mit konstanter vorgegebenen Luftfeuchtigkeit zu erreichen. Sagen wir mal RLF 80%.

Der DHT22 soll das Relay mit den Luftbefeuchter einschalten wenn eine gewisse RLF unterschritten wird, und ausschalten
eine gewisse RLF errreicht ist.

Und ganz schöne währe natürlich noch, wenn an einem Relay ein paar mal am Tag für kurze Zeit einen Umlüfteter geschalten
wird.

Ich habe noch etwas von Hysterese gelesen, ich weis was es bedeutet aber bin nicht sicher oh ich es wirklich benötige.

Vielen Dank schonmal für eure Hilfe und Zeit.

Gruss Francesco

Was hast du für Fehlermeldungen?

Hysterese brauchst du, sonst ist das Relais permanent am arbeiten, sobald die Luftfeuchtigkeit unter 80% sinkt.

79% -> Relais an
81% -> Relais aus

Und das schwankt aber so sehr, dass das Relais nur permanent am klicken ist.

Hysterese könnte so aussehen:

if(dht.readHumidity <= 70)
{
  digitalWrite(FOGGERRELAY, HIGH);
}
if(dht.readHumidity >= 80)
{
  digitalWrite(FOGGERRELAY, LOW);
}

Musst du halt entscheiden, wieviel % RLF dazwischen liegen "dürfen/sollen/können".

Vielen Dank, das werde ich dann gleich mal mit einbinden..

Fehlermeldungen habe ich diese hier:

C:\Users\fw.KCS\Documents\Arduino\foggbox\foggbox.ino: In function 'void loop()':

foggbox:39: error: invalid use of member function (did you forget the '()' ?)

if(dht.readHumidity < 80)

                      ^

foggbox:9: error: expected ')' before ';' token

#define FOGGERRELAY 9;   // Luftbefeuchter an Relay

                     ^

C:\Users\fw.KCS\Documents\Arduino\foggbox\foggbox.ino:41:16: note: in expansion of macro 'FOGGERRELAY'

  digitalWrite(FOGGERRELAY, HIGH);

               ^

foggbox:41: error: expected primary-expression before ',' token

  digitalWrite(FOGGERRELAY, HIGH);

                          ^

foggbox:9: error: expected ')' before ';' token

#define FOGGERRELAY 9;   // Luftbefeuchter an Relay

                     ^

C:\Users\fw.KCS\Documents\Arduino\foggbox\foggbox.ino:45:16: note: in expansion of macro 'FOGGERRELAY'

  digitalWrite(FOGGERRELAY, LOW);

               ^

foggbox:45: error: expected primary-expression before ',' token

  digitalWrite(FOGGERRELAY, LOW);

                          ^

exit status 1
invalid use of member function (did you forget the '()' ?)

fraenggi:
foggbox:39: error: invalid use of member function (did you forget the '()' ?)

if(dht.readHumidity < 80)

Du hast die Klammer vergessen:
if(dht.readHumidity() < 80)

hmmm, steht ja da sogar in der Fehlermeldung drin :astonished:
vielen Dank.

Habe den Code jetzt mal so angepasst:

#include "DHT.h" //DHT Bibliothek laden

#define DHTPIN 2 //Der Sensor wird an PIN 2 angeschlossen    

#define DHTTYPE DHT22    // Es handelt sich um den DHT22 Sensor

#define HEATERRELAY 8;   // Heizung an Relay

#define FOGGERRELAY 9;   // Luftbefeuchter an Relay


DHT dht(DHTPIN, DHTTYPE); //Der Sensor wird ab jetzt mit „dth“ angesprochen

void setup() {
  Serial.begin(9600); //Serielle Verbindung starten

  dht.begin(); //DHT22 Sensor starten
}

void loop() {
  
  delay(2000); //Zwei Sekunden Vorlaufzeit bis zur Messung (der Sensor ist etwas träge)

  
  float Luftfeuchtigkeit = dht.readHumidity(); //die Luftfeuchtigkeit auslesen und unter „Luftfeutchtigkeit“ speichern
  
  float Temperatur = dht.readTemperature();//die Temperatur auslesen und unter „Temperatur“ speichern
  
  Serial.print("Luftfeuchtigkeit: "); //Im seriellen Monitor den Text und 
  Serial.print(Luftfeuchtigkeit); //die Dazugehörigen Werte anzeigen
  Serial.println(" %");
  Serial.print("Temperatur: ");
  Serial.print(Temperatur);
  Serial.println(" Grad Celsius");

delay(2000);


if(dht.readHumidity () <= 70)
{
  digitalWrite(FOGGERRELAY, HIGH);
}
if(dht.readHumidity () >= 80)
{
  digitalWrite(FOGGERRELAY, LOW);
}




}

Fehlermeldungen sind aber immer noch einige da:

C:\Users\fw.KCS\Documents\Arduino\foggbox\foggbox.ino: In function 'void loop()':

foggbox:9: error: expected ')' before ';' token

 #define FOGGERRELAY 9;   // Luftbefeuchter an Relay

                      ^

C:\Users\fw.KCS\Documents\Arduino\foggbox\foggbox.ino:41:16: note: in expansion of macro 'FOGGERRELAY'

   digitalWrite(FOGGERRELAY, HIGH);

                ^

foggbox:41: error: expected primary-expression before ',' token

   digitalWrite(FOGGERRELAY, HIGH);

                           ^

foggbox:9: error: expected ')' before ';' token

 #define FOGGERRELAY 9;   // Luftbefeuchter an Relay

                      ^

C:\Users\fw.KCS\Documents\Arduino\foggbox\foggbox.ino:45:16: note: in expansion of macro 'FOGGERRELAY'

   digitalWrite(FOGGERRELAY, LOW);

                ^

foggbox:45: error: expected primary-expression before ',' token

   digitalWrite(FOGGERRELAY, LOW);

                           ^

exit status 1
expected ')' before ';' token

Bitte lerne die Grundlagen !

Ein "#define" darf nicht mit einem Semikolon abgeschlossen werden.

Und setze zukünftig Sketch und Fehlermeldungen in Code-Tags.

Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Das kannst du auch nachträglich machen.
Dazu den Sketch markieren und die Schaltfläche klicken.

Damit wird dieser für alle besser lesbar.

Vielen Danke, ich habe es auch gerade gemerkt,

Nach anpassen hatte ich keine Fehlermeldung mehr, jedoch im Seriellen Monitor die Ausgabe:

Lufsius
nan Grad Celsius
Luftfeuchtigkeit: nan %
Temperatur: nan Grad Celsius
Luftfeuchtigkeit: nan %
Temperatur: nan Grad Celsius
Luftfeuchtigkeit: nan %

Danke für den Hinweis für das lernen der Basics, da bin ich ja gerade dabei und hoffe auf Unterstützung.
Aber wenn ich erst fragen stellen darf wenn ich die Basic beherrsche, dann akzeptiere ich das natürlich auch...

Vielen Dank, jetzt hat es geklappt bzw. es gib die richtige Temp und RLF aus.

Ich haben den DHT22 gewechselt, vermutlich ist einer defekt.

Ich werde es heute Abend dann mal testen und berichte dann wie es aussieht.

Ein Lob, ich hätte nicht gedacht das hier sooo schnell geholfen wird, ist wirklich Top das Forum. Danke.

fraenggi:
Nach anpassen hatte ich keine Fehlermeldung mehr, jedoch im Seriellen Monitor die Ausgabe:

Danke für den Hinweis für das lernen der Basics, da bin ich ja gerade dabei und hoffe auf Unterstützung.
Aber wenn ich erst fragen stellen darf wenn ich die Basic beherrsche, dann akzeptiere ich das natürlich auch...

Diese Meldung ist mir nicht bekannt, kommt vermutlich aus der Library weil kein Sensor gefunden wird.

Wie hast du den Sensor angeschlossen ?

Das mit den Basics ist nur ein Hinweis, dennoch darfst du weiter Fragen.

Edit:
OK, hat sich überschnitten.

In deinem Kode fehlt im setup das pinMode für das Relais.

#include "DHT.h" //DHT Bibliothek laden

#define DHTPIN 2 //Der Sensor wird an PIN 2 angeschlossen    

#define DHTTYPE DHT22    // Es handelt sich um den DHT22 Sensor

#define HEATERRELAY 8   // Heizung an Relay

#define FOGGERRELAY 9   // Luftbefeuchter an Relay


DHT dht(DHTPIN, DHTTYPE); //Der Sensor wird ab jetzt mit „dth“ angesprochen

void setup() {
  Serial.begin(9600); //Serielle Verbindung starten

  dht.begin(); //DHT22 Sensor starten


digitalWrite(HEATERRELAY, LOW);
digitalWrite(FOGGERRELAY, LOW);
pinMode(HEATERRELAY, OUTPUT);
pinMode(FOGGERRELAY, OUTPUT);



  
}

void loop() {
  
  delay(1000); //Zwei Sekunden Vorlaufzeit bis zur Messung (der Sensor ist etwas träge)

  
  float Luftfeuchtigkeit = dht.readHumidity(); //die Luftfeuchtigkeit auslesen und unter „Luftfeutchtigkeit“ speichern
  
  float Temperatur = dht.readTemperature();//die Temperatur auslesen und unter „Temperatur“ speichern
  
  Serial.print("Luftfeuchtigkeit: "); //Im seriellen Monitor den Text und 
  Serial.print(Luftfeuchtigkeit); //die Dazugehörigen Werte anzeigen
  Serial.println(" %");
  Serial.print("Temperatur: ");
  Serial.print(Temperatur);
  Serial.println(" Grad Celsius");

delay(1000);


if(dht.readHumidity() <= 50)
{
  digitalWrite(FOGGERRELAY, HIGH);
}
if(dht.readHumidity() >= 55)
{
  digitalWrite(FOGGERRELAY, LOW);
}




}

pinMode habe ich so hinzugefügt.
Die beiden Relais sind jetzt immer on (LEDs leuchten), egal was für Luftfeuchtigkeit (nur mit anhauchen getestet).

Normalerweise sollte man die Werte die die DHT-Lib zurückgibt auf ihre Gültigkeit prüfen.
So steht es auch im Beispielprogramm !

  float t;
  float h;
 
  t = dht.readTemperature();
  h = dht.readHumidity();

 if (isnan(t) || isnan(h)) {
    Serial.println("Failed to read from DHT");
  }
  else
  {
     Serial.println("Einer von beiden Werten ist keine gültige Zahl!");
  }

Die DHT-Lib gibt im Fehlerfall einen ungültigen Floatwert zurück, also NAN->Not a number.

Genau das sagt auch dein serial.println NAN.

Ulli

Den Pinmode sollte man allerdings setzen bevor man einen Wert auf den Pin schreibt !!!

Ulli

Die meisten Relaisboards für den Arduino schalten "Ein" wenn du sie auf GND schaltest, sprich auf LOW.

Evlt musst du in deiner IF das HIGH und LOW tauschen.

Außerdem solltest du im setup erst den pinMode definieren, dann das digitalWrite ausführen.

Ich vermute du willst die Relais im setup ABSCHALTEN? Deswegen musst du sie (wie oben geschrieben) auf HIGH setzen.

außerdem macht es mehr sinn, die Variablen "Luftfeuchtigkeit" und "Temperatur" in deiner IF zu benutzen.

if(Luftfeuchtigkeit <= 50)
{
  digitalWrite(FOGGERRELAY, LOW); // Auf LOW schalten, damit das Relais AN geht
}
if(Luftfeuchtigkeit >= 55)
{
  digitalWrite(FOGGERRELAY, HIGH); // Auf HIGH schalten, damit das Relais AUS geht
}

Außerdem solltest du anstelle von delay() lieber millis() nutzen, siehe auch die Nachtwächter erklärung

#include "DHT.h" //DHT Bibliothek laden

#define DHTPIN 2 //Der Sensor wird an PIN 2 angeschlossen    

#define DHTTYPE DHT22    // Es handelt sich um den DHT22 Sensor

#define HEATERRELAY 8   // Heizung an Relay

#define FOGGERRELAY 9   // Luftbefeuchter an Relay

#define OUTGOINGFAN 11  // Abluft, für gelegentliche Luftumwälzung


DHT dht(DHTPIN, DHTTYPE); //Der Sensor wird ab jetzt mit „dth“ angesprochen

void setup() {
  Serial.begin(9600); //Serielle Verbindung starten

  dht.begin(); //DHT22 Sensor starten


digitalWrite(HEATERRELAY, HIGH);  //setze Pin auf Aus
digitalWrite(FOGGERRELAY, HIGH);  //setze Pin auf Aus
digitalWrite(OUTGOINGFAN, HIGH);  //setze Pin auf Aus
pinMode(HEATERRELAY, OUTPUT);     //setze Pin auf Output
pinMode(FOGGERRELAY, OUTPUT);     //setze Pin auf Output
pinMode(OUTGOINGFAN, OUTPUT);     //setze Pin auf Output



  
}

void loop() {
  
  delay(1000); //Eine Sekunden Vorlaufzeit bis zur Messung (der Sensor ist etwas träge)

  
  float Luftfeuchtigkeit = dht.readHumidity(); //die Luftfeuchtigkeit auslesen und unter „Luftfeutchtigkeit“ speichern
  
  float Temperatur = dht.readTemperature();//die Temperatur auslesen und unter „Temperatur“ speichern
  
  Serial.print("Luftfeuchtigkeit: "); //Im seriellen Monitor den Text und 
  Serial.print(Luftfeuchtigkeit); //die Dazugehörigen Werte anzeigen
  Serial.println(" %");
  Serial.print("Temperatur: ");
  Serial.print(Temperatur);
  Serial.println(" Grad Celsius");

delay(1000);


if(Luftfeuchtigkeit  <= 55)
{
  digitalWrite(FOGGERRELAY, LOW); //LOW = Relais An
}
if(Luftfeuchtigkeit  >= 60)
{
  digitalWrite(FOGGERRELAY, HIGH); //HIGH = Relais Aus

delay(1000);


}
 


}

Vielen Dank an alle, jetzt sieht es gut aus. Ich werde die Kammer über Nacht testen und hoffe das alles klappt.

Hier nochmals der Code falls es jemandem hilft.

Woher bezieht ihr die Annahme dass es sich um ein active-LOW Relaisboard handelt?

Die im OT angegebene Bezeichnung ist nur für das Relais, wenn Optokoppler drauf sind
(wie auf der Platine mit dem angegebenen Relais die ich gefunden habe),
dann ist die Logik nicht unbedingt umgekehrt.

meister_q:
Außerdem solltest du im setup erst den pinMode definieren, dann das digitalWrite ausführen.

Nicht unbedingt, aber wenn dann sollte vorher ein HIGH geschrieben werden um ein kuzes Anziehen
beim Setzen von pinMode zu unterdrücken (bei active-LOW).

Ich sagte ja auch nur bei den Arduinoboards, nicht bei den Relais. Er muss es halt selbst rausfinden.

Und da er sagte, die LEDs leuchten permanent, und im setup wurde auf LOW gezogen, hab ich das so interprätiert.

Nun, sollte nicht der Mode des Pins VOR der Ansteuerung erfolgen? Rein logisch und der übersichtlichkeit halber zumindest.

Mit dem Schreiben des PORT Registers wird im INPUT der PULLUP aktiviert,
das PORT Bit bleibt aber auch gesetzt, wenn der Mode auf OUTPUT gesetzt wird.
Das verhindert ein anfängliches unbeabsichtigtes Aktivieren des Relais (mit active-LOW).

Es hat alles wunderbar funktioniert, bzw. die Kammer ist jetzt im Testlauf für ein paar Tage.

Was ich noch nicht ganz begriffen habe ist, ich möchte das ein Umluftventilator alle Stunde für 30 sec.
läuft, dann ausschaltet. Unabhängig von allem anderen. Wenn ich dies jedoch im bestehenden Loop
Teil schreibe und das mit delaiy für 30sec. an und 1h warten, bleibt ja die ganze Messung für 1h
stehen. Kann ich einfach einen zweiten loopteil einbinden der dann unabhängig arbeitet?

Oder mache ich eine ganz falsche überlegung?

fraenggi:
Oder mache ich eine ganz falsche überlegung?

Ja, du denkst immer noch in delay(). Einfach einstellen.

(uncompiled, ungetestet)

  static unsigned long letzteBelueftung;
  static unsigned long luefterGestartet;

  if (millis() - letzteBelueftung >= 60L*60*1000) {
    luefterGestartet = millis();
    // Luefter einschalten
  }
  if (luefterGestartet && (millis() - luefterGestartet >= 30*1000)) {
    //Luefter ausschalten
    luefterGestartet = 0;
  }