Apri/Chiudi


Arduino Duemilanove: Hello, Blink! senza delay()

2 febbraio 2009 , di Boliboop

A prima vista l’argomento di 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, per contro, si tratta un blocco totale del 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.

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 listato che utilizzeremo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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 è 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). 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 rosso. 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.

In riga 8 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, in pratica, 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.

Il prossimo tutorial introdurrà un primo esempio di interazione Arduino-essere umano. Come sempre se avete domande lasciate un messaggio, ehm, un commento.

Articoli correlati:

  1. Arduino Duemilanove: espandere Hello, Blink! con una breadboard
  2. Arduino Duemilanove: Hello, Blink!
  3. Arduino Duemilanove: espandere Hello, Blink!

2 Commenti a “Arduino Duemilanove: Hello, Blink! senza delay()”

  1. 1

    mpp ha detto

    ciao… Mi chiedevo se è possibile inserire l’istruzione delay anche nella funzione setup(), questo perchè voglio farmi un minisumo robot i quali devono partire dopo 5 secondi dall’avvio… E senza dovermi fare un altro circuito pensavo che sarebbe tutto più rapido se l’arduino lo facesse per me! grazie!

  2. 2

    salvatore ha detto

    :buongiorno vorrei chiedere come si fa per accendere un led o evetualmente una luce usando itasti del computer come interruttori grazie in anticipo per l’eventuale risposta ecomplimenti per il vostro forum molto utile per capire questo sistema t :roll: anti saluti

Lascia un commento



Chiudi
E-mail It