Problem mit if- im Sketch

Hallo,

das sind doch noch mehr Zustände - ich kriege gleich Zustände ... :slight_smile: :slight_smile: :slight_smile:

Schreit nach einem Zustandsautomat - switch case und enums sind dein Freund.
Ich habe das mal versucht umzusetzen.

Wenn die Einstiegsbedingungen einmal erfüllt sind, werden die cases konsequent abgearbeitet, bis die Pumpe wieder aus ist. Vorteil, keine if else Verschachtelungen wo man nicht mehr raus kommt bzw. durchblickt.
Die Signallogik kann ich nicht prüfen.

struct Pumpe
{
  unsigned long lastMillis;            // Variabler Speicher für 15 Minuten und 15Sekunden
  bool status = LOW;                   // Pumpe is normally on
  const byte pin = 9;
  const byte pinNiveau = 2;
};

Pumpe pump;

enum class state : byte {IDLE, WAITON, WAITOFF};
state mode = state::IDLE;

void setup()
{
  Serial.begin(9600);
  pinMode(pump.pin, OUTPUT);
  digitalWrite(pump.pin, LOW);
  pinMode(pump.pinNiveau, INPUT_PULLUP);
}

void loop()
{
  switch (mode)
  {
    case state::IDLE:
      if (!digitalRead(pump.pinNiveau) && (!pump.status) )    // wenn Niveauschalter LOW und Pumpe aus ist ...
      {
        pump.lastMillis = millis();                           // aktuelle Zeit merken für den Vergleich im Nächsten case
        mode = state::WAITON;
        Serial.println("WAIT ON");
      }
      break;

    case state::WAITON:
      if (millis() - pump.lastMillis > 3000)              // auf die Uhr sehen, ob die 15 Minuten schon rum sind, wenn ja
      {
        digitalWrite(pump.pin, LOW);                      // Pumpe einschalten
        pump.status = HIGH;                               // notieren, dass die Pumpe angeschaltet ist
        pump.lastMillis = millis();                       // aktuelle Zeit merken für den Vergleich im Nächsten case
        mode = state::WAITOFF;
        Serial.println("WAIT OFF");
      }
      break;

    case state::WAITOFF: 
        if (millis() - pump.lastMillis > 6000)              // auf die Uhr sehen ob die 15 Minuten und 15 Sekunden schon rum sind, wenn ja
        {
          digitalWrite (pump.pin, HIGH);                    // Pumpe ausschalten
          pump.status = LOW;                                // notieren, dass die Pumpe ausgeschaltet ist
          mode = state::IDLE;
          Serial.println("IDLE");
        }
        break;
  }

}