Problema X>=7 && X<=23

Ciao a tutti, chi riesce a scovare l’errore?

Il mio sketch, non é altro che un timer di lettura RTC che permette all’ acquario di avere luci e pompa ossigeno automatiche in base agli eventi orari.

Ora, funziona tutto perfettamente, anche troppo, nel senso che alla sezione //LASER, la luce, può accendersi dalle 7 del mattino alle 23, come da programma. Ma lo fa sempre… Il laser viene acceso per 15 secondi, si, ma ininterrottamente anche dopo le 23 e fino alle 7, cosa che non dovrebbe fare, visto che gli è imposto un “if ore>=7 && ore<=23”

Capisco che dicendogli “&& ore<=23” lui dice “dalle 00 alle 23 è minore di 23, perciò lo accendo”.

Allora come fare per dirgli che dalle 00 alle 7 non deve accendere?

Vi allego la parte del codice incriminata:

//LASER
if (sss>1 && sss<26 && hhh >= 7 && hhh<=23) {analogWrite(11,(sss*10));}
else if (sss>25) {analogWrite (11,0);}

Dove:
hhh=ora
sss=secondi

Grazie a tutti!

Ciao, Beppe. Benvenuto!

Con if (hhh>=7 && hhh<=23) già richiedi che hhh sia almeno 7 e non più di 23. Non mi sembra qui il problema…

Ciao Gianluca, Innanzitutto grazie per la risposta, infatti, se hhh deve essere >= a 7, perché non esclude da 00 a 06, e fa accendere lo stesso analogic(11) ?

Da lì non si capisce. Bisogna vedere il resto... L'hardware è corretto? Se fai pinMode(11, OUTPUT); nel setup() (ma non serve per il PWM) e digitalWrite (11, LOW); che fa l'uscita?

Posso postare tutto il listato, nn c’è problema, o solo una parte più estesa se serve a risolvere. Ma ci sono altre espressioni molto simili, ma non danno problemi... boh

Quali sono quelle simili che funzionano?
N.B.: per regola, i listati vanno riportati tra i tag CODE, facendo uso del tasto </> in alto a sinistra in “reply” o in “modify”

Chiedo scusa per il tag.
Sto usando la versione mobile, e solo ora mi compaiono gli strumenti :frowning:

Comunque ecco qui una funzione analoga e perfettamente funzionante:

// ACCENSIONE LED BLU
int hhh= D->hour;
int sss= D->second;
int mmm= D->minute;

  if (hhh >= 7 && hhh<23){analogWrite(9 ,255); analogWrite(10 ,255);}

I led blu si accendono alle 7 del mattino e si spengono alle 23. Perfettamente.
Così come dovrebbe fare quella maledetta espressione successiva :confused:

Il problema è la else if Devi usare degli if annidati

Appena torno a casa provo! Per ora grazie mille.

Perché? Se i secondi sono maggiori di 25, spegne sempre... a meno che 0 significhi acceso e 255 significhi spento...

Plat-Ykor:
Comunque ecco qui una funzione analoga e perfettamente funzionante:

// ACCENSIONE LED BLU

int hhh= D->hour;
int sss= D->second;
int mmm= D->minute;

if (hhh >= 7 && hhh<23){analogWrite(9 ,255); analogWrite(10 ,255);}




I led blu si accendono alle 7 del mattino e si spengono alle 23. Perfettamente.

Verifica anche che le variabili hhh e sss, tra il primo e secondo if, non vengano magari ri-dichiarate con un tipo differente.

Ciao

Datman: Perché? Se i secondi sono maggiori di 25, spegne sempre... a meno che 0 significhi acceso e 255 significhi spento...

Ho capito cosa intendi! Per questo, mi hai detto di togliere l' Else! 8) Vi faccio sapere. Grazie!

paolo311: Verifica anche che le variabili hhh e sss, tra il primo e secondo if, non vengano magari ri-dichiarate con un tipo differente.

Ciao

Grazie Paolo, si sì, controllato per prima istanza :-) non vengono dichiarate ulteriormente. Mi sa che il problema sta proprio nell’Else..dopo provo.

Datman:
Perché? Se i secondi sono maggiori di 25, spegne sempre… a meno che 0 significhi acceso e 255 significhi spento…

Peró, stavo pensando, se il problema fosse Else… non dovrebbero accendersi mai (nè dalle 7 alle 23 né dalle 00 alle 7), e sì, 255=acceso e 0=spento…

Boh, butto via la testa

Il problema è che non definisci l’uscita per sss<=25 al di fuori degli orari tra le 7 e le 23. Non dovrebbe, però, restare acceso ininterrottamente, ma solo per 26 secondi ogni minuto.

hhh>=7 && hhh<=23 è una condizione vera dalle 7.00.00 alle 23.59.59, quindi dalle 7 a mezzanotte (meno un secondo).

No, “sempre” intendevo, che dalle 23 alle 7 esegue comunque il ciclo di “fading”... ma nn dovrebbe farlo...

Ah! Dillo, allora! E' una differenza importante!

Così tutte le condizioni sono definite:

if(hhh>=7 && hhh<=23)
 {
 if(sss>1 && sss<26)
   {
   analogWrite (11, sss*10);
   }
 else analogWrite (11, 0); // Secondi da 26 a 1.
 }
else analogWrite (11, 0); // Di notte.

Okok dopo provo, non ho mai usato così tanti if annidati :)

Sono solo due! :-)