A volte Arduino deve fare più cose contemporaneamente: in questi casi, non è opportuno usare delay() che mette in pausa il programma per un tempo indicato e nel frattempo non sarà registrato alcun segnale sia in entrata che in uscita.
Come esempio rieseguiamo l’esperienza del lampeggio di un LED, questa volta però senza l’uso del delay(). Il programma che segue accende un LED collegato al pin 13 e memorizza il momento di accensione, poi controlla continuamente se la differenza fra l’orario corrente e quello dell’ultima accensione (tempo trascorso dall’ultima variazione dello stato del LED) è maggiore o uguale all’intervallo di intermittenza: se lo è, attiva o disattiva il LED prendendo nota del nuovo orario.
In esso viene utilizzata la funzione millis(), un comando che restituisce in millisecondi il tempo trascorso da quando la scheda è stata alimentata o resettata.
#define pinLED 13
/* Per il tempo si usano variabili di tipo "unsigned long" poiché il valore da memorizzare potrebbe diventare troppo grande per un int */
/* la variabile seguente memorizzerà l'ultima volta che lo stato del LED è stato aggiornato*/
unsigned long inizioConteggio = 0;
const long intervalloIntermittenza = 1000; // in millisecondi
void setup () {
pinMode(pinLED, OUTPUT);
}
void loop() {
unsigned long commutazione = inizioConteggio + intervalloIntermittenza;
/* aggiorna l'istante in cui dovrà avvenire la commutazione */ while (millis() <= commutazione) { }
/* non compie alcuna azione finché non raggiunge l'istante di commutazione*/ digitalWrite(pinLED, !digitalRead(13));
inizioConteggio = millis();
/* aggiorna l'ora in cui è cambiato lo stato del LED per ripartire con il conto alla rovescia! */}
Oppure con la funzione1 attendi()int attendi (int intervallo) {
static unsigned long inizioConteggio, commutazione;
int ok = 0;
commutazione = millis() - inizioConteggio;
if ( commutazione >= intervallo) {
inizioConteggio = millis();
ok = 1;
}
return ok;
}
#define pinLED 13
void setup() {
pinMode(pinLED, OUTPUT);
}
void loop() {
if (attendi(1000)) {
digitalWrite(pinLED, !digitalRead(13));
}
}