Hilfe bei einer Ausschaltverzögerung

Hardwareseitig ist S1 ein Schließer und S0 ein Öffner.

Wie genau baue ich den ein? Wenn ich ganz ehrlich mit dir bin, ist mir das ein wenig zu komplex. Ich dachte da gibt es eine einfachere Lösung.

Nein ich meint dich. Auf der Seite: Arduino: LED oder Relais per Tastendruck einschalten und mit Zeitablauf abschalten

Steht dein Name

1 Like

Nein. Niemals.

Der hat in Sekunden gezählt als ich noch ein Delay hatte.

Dann war das ein komplett anderer Code.
Daher ist Deine Aussage oben schlichtweg falsch. Und nichts anderes habe ich geschrieben.

wenn du geschrieben hättest was du probiert hast, hätte man dir vermutlich helfen können. Denn ich gehe davon aus, dass alle 6 Code Beispiele auf der Seite funktionieren.

Ist aber eh Apfelkuchen.

Brauchst du nun noch Hilfe oder ist das Problem gelöst?

Nur als grobe Abschätzung:
Wie lange dauert es mindestens bis deine Pflanze 1
Wie lange dauert es mindestens bis deine Pflanze 2

so trockene Erde hat dass neu bewässern Sinn macht?
Ist das:

  • Alle halbe Stunde ?
  • alle 4 Stunden ?
  • alle Zwei Tage?

Diese Zeit muss ja nicht so gewählt werden, dass die Pflanze schon alle Blätter herunter hängen lässt. Aber alle 5 Minuten musst du wohl nicht nachgießen.

Damit lässt sich das Risiko von Überschwemmung bzw. Feuchtefäulnis reduzieren.

Noch mal von wegen Pflanzen in die Duschwanne stellen.
Also für 2 Wochen in den Urlaub fahren würde ich 30 Minuten Abbau im Wohnzimmer Aufbau in der Duschwanne als erträglichen Aufwand empfinden. Aber letzendlich musst du das entscheiden

Den Apfelkuchen bitte mit Streuseln. Ich benötige noch Hilfe

Ja mein Gott! Das war eine Zeile

Da hast du schon recht. Durch den Sensor wurde das bis jetzt ganz gut gehändelt. Der hat alle paar Stunden gegossen. Wenn ich länger weg bin, werde ich die Duschwanne in Erwägung ziehen.

So ich habe jetzt mal als pdeudo-code zusammengetragen wie man es programmieren könnte.

Die Reihenfolge der einzelnen Bedingungen ist sehr wichtig.

Die Variante käme auch ohne Mono-Flop-state-machine aus

Wenn keine Pumpenfreigabe
Pumpe aus

wenn Boden zu trocken und keine Pumpenfreigabe
PumpeEin_Zeitpunkt = millis()
Pumpenfreigabe = true;

Wenn Boden feucht => Pumpenfreigabe = false;

Wenn Zeit seit Pumpenfreigabe (PumpeEin_Zeitpunkt) >= 3 Sekunden vergangen
Pumpenfreigabe = false;
PumpeAus_Zeitpunkt = millis();

wenn PumpenBlockierzeit noch nicht vorbei
Pumpenfreigabe = false;

Wenn Pumpenfreigabe
Pumpe ein

Möglicherweise habe ich aber beim Analysieren noch etwas übersehen.
Deshalb ist es extrem wichtig so etwas in der Realität zu testen und zwar auch auf alle Eventualitäten die auftreten könnten.

Und zu überlegen lässt sich das vom Programm erfassen?

  • zu wenig Wasser im Vorratstank
  • Schlauchöffnung nicht mehr an Position => Wasser läuft woanders hin => Erde wird nicht feucht.
  • Feuchtesensor nicht mehr an der richtigen Stelle => Feuchtesensor liefert nur gering schwankenden Messwert
  • Kabelbruch am Feuchtesensor wie macht sich das im Messwert bemerkbar?
  • Was passiert wenn Pumpe oder Feuchtesensor vertauscht wurden
    Pumpe1 mit Feuchtesensor2
    Pumpe2 mit Feuchtesensor1

Handling the automation tasks is not easy in Arduino language (C, C++). You can use a little trick which will make your project development easier.
1/ Borrow a PLC Siemens Logo from your friend. Program your task in Logo (FBD) language and try it on your real technology (inputs/outputs). There is on-line view where you can watch all the timers, flip-flops, inputs, outputs, analogs, etc. live.
2/ Once you are satisfied with result then you can rewrite from FBD to Arduino (C++).
It seems more complicated at first but I guess it will pay in the end.

Das halte ich für ein Gerücht.

Gibt es belastbare Hinweise für diese Hypothese?

1 Like

Ich schlage vor du folgst du nun exakt den Anweisungen/Fragen eines Helfers.

Wenns in den nächsten 24h nichts wird, schreibst du mich mit einem @noiasca an dann bekomm ich eine Notifikation.

Das wäre mein Weg:

aber zunächst arbeite mal mit Stefan oder Paul oder xy und beantworte dessen Fragen.

1 Like

Vielen Dank Stefan. So könnte das funktionieren. Jetzt weiß ich noch nicht ganz wie ich das in Code verwandle. Wie gesagt ich bin Anfänger.
Den Wasserstand überwache ich über einen Wasserpegelsensor, der nach nur Zwei Wochen stark korridiert ist und schlechte Werte liefert. Die anderen Punkte lassen sich nicht oder nur unter großem Materialaufwand überwachen. Daher ist das nicht denkbar.

Da hat er recht. Mit einer PLC, wie einer Siemens LOGO oder S7 lässt sich deutlich einfacher Automatisieren. Da man mit Funktionsbausteinen arbeitet, die sich einzeln überwachen lassen.

Dann mal los.

Viel Erfolg.

Danke, den habe ich. "Warum sind PLCs nur so teuer?" :smiling_face_with_tear:

Das wäre der Code für M1. Leider funktionieren die Zeiten nicht. Und die Sensor abfrage funktioniert auch nicht.

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.
bool Pumpenfreigabe_M1 = false; //Variable für die Pumpenfreigabe "M1".
int tPumpe_Ein_M1 = 0; //Variable für die Einschaltzeit der Pumpe "M1".
int tPumpe_Aus_M1 = 0; //Variable für die Ausschaltzeit der Pumpe "M1".



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 ((Pumpenfreigabe_M1 == false) || (Start ==false)){
    digitalWrite(M1, LOW);

  }if ((analogRead(Feuchte1) < 450)  && (Start == true) && (Pumpenfreigabe_M1 == false)) {
    tPumpe_Ein_M1 = millis();
    Pumpenfreigabe_M1 = true;

  }else if ((analogRead(Feuchte1) > 450 ) || (Start == false)){
    Pumpenfreigabe_M1 = false;
  }
  if (tPumpe_Ein_M1 >= 3000){
    Pumpenfreigabe_M1 = false;
    tPumpe_Aus_M1 = millis();
  }
  if (tPumpe_Aus_M1 >= 5000){
    Pumpenfreigabe_M1 = false;
  }
  if ((Pumpenfreigabe_M1 == true) && (Start == true)) {
    digitalWrite(M1, HIGH);
  }




//M2 habe ich noch nicht angefasst.
// 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(Pumpenfreigabe_M1); 
  delay(400); //Hab ich nur eingebaut um die Werte besser zu überwachen.
}