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();
}
}
Last modified: Wednesday, 10 January 2024, 6:18 PM