Nella descrizione di un algoritmo si può verificare che le operazioni da eseguire siano diverse a seconda dei dati inseriti.

Ad esempio, se dobbiamo andare in vacanza, dobbiamo verificare di non avere "debiti scolastici" a settembre, e quindi si prospettano due soluzioni alternative:

  • se abbiamo tutte sufficienze, allora andiamo in vacanza;
  • altrimenti dobbiamo studiare tutta l'estate.

Nel diagramma a blocchi questa situazione è illustrata ricorrendo a un elemento grafico specifico, detto blocco di test o di confronto.

Blocco di confronto: al suo interno vengono effettuate operazioni di confronto e il risultato può essere soltanto  O NO (oppure VERO O FALSO).

Di seguito riportiamo alcuni esempi di istruzioni di confronto che possiamo scrivere nei blocchi condizionali.

  • Ho soldi sufficienti per comperare la moto?
  • Il serbatoio è pieno?
  • Il numero 50 è maggiore di 0?
  • Giochi a calcio?
  • Mario è un alunno di questa classe?
  • 27 è un numero pari?

A queste domande si può solo rispondere oppure NO, esistono cioè soltanto due alternative: si tratta dunque di "istruzioni di confronto" che prendono il nome di condizioni logiche dalle quali, a seconda del valore della risposta, è sempre necessario intraprendere percorsi alternativi, cioè in base alla risposta è necessario eseguire operazioni diverse.

Li rappresentiamo graficamente nei diagrammi a blocchi con uno schema come il seguente:

 

 

 

Possiamo osservare che, a seconda della risposta data alla domanda (cioè al test), le strade "si dividono", vengono eseguite operazioni diverse nei due "rami" ma, successivamente, si ricongiungono.

La presenza di istruzioni in entrambi i rami del diagramma fa sì che in questo caso si parli di selezione doppia. Scriviamo il diagramma a blocchi per l'algoritmo "semplificato" che descrive la procedura per l'acquisto di una moto.

 

Vediamo come si traduce l'istruzione di selezione doppia con Arduino.

Con un pulsante e due LED, progetta un sistema in cui:

  • con il pulsante rilasciato si accende solo il LED rosso;
  • premendo il pulsante si accende solo il LED verde.

 

Soluzione

Si colleghi il pulsante al pin7 (con pull-up interno) e i LED rosso al pin 12 e verde al pin 13.

Il codice dello sketck

bool puls;
const int pinPuls=7;
const int pinRosso=12;
const int pinVerde=13;

void setup()
{
pinMode(pinPuls, INPUT_PULLUP);
pinMode(pinRosso, OUTPUT);
pinMode(pinVerde, OUTPUT);
}
void loop()
{
puls=digitalRead(pinPuls);

if (puls==1)
 {
digitalWrite(pinRosso, HIGH);
digitalWrite(pinVerde, LOW);
 }
else
 {
digitalWrite(pinRosso, LOW);
digitalWrite(pinVerde, HIGH);
 }
}

 

Nello sketch puoi notare che:

  • sono state definite le costanti intere pinPuls-7, pinRosso-12 e pinVerde =13, che memorizzano i pin a cui sono collegati il pulsante e i due LED; queste sono poi richiamate nello sketch. In questo modo il programma è più leggibile e, nel caso in futuro si volesse modificare i pin a cui sono collegati i componenti, sarà sufficiente variare il contenuto delle costanti all'inizio dello sketch.
  • È stata usata l'istruzione IF...ELSE per compiere due azioni differenti secondo il valore della variabile puls: se è soddisfatta la condizione tra parentesi (puls==1), sono eseguite le istruzioni del blocco tra le graffe successive, altrimenti quelle del blocco dopo l'else.
  • Il simbolo = è usato per assegnare un valore a una variabile/costante, ad esempio puls=0.
  • Il simbolo == è usato nelle espressioni per effettuare un confronto (il risultato è booleano, vero o falso); ad esempio nella istruzione if(puls==1) l'espressione tra parentesi è VERA se puls vale 1. È equivalente scrivere if(puls) ma, per maggiore chiarezza, evidenziamo la condizione completa.

La sintassi dell'istruzione IF...ELSE è:

 

if (espressione) {

// blocco di istruzioni A

else {

// blocco di istruzioni B

}

Se espressione è VERA si esegue il blocco di istruzioni A, altrimenti viene eseguito il blocco B.

L'else è facoltativo e va eliminato se non esiste alternativa ad A:

if (espressione) {

// blocco di istruzioni A

}