if ((ora > Pompa_Lim2) and (minu > Pompa_Lim2a)) and ((ora < Pompa_Lim2b) and (minu < Pompa_Lim2c))
{
digitalWrite(Pompa2, HIGH); // set the Relay 4 on
digitalWrite(Pompa1, LOW); // set the Relay 3 off
Serial.println(" Pompa2 ON ");
Serial.println(" Pompa1 OFF ");
}
ho controllato, facendoli stampare, i valori di ora e min che sono 6 e 28;
cio' che viene dopo if dovrebbe essere eseguito, invece viene saltato, perché?
Attenzione alle logiche negli if con i controlli sugli orari. Essi sono condizioni particolari da controllare.
L'esempio di willy non è particolarmente complicato perché deve accendere dalle 6:00 alle 12:00 ma se doveva accendere dalle 6:00 alle 10:10 il suo controllo non funziona.
se (6 >= 6 e 28 >= 0) e (6 <= 11 e 28 <= 10)
Vedete che nella seconda condizione, 28 non può essere minore o uguale a 10.
Io consiglio sempre di separare i 2 test, quelli sulle ore e quelli sui minuti. Prima si controlla se le ore sono comprese nell'intervallo e poi si controllano i minuti:
Un'alternativa è quella di convertire l'orario nell'elemento più piccolo. Ad esempio se si deve fare un controllo su ore:minuti si trasforma tutto in minuti prima del check, usando poi un solo if. Esempio:
orario = (ore*60) + minuti
if (orario >= orarioInizio) && (orario <=orarioFine)) {
..
}
if ((ora > Pompa_Lim2) and (minu > Pompa_Lim2a)) and ((ora < Pompa_Lim2b) and (minu < Pompa_Lim2c))
{
digitalWrite(Pompa2, HIGH); // set the Relay 4 on
digitalWrite(Pompa1, LOW); // set the Relay 3 off
Serial.println(" Pompa2 ON ");
Serial.println(" Pompa1 OFF ");
}
ho controllato, facendoli stampare, i valori di ora e min che sono 6 e 28;
cio' che viene dopo if dovrebbe essere eseguito, invece viene saltato, perché?
se non ti spieghi "bene è un casino"
sembra che vuoi attivare e disattivare 4 rele con una riga sola
[quote author=leo72 link=topic=121481.msg914436#msg914436 date=1346824145]
Io consiglio sempre di separare i 2 test, quelli sulle ore e quelli sui minuti. Prima si controlla se le ore sono comprese nell'intervallo e poi si controllano i minuti:
[code]if ((ore >= orarioInizio) && (ore <= orarioFine)) {
if ((minuti >= minutiInizio) && (minuti <= minutiFine)) {
....
}
}
[/quote]
ma anche in questo caso "minuti >= minutiFine"
Un'alternativa è quella di convertire l'orario nell'elemento più piccolo. Ad esempio se si deve fare un controllo su ore:minuti si trasforma tutto in minuti prima del check, usando poi un solo if. Esempio:
orario = (ore*60) + minuti
if (orario >= orarioInizio) && (orario <=orarioFine))
questa invece mi sembra perfetta ed elimina tutti i problemi.
comunque come avete fatto notare, l'errore era nel > invece di >=, cambiato quello è andato tutto a posto
[/code]
willy12:
ma anche in questo caso "minuti >= minutiFine"
Non ho capito la tua osservazione. Perché dici che deve essere minuti maggiore o uguale a minutiFine?
Quando si deve controllare che una variabile rientri in un certo intervallo, si fa un doppio controllo prima per vedere se il valore è maggiore del minimo e poi se è minore del massimo.
x>=minimo && x <=massimo.