Irrigazione automatica

No no, l'errore c'è, ed è quello che temevo :slight_smile:

Lo switch deve funzionare in base al valore della variabile di fase, non del valore orario... Di fatto con lo switch hai scritto l'equivalente esatto di questo if... un sacco di condizioni che non risulteranno mai vere, o meglio, risulteranno vere solo a mezzanotte, a mezzanotte e un minuto, a mezzanotte e due minuti ecc, mentre per tutto il resto del tempo viene eseguito solo l'else:

if (ADESSO == RIEMPIMENTO)
{
    // istruzioni a
}
else if (ADESSO == RIPOSO)
{
    // istruzioni a
}
else if (ADESSO == CONCIMAZIONE)
{
    // istruzioni a
}
else
{
    if ((ADESSO >= INIZIO) && (ADESSO < FINE))
    {
        digitalWrite(PinPOMPA, ACCESO);
    }
    else
    {
        digitalWrite(PinPOMPA, SPENTO);
    }
}

Di solito nella parte default dello switch non c'è bisogno di scrivere nulla. Avviene tutto nei case (o nelle funzioni richiamate dai case). Ed è all'interno dei case che si controlla il valore dell'orario decidendo cosa fare.

      case RIPOSO:  // attendo l'orario, e in quel momento passo a fase irrigazione
          if (in_orario())
          {
              accendi_pompa();
              fase = IRRIGAZIONE;
          }
      break;

      case IRRIGAZIONE:  // attendo la fine orario, e in quel momento passo a riempimento
          if (!in_orario())
          {
              spegni_pompa();
              apri_valvola();
              fase = RIEMPIMENTO;
          }
      break;

Se scrivi tante piccole funzioncine (come accendi_pompa, in_orario ecc) hai l'intera logica scritta in italiano.

In maiuscolo andrebbero scritte solo le costanti, in modo da distinguerle dalle variabili minuscole.