Vorrei che il codice contenuto in questo case 3 venisse eseguito una sola volta per tot tempo per poi non essere rieseguito fino a che non si riverifica il caso, a prescindere dal tempo in cui rimane vero il caso in questione, ovvero:
Accendo manualmente la valvola 1;
Dopo 15 minuti si spegne in automatico la valvola SE non cambio uscita (diverso case);
Con i millis().
Salvi il valore in una variabile ed esegui un controllo all'interno del relativo case.
Se scegli un altro case basta riassegnare il valore alla variabile annullando il tempo trascorso.
Salvi il valore di millis() la prima volta che entri nel case.
Quando entri nel case fai la differenza tra il millis() attuale e il valore salvato, che ti dirà quanti ms sono passati dalla volta precedente. Verifica se tale valore è superiore a quello desiderato e solo in tal caso fai quel che devi e, solo in tal caso, aggiorna il millis() salvato.
Ogni volta che vuoi resettare aggiorna il millis() salvato.
Beh, hai a disposizione una funzione che ogni volta che la chiami ti ritorna i millisecondi passati dall'accensione. Con quella e un po' di fantasia puoi fare tutto quel che vuoi! 8)
Vero, ma preferisco mettere sul "chi va là" chiunque si accinga a smanettare con gli intervalli di tempo: ad esempio, se vedi un altro thread attivo in questo momento, si sta salvando il valore di ritorno di millis() in un int, il che riduce di molto gli intervalli memorizzabili.
Ho risolto andando ad effettuare dei confronti sull'UTC (Unix Time o Universal Time) dell'RTC, così posso inserire il ritardo che voglio in secondi senza avere problemi di cifre positive e negative.