Arduino: Controllo di flusso

If (se)

L’istruzioni if verifica se una certa condizione è stata raggiunta, come ad esempio un valore analogico al di sopra di un certo numero. Se l’espressione è vera lo sketch esegue le istruzioni che seguono. Se falso il programma ignora la dichiarazione. Un esempio:

if (someVariable == value)
{
   esegui etc.;
}

L’esempio precedente compara (l’operazione di confronto è eseguita dall’istruzione ==) someVariable al valore contenuto in value, che può essere una variabile o una costante. Se l’operazione di confronto, o la condizione tra parentesi risulta vera, le istruzioni contenute all’interno delle parentesi graffe vengono eseguite. In caso contrario, il programma salta su di loro e continua dopo le parentesi graffe.

Nota: Attenzione all’uso accidentale del simbolo dentro le parentesi dell’istruzione if ‘=’, infatti (x = 10), tecnicamente è un’operazione valida, infatti assegna alla variabile x il valore 10 ed è di conseguenza una condizione sempre vera, per cui lo sketch si comporta in modo diverso da come ci si aspettava. Occorre usare invece il doppio uguale ‘==’, infatti (x == 10), esegue il confronto tra la variabile e il valore, cioè confronta solo e soltanto se x è uguale al valore 10. Occorre pensare a ‘=’ come “assegna a” e ‘==’ a “confronta con”.

if … else

La struttura if … else è utilizzata per verificare determinate condizioni e quindi eseguire decisioni. Se l’espressione contenuta all’interno delle parentesi tonde è vera, viene eseguito il codice di programma che segue. Se l’espressione è falsa vengono eseguite le righe di codice subito dopo l’istruzione else. Un esempio:

#define Acceso 1 // definisce Acceso = 1
#define Spento 0 // definisce Spento = 0

if (pulsante == ON)
{
   digitalWrite (rele, acceso);
}

else
{
   digitalWrite(rele, spento);
}

Altro esempio, se si vuole testare un ingresso digitale, se è HIGH o LOW, si può scrivere:

if (inputPin == HIGH)
{
   doThingA;
}

else
{
   doThingB;
}

Si possono scrivere condizioni if annidate una dentro l’altra o condizioni multiple. Attenzione: solo una serie di dichiarazioni verrà eseguito a seconda della condizione posta nello sketch.

L’istruzione else if permette di fare la scelta tra più condizioni.

If (inputPin <500)
{
   esegui A;
}

else if (inputPin> = 1000)
{
   esegui B;
}

else
{
   esegui C;
}

Ricapitolando, il flusso del programma può eseguire una parte di codice oppure no (nel caso del solo if), di fare una scelta tra due parti di codice (nel caso di If – else) o di fare una scelta tra più parti di codice (nel caso di if – else if – else).

For

Il for viene utilizzato per ripetere un blocco di istruzioni racchiuso tra parentesi graffe un determinato numero di volte. Viene utilizzato un contatore per incrementare e terminare il ciclo. Esso è composto da tre parti, separate da punto e virgola (;):

for (inizializzazione; condizione; espressione)
{
   esegui A;
}

Esempio:

for (int A = 0; A < 10; A++)
{
   esegui le istruzioni;
}

Al comando for segue una parentesi tonda. Il contenuto all’interno della parentesi definisce quante volte deve essere ripetuto il blocco di programma contenuto dentro le parentesi graffe.

int A = 0

Definisce la variabile di tipo intero e viene impostata con un valore iniziale uguale a zero. L’inizializzazione di una variabile locale, o contatore di incremento, avviene all’inizio e viene definita una volta sola.

A < 10

Specifica che finché la variabile A è minore di 10 il ciclo for viene ripetuto perché la condizione è vera, pertanto vengono eseguite le istruzioni contenute all’interno delle parentesi graffe.

A++

Incrementa la variabile A di una unità. Il significato è uguale a scrivere A=A+1.

Quando la variabile assume il valore di 10, quindi la condizione diventa falsa, il ciclo termina.

Nell’esempio seguente viene inizializzata la variabile i definita come int e posta uguale a 0; viene avviato il ciclo per vedere se i è ancora inferiore a 20 e finché non risulta vera, la variabile i viene incrementata di 1 e vengono eseguite le istruzioni racchiuse tra parentesi graffe:

for (int i = 0; i <20; i ++) // dichiara i, controlla se i è meno di 20, incrementa i di 1

   digitalWrite (13, HIGH); // abilita il pin 13 come uscita alta
   delay (250); // pausa per 1/4 di secondo
   digitalWrite (13, LOW); // abilita il pin 13 come uscita bassa
   delay (250); // pausa per 1/4 secondo
}

Nota: Nel linguaggio C il ciclo for è molto più flessibile rispetto ai cicli che si trovano in altri linguaggi di programmazione, incluso il BASIC.

Qualsiasi o tutti e tre gli elementi di intestazione possono essere omessi, anche se i punti e virgola sono obbligatori.

Le dichiarazioni per l’inizializzazione, la condizione e l’espressione possono essere sostituiti da valide istruzione di linguaggio C utilizzando delle variabili indipendenti. Questo uso è piuttosto insolito ma può essere utilizzato per delle rare soluzioni ad alcuni problemi di programmazione.

While

È un comando simile a If.

Il ciclo while esegue all’infinito le istruzioni racchiuse tra le parentesi graffe fino a quando la condizione racchiusa dentro le parentesi tonde diventa falsa.

Qualcosa deve far cambiare la variabile in esame, o il ciclo while non potrà mai uscire. Questo potrebbe essere scritto nel codice, come ad esempio una variabile che viene incrementata, o una condizione esterna, come il dato proveniente da un sensore.

while (someVariable? value)
{
   doSomething;
}

L’esempio seguente controlla se la varabile ‘someVariable’ è inferiore a 200 e se è vera esegue le istruzioni all’interno delle parentesi e continuerà all’infinito finché la variabile ‘someVariable’ non diventa maggiore o uguale a 200.

while (someVariable <200) // verifica se meno di 200
{
   doSomething; // esegue le istruzioni racchiuse tra le parentesi graffe
   someVariable++; // la variabile viene incrementata di una unità
}

Do … while

Il ciclo do … while si comporta come l’istruzione while ma con una importante differenza: esegue almeno una volta l’istruzione all’interno del ciclo do-while. Quindi viene usato quando si vuole che il codice dentro le parentesi graffe venga eseguito almeno una volta prima di verificare la condizione.

do
{
   doSomething;
} while (someVariable ?? value);

L’esempio seguente assegna il valore di readSensors () alla variabile ‘x’, si ferma per 50 millesimi di secondo, poi inizia il ciclo fino a quando ‘x’ è meno di 100:

do
{
   x = readSensors(); // assegna il valore di readSensors() a x
   delay (50); // pausa di 50 milliseconds
} while (x < 100); // inizia il ciclo finché x è minore di 100

Altro esempio

do
{
   digitalWrite(13,High);
   delay(100);
   digitalWrite(13,High);
   delay(100);
   sensorValue= analogRead(1);
} while (sensorValue < 512);