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
}