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; } }