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, 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 '()' ?)
hmmm, steht ja da sogar in der Fehlermeldung drin
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
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.
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...
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.
#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.
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.
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).
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?