Hilfe bei einer Ausschaltverzögerung

Hallo liebes Forum. Ich habe eine automatische Bewässerungsanlage mit einem Arduino als Steuerung gebaut. Lief 2 Wochen ohne Probleme. Da mir gestern das Wohnzimmer vollgelaufen ist, habe ich beschlossen, zum Schutz des Fußbodens eine Ausschaltverzögerung einzubauen.
Ich bin Anfänger und beschäftige mich jetzt seit 2 Monaten mit dem Arduino.
Könnt ihr mir bei meiner Ausschaltverzögerung helfen? Ich bedanke mich im Vorraus.
Hier mein Code:

int S1 = 7;         //Start Taster
int S0 = 6;         //Stop Taster
int M1 = 2;         //Pumpe 1 (Relais K1)
int M2 = 3;         //Pumpe 2 (Relais K2)
int P1 = 4;         //LED_1:"Anlage läuft"
int P2 = 5;         //LED_2:"Bitte Wasser nachfüllen" | "Pegel n.I.O"
int Pegel = A0;     //Sensor für den Wasserstand (B3)
int Feuchte1 = A1;  //Sensor für die Bodenfeuchte (B1)
int Feuchte2 = A2;  //Sensor für die Bodenfeuchte (B2)
bool Start = false; //Variable für den Anlagenstart
int count_M1 = 0;   //Variable um die Einschaltzeit (s) der Pumpe "M1" zu zählen, wird nach erneutem Reinladen in den Arduino gelöscht.
int count_M2 = 0;   //Variable um die Einschaltzeit (s) der Pumpe "M2" zu zählen, wird nach erneutem Reinladen in den Arduino gelöscht.
uint32_t previousMillis = 0; //Variable für die Ausschaltzeit.
uint32_t previousMillis1 = 0; //Variable für die Zweite Ausschaltzeit.


void setup() {
    //Setup für die Eingänge:
  pinMode(S1, INPUT_PULLUP);
  pinMode(S0, INPUT_PULLUP);
    //Setup für die Ausgänge:
  pinMode(M1, OUTPUT);
  pinMode(M2, OUTPUT);
  pinMode(P1, OUTPUT);
  pinMode(P2, OUTPUT);
  digitalWrite(M1, LOW);
  digitalWrite(M2, LOW);
  digitalWrite(P1, LOW);
  digitalWrite(P2, LOW);
  Serial.begin(9600);
}
void loop() {
//Hier werden die Taster der Anlage abgefragt um die Variable "Start" zu schreiben. Die Led P1 "Anlage Eingeschaltet" wird hier geschaltet.
  if (!digitalRead(S1) == true){
    digitalWrite(P1, true);
    Start = true;  
  }
  if (digitalRead(S0) == true) {
    digitalWrite(P1, false);
    Start = false;
  }
  
  //Hier wird der Durchschnittswert vom Wasserstandssensor berechnet, um die Hysterese des Sensors möglichst klein zu halten.
  int average = 0;
  for (int i = 0; i < 8; i++) {  
    average = average + analogRead(Pegel);
    delay (50);
  }
  average = average / 8; // Den Durchschnittswert durch die Anzahl der Schleifen nehmen. (Durch "8").

// Hier werden die Werte für den Wasserstand ausgewertet. Dafür muss die Anlage Eingeschaltet sein. Der Wasserstand soll immer im optimalen Bereich liegen, damit die Pumpen nicht Trockenlaufen.
  if ((average < 418 ) && (Start == true)) {  // Bei niedrigem Füllstand leuchtet die Meldeleuchte "P2", "Bitte Wasser auffüllen"
    digitalWrite(P2, HIGH);
  
  } else if ((average > 418 ) || (Start == false)){ //Die Meldeleuchte kann auch über den Taster S0 ausgeschaltet werden.
    digitalWrite(P2, LOW);
  }

// Hier wird nun der Sensor "B1" ausgelesen und die Pumpe "M1" für die Pflanze eingeschaltet, sobald die Anlage eingeschaltet ist.
  if ((analogRead(Feuchte1) < 500 ) && (Start == true)) {
    digitalWrite(M1, HIGH);
    previousMillis = millis(); //Die Zeit speichern.
    count_M1 = count_M1 + 1;    //Anzahl der Sekunden, wie lange die Pumpe aktiv ist, wird hier gezählt.

  }if (millis() - previousMillis > 3 * 1000UL && digitalRead(M1) == HIGH || analogRead(Feuchte1) > 500  || Start == false) {
    digitalWrite(M1, LOW);

  }
// Hier wird nun der Sensor "B2" ausgelesen und die Pumpe "M2" für die Pflanze eingeschaltet, sobald die Anlage eingeschaltet ist.
  if ((analogRead(Feuchte2) < 500 ) && (Start == true)) {
    digitalWrite(M2, HIGH);
  
    count_M2 = count_M2 + 1;    //Anzahl der Sekunden, wie lange die Pumpe aktiv ist, wird hier gezählt.

  }if ((analogRead(Feuchte2) > 500 ) || (Start == false)) {
  
    digitalWrite(M2, LOW);
  }
  

  Serial.println("Sekundenzähler M1:"); 
  Serial.println(count_M1);
  Serial.println("Sekundenzähler M2:");
  Serial.println(count_M2);
  Serial.println(previousMillis);  
}

