Il ciclo FOR

Il ciclo FOR

Tre lampeggi e pausa
Ottienere una sequenza di 3 impulsi veloci seguiti da una pausa di 2 s, ripetuta ciclicamente.
La prima idea che viene in mente è quella di ripetere per tre volte l’accensione e lo spegnimento del LED, intervallati da pause di 200 ms, per poi concludere il loop con una pausa di 2s, come si può vedere nello sketch che segue. L’uso delle costanti timer1 e timer2 consente di variare i tempi semplicemente modificando il valore a esse assegnato, senza correggere a una a una le istruzioni in cui esse compaiono.

 

Il ciclo FOR

Il limite della soluzione precedente è che si ripete lo stesso blocco di istruzioni per tre volte; si volessimo produrre una sequenza di 100 impulsi, lo sketch diventerebbe lunghissimo,

Per ripetere 1 volte un blocco di istruzioni, si può utilizzare l’istruzione FOR, la cui sintassi è:

for (inizializzazione; condizione; incremento) {
// sequenza di istruzioni (ciclo)
}

Il FOR ripete la sequenza di istruzioni tra le graffe finché la variabile di controllo (per esempio x), definita e inizializzata in inizializzazione e che a ogni ciclo viene incrementata della quantità incremento, soddisfa la condizione (per esempio x< = n).
Quando la variabile non soddisfa più la condizione si esce dal FOR e lesecuzione del programma riprende dall’istruzione posta dopo la parentesi graffa di chiusura del ciclo.
Consideriamo come esempio lo sketch che sommai primi 100 numeri interi utilizzando il ciclo FOR. In questo sketch, somma e x sono variabili.
Una variabile è un dato che può essere modificato nel corso dell’esecuzione del programma; la dichiarazione di una variabile specifica il tipo (int, bool, char) senza essere preceduta da const.
Quindi all’uscita dal ciclo la variabile somma contiene la somma dei primi 100 numeri interi.

Il codice del ciclo FOR che somma i primi 100 numeri interi

int somma=0;                     // la variabile sormee dichiarata
                                // intera e inizializzata a 0
for (int x=1; x <= 100; x++) {  // per x che va da 1 a 100,
                               // a incrementi di 1 (x++)
somma=somma+x;                 // al valore di sorme viene
                              // aggiunto il valore di x
}

Ritornando allo sketch Tre lampeggi e pausa, vediamo come si può modificare il programma facendo uso del ciclo FOR: il blocco di istruzioni che accende e spegne il LED è scritto una sola volta, ma viene eseguito per tre volte, che corrispondono al numero di incrementi della variabile cont per arrivare da 1 a nLamp-3. Si noti che, modificando il valore della costante nlamp, si può variare il numero dei lampeggi.

Il codice dello sketch «Tre lampeggi e pausa» (con il ciclo FOR)

const int nLamp=3; // n° di lampeggi = 3
const int timer1 = 200; // tempo di ritardo 200 ms
const int timer2 = 2000; // tempo di ritardo 2 s

void setup() {
pinMode(13, OUTPUT); // inizializza il pin 13 come uscita
}

void loop() {

/*
Ciclo FOR: le istruzioni tra le graffe sono eseguite nLamp=3 volte, cioè
finchè la variabile “cont”, inizializzata a 1 e incrementata
di 1 ad ogni ciclo, risulta minore o uguale a nLamp=3
*/

for(int cont = 1; cont <= nLamp; cont++){
digitalWrite(13, HIGH); // poni a livello ALTO il pin 13 (LED ON)
delay(timer1); // attendi 200 ms
digitalWrite(13, LOW); // poni a livello BASSO il pin 13 (LED OFF)
delay(timer1); // attendi 200 ms
}
delay(timer2); // pausa di 2 s dopo i tre lampeggi
}

Lampeggio complesso
Fare lampeggiare il LED sulla scheda Arduino, con una sequenza ciclica di 1, 2, 3 lampeggi veloci, intervallati da pause di 2 s.

Soluzione
Per contare il numero dei cicli e il numero dei lampeggi crescenti all’interno di ogni ciclo, bisogna impiegare due FOR uno dentro l’altro (nidificati):

  • nel FOR esterno la variabile ciclo si incrementa da 1 a nLampMax, inizializzato al valore 3; quindi ciclo conta i 3 cicli di lampeggi;
  • nel FOR interno la variabile cont si incrementa da 1 al valore corrente di ciclo, quindi conta il numero di lampeggi da effettuare in quel ciclo.

Modificando il valore di nLampMax (numero massimo di lampeggi) si può variare il ciclo dei lampeggi, ad esempio ponendo nLampmax=5, si ottiene una sequenza di 1,2,3,4,5 lampeggi.

Il codice dello sketch «Lampeggio complesso con due FOR nidificati

const int lampax = 3;    // n° massimo di lampeggi
const int timer1 = 200;  // tempo tra le comutazioni degli impulsi (200 ms)
const int timer2 = 2000; // pausa tra ogni serie di impulsi (2s)

void setup() {
pinMode(13, OUTPUT); // inizializza il pin 13 come uscita
}

void loop() {
/*
Due FOR nidificati: – nel FOR esterno, la variabile “ciclo, variando de la Lomp , contiene il
numero del ciclo, corrispondente al numero di Lampeggi da effettuare in quel ciclo
– nel FOR interno, la variabile “cont” conta i lampeggi (crescenti da 1 a nLampMax=3)
all’interno del ciclo
– al termine di ogni ciclo di lampeggi (1, 2, 3) c’è una pausa di 2s
*/

for (int ciclo = 1; ciclo <= nLampMax; ciclo++){ // FOR esterno
for (int cont = 1; cont <= ciclo; cont++) {     // FOR interno
digitalWrite(13, HIGH);                        //  livello ALTO il pin 13 (LED ON)
delay(timer1);                                 // attendi 200 ms
digital write(13,LOW);                        // poni a livello BASSO Il pin 13 (LED OFF)
delay(timer1);                                //
attendi 200 ms
}
delay(timer2);                               // pausa di 2s al termine di ogni ciclo
  }
}

Commento all'articolo