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
  }
} 

 

 

Ultime modifiche: mercoledì, 10 gennaio 2024, 18:12