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