Blink del led integrato (non-blocking mode)

Il codice qui sotto riportato mostra come si struttura un codice che fa accendere il led integrato sulla board Arduino ogni 2 secondi con una durata di 100ms. Sostanzialmente ogni 2 secondi si ha un breve flash del led che evidenzia che la scheda Arduino è accesa e lo sketch cariato al suo interno sta funzionando. 

Nella parte finale, dove indicato, è possibile inserire ulteriore codice per far svolgere alla board anche altre funzionalità come la lettura di un valore con il convertitore analogico-digitale, oppure il comando di un servomotore, ecc.

N.B. Affinché la funzionalità del codice non venga modificata è necessario che nel codice aggiuntivo non siano presenti istruzioni di ritardo (delay) o cicli che richiedano tempi significativi per essere computati.

#define led1 13

unsigned long lastTick1;
unsigned long periodoOn = 100;
unsigned long periodoOff = 2000;
unsigned long timenow;

typedef enum{
acceso,
spento,
} stato;

stato statoled1;

bool azioneNecessaria = LOW;  // se vale HIGH è necessario svolgere un'azione
                              // che nel nostro caso è il cambio di stato
                              // di uno dei due led

// Avvio dell'applicazione
void setup() {
    pinMode(led1, OUTPUT);
    // Si parte con il led spento
    lastTick1 = 0;
    statoled1 = spento;
    digitalWrite(led1, LOW);
}
 
// Avvio del loop
void loop() {
    timenow = millis(); // salvo l'istante attuale

    // Gestione dello stato del led (INIZIO)
    //  Si accede qui dentro per attuare un cambiamento
    //  di stato individuato dal controllo sotto riportato
    if (azioneNecessaria == HIGH) {
      azioneNecessaria = LOW;
      switch (statoled1)  {
        case acceso:
            statoled1 = spento;
            digitalWrite(led1, LOW);
            lastTick1 = timenow;
            break;
        case spento:
            statoled1 = acceso;
            digitalWrite(led1, HIGH);
            lastTick1 = timenow;
            break;
        default:
            break;
      }
    }
    // Gestione dello stato del led (FINE)

    // Controllo del cambiamento di stato del led (INIZIO)
    //  Il controllo viene fatto in continuazione e qualora sia necessario  
    //  viene attuato nella parte di gestione del led
    switch (statoled1){
      case acceso:
            if (timenow > lastTick1 + periodoOn) {
                azioneNecessaria = HIGH;
            }
            break;
      case spento:
            if (timenow > lastTick1 + periodoOff) {
                azioneNecessaria = HIGH;
            }
            break;
      default:
            break;
    }
    // Controllo del cambiamento di stato del led (FINE)

// Inserire a partire da qui il codice che implementa
// le altre funzionalità desiderate

}
Ultime modifiche: martedì, 11 gennaio 2022, 12:07