ivan
Arduino: Blink senza Delay()
Tutorials -
Giovedì 09 Settembre 2010 13:46
Scritto da ivan

Questo tutorial potrebbe non sembrare particolarmente entusiasmante, ma ad un’attenta analisi risulta essere di fondamentale importanza proprio per lo sviluppo di applicazioni interattive. Come spiega infatti nella relativa pagina il sito ufficiale di Arduino, l’uso della funzione delay() nel semplice primo esempio, che abbiamo chiamato Hello, Blink!, è sì molto comoda (perché permette di impostare una pausa a piacere fra l’accensione e lo spegnimento del led semplicemente impostando l’argomento della funzione) ma, si blocca totalmente il programma per la durata della pausa stessa.

In che senso? Mentre infatti è in esecuzione la funzione delay() (ad esempio per 1000 millisecondi), non possono essere eseguite altre istruzioni e, se il nostro obiettivo è quello di far interagire Arduino col mondo esterno, non avrebbe molto senso un blocco del dispositivo dal momento che, probabilmente, il mondo esterno non aspetterà pazientemente la fine dell’esecuzione della funzione delay()

La soluzione è allora tenere traccia dell’istante in cui si è fatto accendere o spegnere il nostro led rosso e, ogni volta che il loop() viene eseguito, è sufficiente controllare se un intervallo di tempo minimo è passato. Se sì, il led va spento, o riacceso,a seconda dei casi.

Vediamo come. Innanzitutto bisogna introdurre una nuova funzione denominata millis() che restituisce il numero di millisecondi trascorsi dall’inizio dell’esecuzione del programma (e si riazzera una volta ogni 50 giorni circa… sempre che teniate Arduino acceso per così tanto tempo).

Ecco il codice che utilizzeremo:

int ledPin = 13;
int value = LOW;
long previousMillis = 0;
long interval = 1000;
 
void setup()
{
pinMode(ledPin, OUTPUT);
}
 
void loop()
{
if (millis() - previousMillis > interval) {
previousMillis = millis();
 
if (value == LOW)
value = HIGH;
else
value = LOW;
 
digitalWrite(ledPin, value);
}
}

 

Le prime quattro righe dichiarano 4 variabili. Le prime due sono interi che stabiliscono il numero del pin a cui va connessa la zampa lunga (+) del nostro led rosso (l’altra è sempre connessa al GND) e il valore iniziale di corrente al pin (LOW è come dire 0 Volt, spento). Le seconde due variabili sono di tipo long (ovvero hanno la possibilità di immagazzinare valori numerici interi con molte più cifre del tipo int) e servono per memorizzare il valore in millisecondi restituito da millis() e l’attesa fra un’accensione e uno spegnimento del led. Il fatto che anche interval sia una variabile long (pur avendo solo 4 cifre) è per permettere di eseguire correttamente la sottrazione in riga 13 fra tipi uguali di variabili.

Nella riga 8 entriamo in setup() e settiamo il pin 13 come OUTPUT e poi entriamo nel blocco loop(). A questo punto, ad ogni esecuzione del ciclo, viene controllato se millis() - previousMillis è maggiore di interval, ovvero se è passato un tempo uguale o superiore a quello impostato come intervallo fra un’accensione e uno spegnimento. Se sì, in riga 14 viene subito impostato l’attuale valore di millis() come nuovo valore di previousMillis, pronto per la successiva esecuzione del loop().

Nelle righe dalla 16 alla 19 non viene fatto altro che controllare lo stato precedente del pin 13 e, se il led è spento viene deciso di accenderlo, se è acceso viene deciso di spegnerlo. Nella riga 21 viene data esecuzione al comando digitalWrite() che, in base al valore della variabile value, agisce direttamente sui livelli del pin 13.

Fra la riga 22 e la 23 (quindi fuori dal primo costrutto if (iniziato in riga 13 e ancora dentro il loop()) possiamo inserire un numero qualsiasi di istruzioni che verranno eseguite immediatamente, senza attendere che siano passati i 1000 millisecondi impostati con interval.

Ricordo che questo tutorial è stato tradotto e arricchito dal sito ufficiale arduino.cc.

 

Gioblu Robotics © 2010 - 2012 · Sitemap · privacy

gioscarab@gmail.com

Gioblu BOTServer è online dal 10 Aprile 2010 - 319.232 Visite - 1.027.175 Pagine visualizzate - 182.309 Visitatori unici - 536 utenti attivi