Ich habe mir eine kleine Bewässerungsanlage für mein Gewächshaus gebaut. Insgesamt 4 Kreisläufe, jeweils mit einem Feuchtigkeitssensor. Ich habe mir eine HTML Seite gebaut, dabei ist mir aufgefallen, das die Sperre immer wieder aktiv ist, obwohl das jeweilige Relais nicht aktiv war und der Wert nicht unter "Trocken" war, wenn der Kreislauf nicht deaktiviert wurde.
Woran liegt es?
Desweiteren ist es aktuell so, wenn der Arduino Neustartet, werden alle Relais am Tag eingeschaltet (wenn die Kreisläufe nicht per Schalter deaktiviert worden sind), obwohl der Feuchtigkeitswert passend ist, ich denke es liegt daran das er etwas länger braucht um die Wert auszuwerten, wie kann man das verhindern?
Hier mal der Sketch:
// Gewaechshauswebif v3.1 vom 28.06.2022
const byte LDR = 0; // LDR am Pin A0
const byte Feuchtigkeitssensor1pin = 1; // Anschluss des 1. Feuchtigkeitssensor am Pin A1
const byte Feuchtigkeitssensor2pin = 2; // Anschluss des 2. Feuchtigkeitssensor am Pin A2
const byte Feuchtigkeitssensor3pin = 3; // Anschluss des 3. Feuchtigkeitssensor am Pin A3
const byte Feuchtigkeitssensor4pin = 4; // Anschluss des 4. Feuchtigkeitssensor am Pin A4
const int MaximaleFeuchte = 320; // Maximaler Feuchtigkeitswert (kleinster Wert)
const int MinimaleFeuchte = 1025; // Minimaler Feuchtigkeitswert (größter Wert)
float Spanne; // Zum Berechnen der Spanne
const int Trocken = 25; // Wert ab dem Bewässert werden soll
float Prozent1; // Zum Berechnen der Feuchtigkeit in Prozent vom 1. Feuchtigkeitssensor
float Prozent2; // Zum Berechnen der Feuchtigkeit in Prozent vom 2. Feuchtigkeitssensor
float Prozent3; // Zum Berechnen der Feuchtigkeit in Prozent vom 3. Feuchtigkeitssensor
float Prozent4; // Zum Berechnen der Feuchtigkeit in Prozent vom 4. Feuchtigkeitssensor
int Schalter1 = 2; // Schalter zum Öffnen aller Ventile , am Pin D2
int Schalter2 = 3; // Schalter zum Deaktivieren des Kreislauf 1, am Pin D3
int Schalter3 = 4; // Schalter zum Deaktivieren des Kreislauf 2, am Pin D4
int Schalter4 = 5; // Schalter zum Deaktivieren des Kreislauf 3, am Pin D5
int Schalter5 = 6; // Schalter zum Deaktivieren des Kreislauf 4, am Pin D6
const byte Relais1pin = 7; // Relais 1 für den Kreislauf 1, am Pin D6
const byte Relais2pin = 8; // Relais 2 für den Kreislauf 2, am Pin D7
const byte Relais3pin = 9; // Relais 3 für den Kreislauf 3, am Pin D8
const byte Relais4pin = 19; // Relais 4 für den Kreislauf 4, am Pin A5
const int TAG = 20; // Wert ab dem der Tag beginnt
float sperre1restzeit = 0; // Berechnung der Zeit bis zum Ende der Sperrzeit 1
float sperre2restzeit = 0; // Berechnung der Zeit bis zum Ende der Sperrzeit 2
float sperre3restzeit = 0; // Berechnung der Zeit bis zum Ende der Sperrzeit 3
float sperre4restzeit = 0; // Berechnung der Zeit bis zum Ende der Sperrzeit 4
//Ethernet Shield
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0x00, 0x10, 0xFA, 0x6E, 0x28, 0x4A }; // MAC Adresse des Arduino Boards
EthernetServer server(80); // Port Einstellung (Standard für HTML : 80)
void setup ()
{
// Ethernet Shield
Ethernet.begin(mac); // Ethernet initialisieren
server.begin(); // Auf Clients warten
Serial.print("Arduino's IP Address: ");
Serial.println(Ethernet.localIP());
Serial.print("DNS Server's IP Address: ");
Serial.println(Ethernet.dnsServerIP());
Serial.print("Gateway's IP Address: ");
Serial.println(Ethernet.gatewayIP());
Serial.print("Network's Subnet Mask: ");
Serial.println(Ethernet.subnetMask());
Serial.begin(57600); // Serielle Schnittstelle initialisieren
pinMode(Feuchtigkeitssensor1pin, INPUT); // Pin Modus definieren, Eingang
pinMode(Feuchtigkeitssensor2pin, INPUT); // Pin Modus definieren, Eingang
pinMode(Feuchtigkeitssensor3pin, INPUT); // Pin Modus definieren, Eingang
pinMode(Feuchtigkeitssensor4pin, INPUT); // Pin Modus definieren, Eingang
pinMode(Relais1pin, OUTPUT); // Pin Modus definieren, Ausgang
pinMode(Relais2pin, OUTPUT); // Pin Modus definieren, Ausgang
pinMode(Relais3pin, OUTPUT); // Pin Modus definieren, Ausgang
pinMode(Relais4pin, OUTPUT); // Pin Modus definieren, Ausgang
pinMode(Schalter1, INPUT_PULLUP); // Schalter zum Öffnen aller Ventile
pinMode(Schalter2, INPUT_PULLUP); // Schalter zum Deaktivieren des Kreislauf 1
pinMode(Schalter3, INPUT_PULLUP); // Schalter zum Deaktivieren des Kreislauf 2
pinMode(Schalter4, INPUT_PULLUP); // Schalter zum Deaktivieren des Kreislauf 3
pinMode(Schalter5, INPUT_PULLUP); // Schalter zum Deaktivieren des Kreislauf 4
// Feuchtigkeit in Prozent umrechnen
Spanne = MinimaleFeuchte - MaximaleFeuchte; // Zum Berechnen der Spanne
}
void loop ()
{
int LDR1 = analogRead (0) * 1.0; // LDR1
int Feuchtigkeitssensor1pin = analogRead(1); // 1. Feuchtigkeitssensor
int Feuchtigkeitssensor2pin = analogRead(2); // 2. Feuchtigkeitssensor
int Feuchtigkeitssensor3pin = analogRead(3); // 3. Feuchtigkeitssensor
int Feuchtigkeitssensor4pin = analogRead(4); // 4. Feuchtigkeitssensor
int Schalter1Status = digitalRead(Schalter1); // Auslesen des Zustand vom Schalter1
int Schalter2Status = digitalRead(Schalter2); // Auslesen des Zustand vom Schalter2
int Schalter3Status = digitalRead(Schalter3); // Auslesen des Zustand vom Schalter3
int Schalter4Status = digitalRead(Schalter4); // Auslesen des Zustand vom Schalter4
int Schalter5Status = digitalRead(Schalter5); // Auslesen des Zustand vom Schalter5
Prozent1 = (100 / Spanne) * (MinimaleFeuchte - Feuchtigkeitssensor1pin); // Prozent berechnen für den 1. Feuchtigkeitssensor
Prozent2 = (100 / Spanne) * (MinimaleFeuchte - Feuchtigkeitssensor2pin); // Prozent berechnen für den 2. Feuchtigkeitssensor
Prozent3 = (100 / Spanne) * (MinimaleFeuchte - Feuchtigkeitssensor3pin); // Prozent berechnen für den 3. Feuchtigkeitssensor
Prozent4 = (100 / Spanne) * (MinimaleFeuchte - Feuchtigkeitssensor4pin); // Prozent berechnen für den 4. Feuchtigkeitssensor
if (Schalter1Status == LOW)
{
digitalWrite(Relais1pin, HIGH); // Relais 1 aktivieren
digitalWrite(Relais2pin, HIGH); // Relais 2 aktivieren
digitalWrite(Relais3pin, HIGH); // Relais 3 aktivieren
digitalWrite(Relais4pin, HIGH); // Relais 4 aktivieren
}
if (LDR1 < TAG && Schalter1Status == HIGH)
{
digitalWrite(Relais1pin, LOW); // Relais 1 deaktivieren
digitalWrite(Relais2pin, LOW); // Relais 2 deaktivieren
digitalWrite(Relais3pin, LOW); // Relais 3 deaktivieren
digitalWrite(Relais4pin, LOW); // Relais 4 deaktivieren
}
if (LDR1 >= TAG && Schalter1Status == HIGH) // Wenn es Tag ist
{
// 1. Kreislauf
if ((Feuchtigkeitssensor1pin >= Trocken) && (sperre1() == false) && (Schalter2Status == HIGH)) // Wenn die Bodenfeuchte kleiner oder gleich als Trocken ist, die Sperre1 nicht aktiv ist und Schalter 2 nicht aktiv ist
{
digitalWrite(Relais1pin, HIGH); // Relais1 aktivieren
}
if (digitalRead(Relais1pin) == HIGH)
{
static unsigned long laststart1;
if (millis() - laststart1 > 3800) // Bewässerungszeit 3,8s
{
laststart1 = millis();
digitalWrite(Relais1pin, LOW); // Relais1 deaktivieren
}
}
// 2. Kreislauf
if ((Feuchtigkeitssensor2pin >= Trocken) && (sperre2() == false) && (Schalter3Status == HIGH)) // Wenn die Bodenfeuchte kleiner oder gleich als Trocken ist, die Sperre2 nicht aktiv ist und Schalter 3 nicht aktiv ist
{
digitalWrite(Relais2pin, HIGH); // Relais2 aktivieren
}
if (digitalRead(Relais2pin) == HIGH)
{
static unsigned long laststart2;
if (millis() - laststart2 > 3800) // Bewässerungszeit 3,8s
{
laststart2 = millis();
digitalWrite(Relais2pin, LOW); // Relais2 deaktivieren
}
}
// 3. Kreislauf
if ((Feuchtigkeitssensor3pin >= Trocken) && (sperre3() == false) && (Schalter4Status == HIGH)) // Wenn die Bodenfeuchte kleiner oder gleich als Trocken ist, die Sperre3 nicht aktiv ist und Schalter 4 nicht aktiv ist
{
digitalWrite(Relais3pin, HIGH); // Relais3 aktivieren
}
if (digitalRead(Relais3pin) == HIGH)
{
static unsigned long laststart3;
if (millis() - laststart3 > 3800) // Bewässerungszeit 3,8s
{
laststart3 = millis();
digitalWrite(Relais3pin, LOW); // Relais3 deaktivieren
}
}
// 4. Kreislauf
if ((Feuchtigkeitssensor4pin >= Trocken) && (sperre4() == false) && (Schalter5Status == HIGH)) // Wenn die Bodenfeuchte kleiner oder gleich als Trocken ist, die Sperre4 nicht aktiv ist und Schalter 5 nicht aktiv ist
{
digitalWrite(Relais4pin, HIGH); // Relais4 aktivieren
}
if (digitalRead(Relais4pin) == HIGH)
{
static unsigned long laststart4;
if (millis() - laststart4 > 3800) // Bewässerungszeit 3,8s
{
laststart4 = millis();
digitalWrite(Relais4pin, LOW); // Relais4 deaktivieren
}
}
}
if (sperre1() == false)
{
sperre1restzeit = 0;
}
if (sperre2() == false)
{
sperre2restzeit = 0;
}
if (sperre3() == false)
{
sperre3restzeit = 0;
}
if (sperre4() == false)
{
sperre4restzeit = 0;
}
EthernetClient client = server.available(); //Prüfen, ob Client Seite aufruft
if (client)
{ // Seitenaufruf durch User
// Ausgabe in HTML
server.print(F("HTTP/1.1 200 OK\r\nServer: Arduino UNO R3\r\nContent-Type: text/html\r\n\r\n"
"<!DOCTYPE html>"
"<html lang='de'>"
"<head>"
"<meta charset='utf-8'>"
"<link rel=icon type=image/vnd.microsoft.icon href=http://IP DES NAS/Gfp.png>"
"<title>Gewächshausbewässerung</title>"
"</head>"
"<style>"
"body { background-image: url('http://IP DES NAS/Gewächshaus.png');"
"background-repeat: no-repeat;"
"background-attachment: fixed;"
"background-position: center;"
"</style>"
"<center><img src=http://IP DES NAS/Gfp2.png width=390 height=54><BR/>"
"<font size=7><strong>Gewächshausbewässerung</strong></font size><BR/><BR/>"
"<font size=5>LDR: "));
server.print(LDR1);
server.print(F("<BR/>Bewässerung: "));
server.print(LDR1 >= TAG ? "Ein" : "Aus");
server.print(F("<BR/>Schalter1 (Alle Ventile geöffnet): "));
server.print(Schalter1Status ? "Aus" : "Ein");
server.print(F("<BR/><BR/>"
"<table>"
"<table border=1>"
"<tr>"
"<td>Kreislauf</td>"
"<td align=right>1</td>"
"<td align=right>2</td>"
"<td align=right>3</td>"
"<td align=right>4</td>"
"</tr>"
"<tr>"
"<td>Kreislauf aktiv</td>"
"<td align = right>"));
server.print(Schalter2Status ? "Ein" : "Aus");
server.print(F("<td align = right>"));
server.print(Schalter3Status ? "Ein" : "Aus");
server.print(F("<td align = right>"));
server.print(Schalter4Status ? "Ein" : "Aus");
server.print(F("<td align = right>"));
server.print(Schalter5Status ? "Ein" : "Aus");
server.print(F("</tr>"
"<tr>"
"<td>Feuchtigkeit in %</td>"
"<td align = right>"));
server.print(Prozent1);
server.print(F("<td align = right>"));
server.print(Prozent2);
server.print(F("<td align = right>"));
server.print(Prozent3);
server.print(F("<td align = right>"));
server.print(Prozent4);
server.print(F("</tr>"
"<tr>"
"<td>Relaisstatus</td>"
"<td align = right>"));
server.print(digitalRead(Relais1pin) ? "Ein" : "Aus");
server.print(F("<td align = right>"));
server.print(digitalRead(Relais2pin) ? "Ein" : "Aus");
server.print(F("<td align = right>"));
server.print(digitalRead(Relais3pin) ? "Ein" : "Aus");
server.print(F("<td align = right>"));
server.print(digitalRead(Relais4pin) ? "Ein" : "Aus");
server.print(F("</tr>"
"<tr>"
"<td>Relaissperre</td>"
"<td align = right>"));
server.print(sperre1() ? "Aktiv" : "Inaktiv");
server.print(F("<td align = right>"));
server.print(sperre2() ? "Aktiv" : "Inaktiv");
server.print(F("<td align = right>"));
server.print(sperre3() ? "Aktiv" : "Inaktiv");
server.print(F("<td align = right>"));
server.print(sperre4() ? "Aktiv" : "Inaktiv");
server.print(F("</tr>"
"<tr>"
"<td>Rest Sperrzeit in Min.</td>"
"<td align = right>"));
server.print(sperre1restzeit);
server.print(F("<td align = right>"));
server.print(sperre2restzeit);
server.print(F("<td align = right>"));
server.print(sperre3restzeit);
server.print(F("<td align = right>"));
server.print(sperre4restzeit);
server.print(F("</tr>"
"</table>"
"</font size>"
"</center>"
"</body>"
"</html>"));
delay(500); // Kurzer Delay, um Daten zu senden
client.stop(); // Verbindung mit dem Client trennen
}
// Die Werte des Feuchtigkeitssensor Ausgeben
static unsigned long lastprint;
if (millis() - lastprint > 3000) // Testausgabe alle 3s
{
lastprint = millis();
Serial.print(F("LDR: ")); Serial.println(LDR1); // LDR oben links
Serial.print(F("Feuchtigkeitssensor1: ")); Serial.println(Feuchtigkeitssensor1pin); // 1. Feuchtigkeitssensor
Serial.print(Prozent1); Serial.println(F(" % "));
Serial.print(F("Feuchtigkeitssensor2: ")); Serial.println(Feuchtigkeitssensor2pin); // 2. Feuchtigkeitssensor
Serial.print(Prozent2); Serial.println(F(" % "));
Serial.print(F("Feuchtigkeitssensor3: ")); Serial.println(Feuchtigkeitssensor3pin); // 3. Feuchtigkeitssensor
Serial.print(Prozent3); Serial.println(F(" % "));
Serial.print(F("Feuchtigkeitssensor4: ")); Serial.println(Feuchtigkeitssensor4pin); // 4. Feuchtigkeitssensor
Serial.print(Prozent4); Serial.println(F(" % "));
Serial.print(F("Schalter 1: ")); Serial.println(Schalter1Status); // Zustand Schalter 1
Serial.print(F("Schalter 2: ")); Serial.println(Schalter2Status); // Zustand Schalter 2
Serial.print(F("Schalter 3: ")); Serial.println(Schalter3Status); // Zustand Schalter 3
Serial.print(F("Schalter 4: ")); Serial.println(Schalter4Status); // Zustand Schalter 4
Serial.print(F("Schalter 5: ")); Serial.println(Schalter5Status); // Zustand Schalter 5
Serial.print(F("Relais 1: ")); Serial.println(digitalRead(Relais1pin)); // Zustand Relais 1
Serial.print(F("Sperre Relais 1: ")); Serial.println(sperre1()); // Sperre Relais 1
Serial.print(F("Relais 2: ")); Serial.println(digitalRead(Relais2pin)); // Zustand Relais 2
Serial.print(F("Sperre Relais 2: ")); Serial.println(sperre2()); // Sperre Relais 2
Serial.print(F("Relais 3: ")); Serial.println(digitalRead(Relais3pin)); // Zustand Relais 3
Serial.print(F("Sperre Relais 3: ")); Serial.println(sperre3()); // Sperre Relais 3
Serial.print(F("Relais 4: ")); Serial.println(digitalRead(Relais4pin)); // Zustand Relais 4
Serial.print(F("Sperre Relais 4: ")); Serial.println(sperre4()); // Sperre Relais 4
Serial.print(F("Sperre 1 Restzeit:")); Serial.println(sperre1restzeit); // Restzeit der Sperre 1
Serial.print(F("Sperre 2 Restzeit:")); Serial.println(sperre2restzeit); // Restzeit der Sperre 2
Serial.print(F("Sperre 3 Restzeit:")); Serial.println(sperre3restzeit); // Restzeit der Sperre 3
Serial.print(F("Sperre 4 Restzeit:")); Serial.println(sperre4restzeit); // Restzeit der Sperre 4
}
}
bool sperre1()
{
static bool sperre1 = false;
const unsigned long sperrzeit = 1000UL * 60 * 25; // Sperrzeit von 25min
static unsigned long sperrStart = millis();
static bool lastZustand[1] = {HIGH};
uint8_t relaisPin[1] = {Relais1pin};
if (!sperre1) // Keine Sperre aktiv
for (byte b = 0; b < 1; b++)
{
if (lastZustand[b] != !digitalRead(relaisPin[b])) // Letzter Zustand weicht vom aktuellen ab
{
sperrStart = millis();
lastZustand[b] = !lastZustand[b];
sperre1 = true;
}
}
if (millis() - sperrStart > sperrzeit) sperre1 = false;
sperre1restzeit = (float) (sperrzeit - (millis() - sperrStart)) / 60000; // Ausgabe in Min
return sperre1;
}
bool sperre2()
{
static bool sperre2 = false;
const unsigned long sperrzeit = 1000UL * 60 * 25; // Sperrzeit von 25min
static unsigned long sperrStart = millis();
static bool lastZustand[1] = {HIGH};
uint8_t relaisPin[1] = {Relais2pin};
if (!sperre2) // Keine Sperre aktiv
for (byte b = 0; b < 1; b++)
{
if (lastZustand[b] != !digitalRead(relaisPin[b])) // Letzter Zustand weicht vom aktuellen ab
{
sperrStart = millis();
lastZustand[b] = !lastZustand[b];
sperre2 = true;
}
}
if (millis() - sperrStart > sperrzeit) sperre2 = false;
sperre2restzeit = (float) (sperrzeit - (millis() - sperrStart)) / 60000; // Ausgabe in Min
return sperre2;
}
bool sperre3()
{
static bool sperre3 = false;
const unsigned long sperrzeit = 1000UL * 60 * 25; // Sperrzeit von 25min
static unsigned long sperrStart = millis();
static bool lastZustand[1] = {HIGH};
uint8_t relaisPin[1] = {Relais3pin};
if (!sperre3) // Keine Sperre aktiv
for (byte b = 0; b < 1; b++)
{
if (lastZustand[b] != !digitalRead(relaisPin[b])) // Letzter Zustand weicht vom aktuellen ab
{
sperrStart = millis();
lastZustand[b] = !lastZustand[b];
sperre3 = true;
}
}
if (millis() - sperrStart > sperrzeit) sperre3 = false;
sperre3restzeit = (float) (sperrzeit - (millis() - sperrStart)) / 60000; // Ausgabe in Min
if (sperre3 = false)
return sperre3;
}
bool sperre4()
{
static bool sperre4 = false;
const unsigned long sperrzeit = 1000UL * 60 * 25; // Sperrzeit von 25min
static unsigned long sperrStart = millis();
static bool lastZustand[1] = {HIGH};
uint8_t relaisPin[1] = {Relais4pin};
if (!sperre4) // Keine Sperre aktiv
for (byte b = 0; b < 1; b++)
{
if (lastZustand[b] != !digitalRead(relaisPin[b])) // Letzter Zustand weicht vom aktuellen ab
{
sperrStart = millis();
lastZustand[b] = !lastZustand[b];
sperre4 = true;
}
}
if (millis() - sperrStart > sperrzeit) sperre4 = false;
sperre4restzeit = (float) (sperrzeit - (millis() - sperrStart)) / 60000; // Ausgabe in Min
return sperre4;
}
Desweiteren wir in der HTML Seite wenn die Sperrzeit abgelaufen dennoch ein Wert von z.B. 71203 angezeigt, das sollte ja diese Zeilen verhindern:
if (sperre1() == false)
{
sperre1restzeit = 0;
}
if (sperre2() == false)
{
sperre2restzeit = 0;
}
if (sperre3() == false)
{
sperre3restzeit = 0;
}
if (sperre4() == false)
{
sperre4restzeit = 0;
}
Was wieso geht es nicht? Habe ich da einen flaschen gedanken?


