La funzione 'annaffia' va ripensata come processo da eseguire in innumerevoli passaggi:
void loop(){
if (umidita < sogliaUmidita){
statoIrrigazione = 1;
}
annaffia();
}
void annaffia(){
// se fermo e condizione di avvio
if (0 == pin && 1 == statoIrrigazione){
t = millis(); // salva tempo inizio
pin = 3; // prima uscita da attivare
digitalWrite(pin, HIGH); // ATTIVA
}
// se in funzione e timeout
if ((pin > 0) && (millis()-t >= TempoIrrigazione)){
digitalWrite(pin, LOW); // spegne uscita
pin++; // successiva uscita
if (6 == pin){ // se finite stop
pin = 0;
statoIrrigazione = 0;
}else{ // altrimenti
t = millis(); // ricarica tempo
digitalWrite(pin, HIGH); // attiva successiva
}
}
}
La funzione ha due stati (fermo e in funzione) e in ciascuno stato si controlla un evento ('statoIrrigazione' a 1 nel primo, oppure un timeout nel secondo). Quando l'evento viene rilevato si eseguono delle azioni ed eventualmente si cambia stato. In questo caso specifico e semplificato, come informazione di stato si usa il valore di 'pin': 0 quando processo fermo, e 3 4 o 5 quando in funzione.
In altri casi (o più in generale) la variabile di stato deve essere più esplicita, e anche gli stati devono essere ben distinti tra loro come codice, e allora si parla della FSM indicata da Maurotec.