uscire da un delay

scusate, vorrei sapere se c'è la possibilità di uscire da un tempo di delay un po' lungo , senza dover resettare arduino.
grazie

Un delay blocca l'esecuzione del codice e da esso non puoi uscire.
Per creare un loop da cui poter uscire devi usare un codice diverso:

tempo_uscita = millis()+tempo_che_vuoi;

do {
  ....
  ....
  if (condizione) then break;
while (millis()<tempo_uscita);

per temporizzazioni lunghe ti sconsiglio di usare i delay, perché come hai già constatato bloccano l'esecuzione del codice che viene dopo.

Usa la funzione millis() che restituisce il tempo da quando è acceso Arduino..

un esempio di come usarla al posto del delay è questo: http://arduino.cc/en/Tutorial/BlinkWithoutDelay

visto che siamo in argomento
quando vanno in overflow millis e micros ricominciano da zero? o vanno sottozero e risalgono? c'è un controllo sull'overflow?

Returns the number of milliseconds since the Arduino board began running the current program. This number will overflow (go back to zero), after approximately 50 days.

basta leggere... me lo dicono sempre...

grazie

"Bloccano l'esecuzione del codice" nel senso che alla lunga ha qualche bug ? o semplicemente fa il suo dovere :slight_smile: ?

Ho scritto "bloccano l'esecuzione del codice che viene dopo", significa che un delay è un'istruzione che finché la sua esecuzione non è terminata il uC non prosegue nell'esecuzione del tuo programma. Quindi se gli chiedi delay(100000) lui starà lì per 100.000 millisecondi.
Non è bloccato, semplicemente sta eseguendo quello che gli hai chiesto.

Ti ho già postato un codice che ovvia a questo problema.

il problema è che non riesco a inserire il millis al punto giusto dello sketch, così ho provato a inserire i delay. mi sembra di regredire nei miei studi di arduino. stò millis mi sta facendo incavolare. io devo eseguire un ciclo nel loop e ho provato in tutte le maniere ma non funziona correttamente.

void settoreuno(){
unsigned long timeraltenanza=0;
delay(4000) ;
digitalWrite(elettrovalvola1,LOW); //apro la valvola 1 e scarico l'aria dal settore 1 del materasso
timeralternanza=millis();//parte il timer per alternare i cuscini
if (millis() >(timeralternanza+600000L))//e vorrei che per 10 min non capitasse più niente e dopo .....
{digitalWrite(elettrovalvola1, HIGH); }//aziono l'elettrovalvola 1e vado a riempire il settore, d'aria

}
questa è la sintesi di una funzione che ho inserito, ma lo sketch non si ferma per i 10 min. dov'è il problema?

la condizione if non scattera' mai: carichi in timeraltenanza i mills attuali e un istruzione dopo verifichi se sono passati 10 minuti. Devi continuare a leggere mills() fino a che mills() < mills letti + tempo di attesa

for(unsigned long stoptime=millis()+600000L;stoptime>millis(); ){
}
digitalWrite(elettrovalvola1, HIGH);

puoi uscire dall' attesa se si verifica qualche condizione, i.e. se l' ingresso 5 e' alto salta l' attesa

for(unsigned long stoptime=millis()+600000L;stoptime>millis(); ){
if(digitalRead(5))
break;
}
digitalWrite(elettrovalvola1, HIGH);

timeralternanza=millis();//parte il timer per alternare i cuscini
if (millis() >(timeralternanza+600000L))//e vorrei che per 10 min non capitasse più niente e dopo .....

il valore di millis() non potrà mai essere maggiore di timeralternanza + 600000 perchè subito prima della verifica con l'if assegni il valore attuale di millis() a timeralternanza e questo lo fai ad ogni passaggio nel loop
In pratica il valore di timeralternanza si incrementa continuamente di pari passo con la funzione millis, perciò non sarà mai maggiore

Non so se sono riuscito a farmi capire, ho scritto malissimo...

Ribadisco...quello che ti serve lo trovi qui: http://arduino.cc/en/Tutorial/BlinkWithoutDelay

oppure segui l'esempio di leo72...la logica è quella

per il momento grazie a tutti, sto facendo delle prove adesso e poi vi dirò