Generalmente dovresti cercare di spiegare meglio cosa intendi esattamente, magari con un esempio.
Comunque lo interpreto così: "se imposto ora1_on e min1_on alle 20:45 e ora1_off e min1_off alle 21:15 non attiva correttamente l'irrigazione". Ovvero questi parametri (tra l'altro metti insieme ore e minuti dello stesso evento che si legge meglio):
byte ora1_on = 20; // ci salvo la programmaz oraria uscita 1
byte min1_on = 45;
byte ora1_off = 21;
byte min1_off = 15;
Quindi quando vai a controllare dato che fai:
if (ora >= ora1_on && ora <= ora1_off)
{
if (minuti >= min1_on && minuti < min1_off)
{
digitalWrite(LINEA1, HIGH); // accendo linea 1 (piante grandi, non giornaliero)
}
else
{
digitalWrite(LINEA1, LOW); // spengo linea 1 (piante grandi, non giornaliero)
}
}
else
{
digitalWrite(LINEA1, LOW); // spengo linea 1 (piante grandi, non giornaliero)
}
di fatto è come scrivere:
if (ora >= 20 && ora <= 21)
{
if (minuti >= 45 && minuti < 15)
{
digitalWrite(LINEA1, HIGH); // accendo linea 1 (piante grandi, non giornaliero)
}
else
...
ed ovviamente "minuti" non può mai essere maggiore di 45 e minore di 15.
Devi "accorpare" ore e minuti in un valore equivalente ai minuti totali, moltiplicando le ore per 60 e sommando questo ai minuti e confrontare questo con gli intervalli:
int orario(int h, int m) {
return(h*60+m);
}
e quindi puoi fare una cosa del genere al posto di tutte quelle if():
if ( orario(ora,minuti) >= orario(ora1_on, min1_on)
&& orario(ora,minuti) < orario(ora1_off, min1_off))
digitalWrite(LINEA1, HIGH); // accendo linea 1 (piante grandi, non giornaliero)
else
digitalWrite(LINEA1, LOW); // spengo linea 1 (piante grandi, non giornaliero)
Oppure usare una codifica numerica più semplice, moltiplicando le ore per 100 invece che 60 per cui puoi fare così semplificando anche la definizione degli orari:
...
int ora1_on = 2045; // ci salvo la programmaz oraria uscita 1
int ora1_off = 2115;
...
e quindi memorizzando in una variabile l'ora corrente nello stesso formato (int adesso=ora*100+minuti;), puoi fare:
...
if ( adesso >= ora1_on && adesso < ora1_off )
digitalWrite(LINEA1, HIGH); // accendo linea 1 (piante grandi, non giornaliero)
else
digitalWrite(LINEA1, LOW); // spengo linea 1 (piante grandi, non giornaliero)
...
o in modo ancora più compatto:
...
// linea 1 (piante grandi, non giornaliero)
digitalWrite(LINEA1, ( adesso >= ora1_on && adesso < ora1_off ));
...
A questo punto io trasformerei le variabili della programmazione in un array, per poi gestire tutte le zone con una for() invece di replicare lo stesso codice, arrivando infine a leggere la programmazione da una scheda SD così se vuoi cambiare gli orari non devi ricompilare e ricaricare tutto il codice...
Ma per ora non voglio incasinarti troppo la cosa, intanto fai funzionare questo codice, e se poi vorrai potremo anche vedere il resto 