Lampeggio di un led
Cominciamo con riportare il ben noto codice blink.ino che permette il lampeggio di un led collegato al piedino 13

#define LED_BUILTIN 13
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
A volte è necessario fare due cose contemporaneamente. Ad esempio, far lampeggiare un LED durante la lettura di una pressione di un pulsante. In questo caso, non è possibile usare la funzione delay() perché Arduino mette in pausa il programma durante il delay().
Se il pulsante viene premuto mentre Arduino è in pausa in attesa della fine del delay(), la pressione del pulsante non verrà rilevata.
Per risolvere il problema è possibile utilizzare in modo appropriato la funzione millis() che restituisce il numero di millisecondi trascorsi da quando la scheda Arduino ha iniziato a eseguire il programma corrente.
Questo numero andrà in overflow (tornerà a zero) dopo circa 50 giorni, tuttavia il codice tiene conto di questo e per la proprietà di ciclicità della rappresentazione in un numero definito di bit (ovvero se si aggiunge 1 al numero più grande rappresentabile viene perso il riporto sul bit MSB e quindi si ottiene il valore più piccolo rappresentabile) continuerà a funzionare anche dopo 50 giorni.
#define LED_BUILTIN 13
// previousMillis contiene l'ultima volta che il LED
// è stato aggiornato
unsigned long previousMillis = 0;
// interval contiene l'intervallo di aggiornamento del
// LED in millisecondi
unsigned long interval = 1000;
// currentMillis contiene l'istante corrente
unsigned long currentMillis;
// ledState contiene lo stato del led
int ledState;
void setup() {
// inizializza il piedino del LED come output
pinMode(LED_BUILTIN, OUTPUT);
// comincio con il led acceso (attenzione al valore di ledState)
ledState = HIGH;
// in questo caso la riga di codice digitalWrite(ledPin, ledState) è
// equivalente a scrivere digitalWrite(ledPin, HIGH)
digitalWrite(LED_BUILTIN, ledState);
}
void loop() {
// controlla se è il momento di far lampeggiare il LED;
// ovvero, se la somma tra l'ultima volta che hai lampeggiato
// il LED e il periodo di lampeggio è minore dell'istante corrente
currentMillis = millis();
if ( previousMillis+interval <= currentMillis ) {
if (ledState == LOW){
ledState = HIGH;
}
else{
ledState = LOW;
}
// a seconda del valore di ledState il led viene spento o acceso
digitalWrite(LED_BUILTIN, ledState);
// una volta aggiornato lo stato del led è necessario
// far ripartire il conteggio
previousMillis = currentMillis;
}
}