Lampeggio di due led con periodo diverso
Lo schema elettrico proposto e il relativo sketch implementano il lampeggio di due led, uno con semiperiodo di 1 secondo e l'altro con semiperiodo di 750 millisecondi.
Si osserva come la gestione delle tempistiche con l'assenza della funzione delay() fa sì che questo algoritmo sia non-blocking

#define LED1 13 // LED1 collegato al pin digitale 13
#define LED2 12 // LED1 collegato al pin digitale 12
// Variabili globali
unsigned long UltimoEventoLED1 = 0; // variabile di appoggio per il conteggio dei millisecondi da quando è avvenuto l'ultimo eventi nel LED1
unsigned long UltimoEventoLED2 = 0; // variabile di appoggio per il conteggio dei millisecondi da quando è avvenuto l'ultimo eventi nel LED2
unsigned long TempoCorrente = 0; // variabile di appoggio per il conteggio dei microsecondi
int semiperiodoLED1 = 1000; // semiperiodo del LED1 in millisecondi
int semiperiodoLED2 = 750; // semiperiodo del LED2 in millisecondi
int lastStatoLED1 = 0; // ultimo stato del LED1 (per ora spento)
int lastStatoLED2 = 0; // ultimo stato del LED2 (per ora spento)
// Avvio dell'applicazione
void setup()
{
pinMode(LED1, OUTPUT); // imposta il pin digitale come output
pinMode(LED2, OUTPUT); // imposta il pin digitale come output
}
// Avvio del loop
void loop()
{
// carico il tempo passato dall'avvio del programma
TempoCorrente = millis();
// Verifico se devo far cambiare stato al LED1
if (TempoCorrente >= UltimoEventoLED1 + semiperiodoLED1){
if (lastStatoLED1 == 0){
digitalWrite(LED1, HIGH); // accende il LED1
lastStatoLED1 = 1; // aggiorna stato LED1
}
else{
digitalWrite(LED1, LOW); // spegne il LED1
lastStatoLED1 = 0; // aggiorna stato LED1
}
UltimoEventoLED1 = UltimoEventoLED1 + semiperiodoLED1; // aggiorno per il nuovo evento
}
// Verifico se devo far cambiare stato al LED2
if (TempoCorrente >= UltimoEventoLED2 + semiperiodoLED2){
if (lastStatoLED2 == 0){
digitalWrite(LED2, HIGH); // accende il LED2
lastStatoLED2 = 1; // aggiorna stato LED2
}
else{
digitalWrite(LED2, LOW); // spegne il LED2
lastStatoLED2 = 0; // aggiorna stato LED2
}
UltimoEventoLED2 = UltimoEventoLED2 + semiperiodoLED2; // aggiorno per il nuovo evento
}
}
Last modified: Wednesday, 10 January 2024, 6:12 PM