Attivare in sequenza più pin consecutivi usando la funzione millis()

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.