Skip to content

if, else, else if

Fino ad ora il codice che abbiamo visto è sequenziale: Arduino esegue le istruzioni una dopo l’altra, sempre, senza eccezioni. Ma un programma utile deve saper reagire a situazioni diverse in modo diverso.

Un termostato deve accendere il riscaldamento se fa freddo e spegnerlo se fa caldo. Un allarme deve suonare se rileva movimento e stare silenzioso altrimenti. Per fare questo esiste il costrutto if.


if significa letteralmente “se”. Permette di eseguire un blocco di codice solo se una certa condizione è vera.

// Sintassi:
// if (condizione) {
//   istruzioni eseguite solo se la condizione è vera
// }

int temperatura = 30;

if (temperatura > 25) {
  Serial.println("Fa caldo!");
}

Se temperatura è 30, la condizione 30 > 25 è vera (true) e il messaggio viene stampato. Se temperatura fosse 20, la condizione 20 > 25 sarebbe falsa (false) e il blocco verrebbe completamente saltato.

All’interno della condizione si usano questi operatori per confrontare valori:

OperatoreSignificatoEsempio
==Uguale astato == HIGH
!=Diverso dastato != LOW
>Maggiore ditemp > 30
<Minore ditemp < 0
>=Maggiore o uguale alivello >= 100
<=Minore o uguale alivello <= 0

else si aggiunge dopo un if e contiene il codice da eseguire quando la condizione è falsa. È il ramo “altrimenti”.

int temperatura = 15;

if (temperatura > 25) {
  Serial.println("Fa caldo, accendo il condizionatore.");
} else {
  Serial.println("Temperatura ok, condizionatore spento.");
}

Non vengono mai eseguiti entrambi i blocchi. È come un bivio: si prende sempre una strada, mai tutte e due insieme.


Quando le situazioni possibili sono più di due, si usa else if per aggiungere condizioni intermedie.

int temperatura = 10;

if (temperatura > 30) {
  Serial.println("Molto caldo.");
} else if (temperatura > 20) {
  Serial.println("Caldo.");
} else if (temperatura > 10) {
  Serial.println("Fresco.");
} else {
  Serial.println("Freddo!");
}

Arduino valuta le condizioni dall’alto verso il basso e si ferma alla prima che risulta vera. Il blocco else finale è opzionale e cattura tutti i casi non coperti dalle condizioni precedenti.


Esempio Pratico: Controllo di un LED con un Pulsante

Section titled “Esempio Pratico: Controllo di un LED con un Pulsante”
#define LED_PIN 5
#define BUTTON_PIN 3

void setup() {
  Serial.begin(9600);
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT);
}

void loop() {
  if (digitalRead(BUTTON_PIN) == HIGH) {
    digitalWrite(LED_PIN, HIGH);
    Serial.println("Pulsante premuto → LED acceso");

    delay(250);   // debounce
  } else {
    digitalWrite(LED_PIN, LOW);
    Serial.println("Pulsante rilasciato → LED spento");
  }
}

Un if può stare dentro un altro if. Si parla di if annidati. Tornando alla metafora dei blocchi padre e figlio: il blocco del secondo if è figlio del primo.

bool sistemaAttivo = true;
int temperatura = 35;

if (sistemaAttivo) {
  // Entro qui solo se il sistema è attivo
  if (temperatura > 30) {
    // Entro qui solo se il sistema è attivo E la temp è alta
    Serial.println("ALLARME: temperatura critica!");
  }
}