troppi delay

salve

ho scritto questo piccolo codice per gestire cio' che la gente definisce "grow"... una serretta in casa... un piccolo favore per un caro amico...

lo sketch è troppo lungo per essere inserito quindi se avete voglia di aiutarmi potete vederlo qui.

ora vorrei inserire questa parte di codice:

  //*****   ciclo aspiratore ventilatore 
        
       if (now.hour() >= 15){
            digitalWrite(relay3, HIGH);   
            delay(300000);              
            digitalWrite(relay3, LOW);     
            delay(120000); 
            digitalWrite(relay4, HIGH);   
            delay(1320000);              
            digitalWrite(relay4, LOW); 
            delay(60000);                          
         }
         
       if (now.hour() <= 9){
            digitalWrite(relay3, HIGH);   
            delay(300000);              
            digitalWrite(relay3, LOW);     
            delay(120000); 
            digitalWrite(relay4, HIGH);   
            delay(1320000);              
            digitalWrite(relay4, LOW); 
            delay(60000); 
         }

ma i delay presenti influenzano il comportamento dello sketch e la lettura dei sensori ritarda di troppo, interferendo sul clima della grow.... ad esempio si accende la serpentina e per 30 min non si spegne piu, rischiando di ammazzare tutte le piantine carnivore di bepi.... sai che guaio!
Qualcuno mi puo suggerire una valida soluzione. Grazie

Non so più quante volte l'avremo detto e ripetuto su questo forum ...
... invece della delay(), IMPARATE A SCHEDULARE LE COSE CON LA millis() !!! :smiling_imp:

Quindi ... devi studiarti come si usa la millis() prima QUI, poi QUI ed infine leggi anche QUI ... vedrai che, alla fine, ti sarà tutto più chiaro.

Guglielmo

speravo in un consiglio con sketch annesso... va bè mi metto a studiare... grazie lo stesso :smiling_imp:

Scherzi a parte, non sarebbe meglio utilizzare la libreria SecTimer? sto chiedendo un consiglio, tanto vale poi riscrivere tutto il codice perché si scopre che è meglio....

-d0b-:
Scherzi a parte, non sarebbe meglio utilizzare la libreria SecTimer?

Non la conosco e non la uso ...
... preferisco avere il controllo diretto (... e ottimizzato) della situazione usando direttamente la millis().

Guglielmo

P.S.: Ho letto quello che fa e, per lo scopo per cui tu devi usare la millis(), mi sembra inutile usare la la SecTimer :roll_eyes:

-d0b-:
speravo in un consiglio con sketch annesso...

In quei link ci sono anche gli esempi

paulus scherzavo... un po' di humor ci stà...

comunque di sti mills non ciò capito una mazza, quindi ho pensato di impostare l'accensione dei dispositivi con l'rtc:

 //   dalle 00:00 alle 9:00 => 9 ore
             
       if  (now.hour() <= 9){
      if (((t1+t2+t3)/3) >= tMAX) {
        digitalWrite(relay3, HIGH);}   // accensione aspiratore 
      if (((t1+t2+t3)/3) <= (tMIN+1)) {    
        digitalWrite(relay3, LOW);}   // spegnimento aspiratore 
          
      if (((t1+t2+t3)/3) <= tMIN) {
        digitalWrite(relay2, HIGH);}   // accensione stufa
      if (((t1+t2+t3)/3) >= (tMAX-1)) {    
        digitalWrite(relay2, LOW);}   // spegnimento stufa    
        
        
       if (now.minute() == 0){
        digitalWrite(relay4, HIGH);}   // accensione ventilatore  
     if (now.minute() == 5){
        digitalWrite(relay4, LOW);}   
     if (now.minute() == 15){
        digitalWrite(relay4, HIGH);}   // accensione ventilatore  
     if (now.minute() == 20){
        digitalWrite(relay4, LOW);} 
      if (now.minute() == 30){
        digitalWrite(relay3, HIGH);}   // accensione aspiratore  
     if (now.minute() == 35){
        digitalWrite(relay3, LOW);}
     if (now.minute() == 45){
        digitalWrite(relay4, HIGH);}    // accensione ventilatore 
     if (now.minute() == 50){
        digitalWrite(relay4, LOW);}          
        
    }

purtroppo non funziona in quanto il comando

if  (now.hour() <= 9){
      if (((t1+t2+t3)/3) >= tMAX) {
        digitalWrite(relay3, HIGH);}   // accensione aspiratore 
      if (((t1+t2+t3)/3) <= (tMIN+1)) {    
        digitalWrite(relay3, LOW);}   // spegnimento aspiratore

impedisce l'accensione del rele ai 30 minuti di ogni ora, a causa della temperatura che non eccede quella massima

if (now.minute() == 30){
        digitalWrite(relay3, HIGH);}   // accensione aspiratore  
     if (now.minute() == 35){
        digitalWrite(relay3, LOW);}

secondo voi si puo forzare quell'accensione?

non ho letto tutto lo sketch, ma con tutti questi IF io proverei ad usare lo SWITCH