Was soll die machen?

Solange die Bewässerung weiterlaufen lassen, bis der Fußboden gleichmäßig feucht ist.

:upside_down_face:

4 Likes

Mein Kristallkugel sagt mir: "Vorsicht!"

Ups....damit noch länger das Wasser ins Wohnzimmer läuft ?
Oder was genau soll da passieren ?

// Hier wird nun der Sensor "B1" ausgelesen und die Pumpe "M1" für die Pflanze eingeschaltet, sobald die Anlage eingeschaltet ist.
  if ((analogRead(Feuchte1) < 500 ) && (Start == true)) {
    digitalWrite(M1, HIGH);
    previousMillis = millis(); //Die Zeit speichern.
    count_M1 = count_M1 + 1;    //Anzahl der Sekunden, wie lange die Pumpe aktiv ist, wird hier gezählt.

  }

Look at this line. Your "previousMillis = millis();" is executed for as long as the Feuchte1 is less than 500. If the Feuchte1 sensor is in fault condition than the pump M1 runs forever. I would suggest to add more software timers to restrict the maximum time each pump is allowed to run. If the maximum time is elapsed then set warning flag and switch the M1 off.

Hallo

Überwache während des Bewässerungsvorganges, d.h. die Pumpe läuft, die Änderung der Bodenfeuchtigkeit.

Wenn die Bodenfeuchtigkeit sich, über die Zeit betrachtet, nicht ändert oder noch "trockenerer" wird, dann Pumpe aus, AlarmLed an.

Hallo. Normalerweise fließt das Wasser auch an den Sensor, der Wert der Bodenfeuchte steigt. Die Pumpe geht aus. Normalerweise. Gestern lief die Pumpe einfach weiter und überflutete die Pflanze samt Topf und den Boden. War sehr spaßig alles sauberzumachen. Daher hätte ich gerne eine Ausschaltverzögerung. Die Pumpe geht dann nach 3s laufzeit aus. Um das Überfluten zu vermeiden. Wie bringe ich das zum Laufen?

Hello. You are absolutly right. That is the case. The pump M1 and M2 have to shut down, after a time of maybe 3 seconds.

Danke für den Tipp

Die Pumpe M1 oder M2, die gerade läuft, soll nach einer gewissen Laufzeit von vielleicht 3 Sekunden ausgehen. Oder der Bodenfeuchte Sensor meldet den passenden Wert. So habe ich eine zusätzliche Sicherheit, damit die Pumpe nicht zu lange läuft und mir den Pflanzentopf und mein Fußboden überflutet. Die Pumpen fördern beide mit V= 400l/h. Wenn ich mehrere Stunden weg bin, kann das schon unschön werden.

Gerne. :wink:

Du willst also eine Laufzeitbegrenzung, die aktiv wird unabhängig vom Feuchtesensor?

Und wann soll danach die Pumpe jemals wieder einschalten?

Das ist richtig. Die Pumpe soll sich erneut einschalten, wenn der Bodenfeuchte Sensor "Boden zu trocken" meldet.

Also sofort nach dem Ausschalten, falls der Feuchtesensor noch trocken sagt.

Ja. Wenn die Sensorik vernüftig arbeitet, sollten die Pumpen nach der Ausschaltzeit nicht erneut angehen.

Du hast aber anscheinend keine vernünftige Arbeitsweise der Sensoren. Also bitte nochmal überdenken und einteilen:

  • Wann sollen die Pumpen anlaufen?
  • Wann sollen sie abschalten?
  • Wie lange sollten sie dann Pause machen?

Wobei "wann" nicht nur zeitlich gemeint ist, sondern auch in Abhängigkeit von den Sensorsignalen.

2 Likes

genau diese 3 Fragen hätte ich auch gestellt.

2 Likes

Dein Code wirft Dir eine Warnung aus:

/tmp/arduino_modified_sketch_386470/sketch_aug13a.ino: In function 'void loop()':
/tmp/arduino_modified_sketch_386470/sketch_aug13a.ino:70:46: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   if (millis() - previousMillis > 3 * 1000UL && digitalRead(M1) == HIGH || analogRead(Feuchte1) > 500  || Start == false)

Die gilt es erstmal aufzulösen.

1 Like

Die Pumpen sollen laufen, wenn der Bodenfeuchte Sensor unter einem Grenzwert liegt. Die Pumpe läuft, der Grenzwert ist überwunden. Die Pumpe geht aus, wenn ich die Anlage über einen Taster ausschalte, der Grenzwert überschritten ist oder die Laufzeit der Pumpe überwunden ist.

Ich habe es mit deinem Code probiert, die Ausschaltverzögerung zu realisieren. Hat leider nicht funktioniert.