Oppure è meglio usare questa forma?
Potete spiegarmi perchè la seguente forma risulta essere migliore rispetto alla precedente e perchè non è indicata nemmeno negli esempi di Arduino?
In realtà è più sicura la prima forma perché in questo modo non risente dell'overflow di millis() a patto che le variabili in questione siano dichiarate del tipo giusto ovvero unsigned long
Le due forme sono uguali per quanto riguarda l'overflow e sono corrette.
La differenza, invece, sta nel fatto che la seconda non risente dei tempi di esecuzione, perciò è più precisa:
Nel primo caso, t_prec viene aggiornato a millis(), che ha un istante di ritardo, tanto più se non viene messa come prima operazione da eseguire; nel secondo caso, invece, viene sommato sempre l'intervallo indipendentemente da eventuali ritardi. Considera che millis() = t_prec+intervallo
infatti nel primo caso si ha: t_prec = millis()
e nel secondo: t_prec = t_prec+intervallo
Grazie mille, @Datman
solo un altra delucidazione riguardo millis().
Se io volessi accendere un led rosso subito e non dopo trascorso del tempo e mantenerlo acceso per 10 secondi, successivamente spegnere questo led ed accenderne uno di colore verde per 30 secondi e mantenere questo "loop" finché una variabile non cambia di stato, come potrei fare?
Ho bisogno di 3 costrutti if con millis() separati?
@Datman Ok, ma per far si che io possa accendere il led rosso immediatamente per poi spengerlo dopo 10s se uso un digitalWrite all'interno del loop o di una funzione, il led rosso non si spegnerà mai...
@Datman Funziona grazie, il fatto che ci sia il segno <= nel primo if comporta qualcosa per quanto riguarda l'overflow? Volendo il tempo di accensione del led verde può diventare di circa due ore?
@Datman No intendevo dire se scrivo <= invece di >= nel if che contiene millis() questo creerà problemi con l'overflow di quest'ultimo?
Se volevi che alla chiusura di un interruttore, la funzione blink() riparta sempre dal led rosso posso fare una cosa del genere ponendo t0 = millis()? Posso far rimanere acceso il led verde anche per 2 ore senza incorrere a problematiche?
@Claudio_FF non capisco la sintassi if(!x). Cioè passi il risultato del digitalRead alla variabile x della funzione blink() , ma se x non è inizializzato a 0 come fa a funzionare? Potresti spiegarmelo?
Passo il risultato del confronto tra switch_sw e HIGH (o 1 o true che è la stessa cosa). Il confronto può risultare vero (1) o falso (0), e questo è il valore assegnato a 'x'.
L'espressione !x vuol dire il contrario logico di x, quindi se x è 0 il contrario è 1 e quindi vero. Il significato finale dell' if è: "se x è zero".
E comunque non è una variabile qualsiasi
È un parametro della funzione
È garantito che sia sempre valorizzata, altrimenti lo senti il compilatore: ti picchia con la catena (toolchain)