Falls es dir hilft - ich würde es wahrscheinlich etwa so zu lösen versuchen:
#define STATUS_OFF 0
#define STATUS_WC 1
#define STATUS_GARTEN 2
uint8_t status =STATUS_OFF;
unsigned long letzterStatusWechselZeitpunkt;
void loop(){
sammleAlleRelevantenDaten();
uint8_t newStatus=STATUS_OFF;
if (wasserImTank()){
if (wcBrauchtWasser()){
newStatus=STATUS_WC;
} else if (gartenBrauchtWasser()){
newStatus=STATUS_GARTEN;
}
}
setStatus(newStatus);
schlafEinWeilchen();
}
void setStatus(uint8_t newStatus){
if (newStatus != oldStatus){
// Ventile auf/zu , Pumpe an aus ....
letzterStatusWechselZeitpunkt=millis();
status=newStatus;
}
}
/*
Hier wird's etwas tricky - Die Pumpe soll nur laufen, wenn es zu trocken ist
UND
(Bewässerung läuft seit weniger als AAA Sekunden
ODER
Bewässerung lief BBB sekunden nicht)
*/
void gartenBrauchtWasser(){
if (feuchtGenug()) {return false;}
if ( (status == STATUS_GARTEN) && (millis() - letzterStatusWechselZeitpunkt) / 1000 < AAA){return true;}
if ( (status != STATUS_GARTEN) && (millis() - letzterStatusWechselZeitpunkt) / 1000 < BBB){return true;}
return false;
}
Schönes Wochenende ![]()