Lampeggio di un led senza usare delay()

Cominciamo con riportare il ben noto codice blink.ino che permette il lampeggio di un led

#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 oil led viene spento o acceso
    digitalWrite(LED_BUILTIN, ledState);  
    // una volta aggiornato lo stato del led è necessario
    // far ripartire il conteggio
    previousMillis = currentMillis;     
  }
}



    
Ultime modifiche: domenica, 11 dicembre 2022, 15:29