Irrigazione automatica

Ok, allora ci sono innanzitutto delle grosse lagune con le basi del C :slight_smile:

Se lo switch non è chiaro, meglio prima vedere questo confronto con un if del tutto equivalente, è solo una struttura decisionale scritta in altro modo. Entrambi i codici eseguono solo 'istruzioni_a' o solo 'istruzioni_b' a seconda del valore della variabile 'x'. Se il valore della variabile non corrisponde a nessuno dei test precedenti vengono eseguite 'istruzioni_c'.

switch (x)
{
    case 20:
        ...istruzioni_a...
    break;
    
    case 30:
        ...istruzioni_b...
    break;

    default:
        ...istruzioni_c...
    break;
}
if (x == 20) 
{
    ...istruzioni_a...
}
else if (x == 30) 
{
    ...istruzioni_b...
}
else
{
    ...istruzioni_c...
}

Detto ciò con le define crei dei nomi di comodo/etichette, quindi scrivere un valore o il nome creato con la define è la stessa cosa, perché alla compilazione nei punti dove hai scritto i nomi questi verranno sostituiti con i valori. Quindi si:

byte currentPhase = PH_START;

è esattamente come scrivere:

byte currentPhase = 0;

Ma la prima forma è più chiara perché non serve andare in cerca di (o ricordarsi) cosa voglia dire lo zero. E questo è un consiglio sempre valido: evitare di cospargere il codice di numerini che non è chiaro cosa rappresentano, ad esempio la riga seguente è una scrittura su un pin di uscita, ma non abbiamo alcuna idea sulla funzione del pin, e neppure se vuol dire che quello che vi è collegato lo stiamo accendendo o spegnendo (ad esempio se è un relé in logica negativa lo stiamo spegnendo, ma senza commenti e schemi tocca tirare a indovinare):

digitalWrite(3, HIGH);

Invece la riga seguente è chiarissima, sappiamo che stiamo accendendo e anche cosa. È sufficiente scrivere all'inizio del codice le define coerenti con i collegamenti hardware e con i livelli HIGH o LOW presenti sui pin di ingresso o voluti sui pin di uscita:

digitalWrite(POMPA, LIVELLOACCESO);

NEXTPHASE è una macro, concetto più avanzato che personalmente non avrei introdotto in questo esempio, di fatto opera sempre con una sostituzione ed è come se scrivessi:

currentPhase = currentPhase + 1;
currentPhase = PH_RUN;   //invece qui contrariamente alla riga sopra
non stiamo usando una logica variabile (passatemi il termine) ma stiamo
semplicemente dicendo che la fase attuale è 1

Esatto. Tra l'altro i valori sono del tutto convenzionali, una fase può essere la 50 e quella successiva la 25, per cui l'incremento di 1 della fase ha senso solo nei casi specifici di una sequenza lineare, che so... le fasi notte alba giorno tramonto di un presepio... ma vedi ben che dopo il tramonto non basta incrementarla, va riportata al valore di notte.

E per concludere grazie, se non mi fossi fermato a rispondere a questo post adesso sarei in bicicletta sotto la pioggia :smiley: :smiley: :smiley: