if che non viene elaborato correttamente

ciao,

poche linee di codice che mi stanno facendo penare:

int Pompa_Lim2 = 6, Pompa_Lim2a = 0, Pompa_Lim2b = 11, Pompa_Lim2c = 59;

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é?

hai aperto il topic nella sezione sbagliata! :0 aprilo in software..

comunque non entra nell'if perchè la prima condizione è falsa...

nell' if mancano delle parentesi

if (((ora >= Pompa_Lim2) && (minu >= Pompa_Lim2a)) && ((ora <= Pompa_Lim2b) && (minu <= Pompa_Lim2c)))

userei >= altrimenti si accende alle 7
simbolo di AND &&
simbolo di OR ||

dici che i valori di ora e min che sono ore=6 e minu=28
se (6 >= 6 e 28 >= 0) e (6 <= 11 e 28 <= 59) sono entrambe vere con quell'orario

la pompa sta accesa dalle 6 alle 12

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:

if ((ore >= orarioInizio) && (ore <= orarioFine)) {
  if ((minuti >= minutiInizio) && (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)) {
  ..
}

Se si usano anche i secondi:

orario = (ore*3600) + (minuti*60) + secondi
if (orario >= orarioInizio) && (orario <=orarioFine)) {
  ..
}

Ovviamente orarioInizio e orarioFine sono anch'essi calcolati con la stessa unità di misura.

willy12:
ciao,

poche linee di codice che mi stanno facendo penare:

int Pompa_Lim2 = 6, Pompa_Lim2a = 0, Pompa_Lim2b = 11, Pompa_Lim2c = 59;

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 :fearful:

[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.

minuti dovrebbe essere inferiore di minutiFine e non lo è, con gli orari questo sistema non funziona;

se voglio bloccare la pompa alle 6 e 10 alle 5 e 50 i minutiFine sono 10 e l'orario è 50 quindi il confronto fallisce e la pompa si spegne;

Ah, ho capito cosa intendevi.
Sì, effettivamente hai ragione tu. Non ci ho pensato lì per lì.
Meglio il secondo metodo, quello funziona senz'altro. :sweat_smile: