Lampeggio di un led in non-blocking mode con funzioni di temporizzazione

L'esempio che segue mostra come la gestione delle temporizzazioni possa essere fatta in modo (relativamente) semplice tramite l'utilizzo di 3 funzioni e 2 variabili globali.

Le funzioni sono:

void timerInit(unsigned long milliseconds)

che inizializza la temporizzazione con il periodo in millisecondi inserito tra parentesi. Per esempio timerInit(1000); fa partire la temporizzazione con il periodo di 1 secondo;

void timerReset(void)

che fa ripartire la remporizzazione senza variare il periodo di conteggio. Per esempio timerReset(); fa ripartire il conteggio;

int timerIsEOT(void)

che controlla se il tempo è scaduto. In caso affermativo restituisce 1, altrimenti restituisce 0.


#define LED_BUILTIN 13

// le seguenti variabili NON devono essere utilizzate direttamente,
// ma solo tramite le funzioni che gestiscono la temporizzazione
unsigned long previousMillis;  
unsigned long interval;
// la seguente funzione fa partire la temporizzazione con
// il valore dato in ingresso in millisecondi
void timerInit(unsigned long milliseconds){
  interval = milliseconds;
  previousMillis = millis();
}
// la seguente funzione fa ripartire la temporizzazione 
// e non prevede alcun dato in ingresso
void timerReset(void){
  previousMillis = millis();
}
// la seguente funzione controlla se il tempo trascorso
// è superiore all'intervallo (in questo caso si è raggiunta
// la fine del conteggio EOT=end of time).
// Se il tempo è trascorso viene restituto 1, altrimenti 0.
// Non è previsto alcun valore in ingresso
int timerIsEOT(void){
  if (millis()>=previousMillis+interval) return 1;
  else return 0; 
}

// 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);
  // inizializzo la temporizzazione a 1000 millisecondi
  timerInit(1000);
}

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
  if ( timerIsEOT() ) {
    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
    timerReset();     
  }
}
    
    
Ultime modifiche: giovedì, 15 dicembre 2022, 12:45