Hallo,
das sind doch noch mehr Zustände - ich kriege gleich Zustände ...
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;
}
}