Go Down

Topic: troppi delay (Read 1 time) previous topic - next topic

-d0b-

Apr 08, 2015, 08:17 pm Last Edit: Apr 08, 2015, 08:18 pm by -d0b-
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:

Code: [Select]
 //*****   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

gpb01

#1
Apr 08, 2015, 08:24 pm Last Edit: Apr 08, 2015, 08:28 pm by gpb01
Non so più quante volte l'avremo detto e ripetuto su questo forum ...
... invece della delay(), IMPARATE A SCHEDULARE LE COSE CON LA millis() !!!  :smiley-evil:

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
Search is Your friend ... or I am Your enemy !

-d0b-

#2
Apr 08, 2015, 10:08 pm Last Edit: Apr 08, 2015, 10:08 pm by -d0b-
speravo in un consiglio con sketch annesso... va bè mi metto a studiare... grazie lo stesso  :smiley-twist:

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

gpb01

#3
Apr 09, 2015, 04:28 am Last Edit: Apr 09, 2015, 04:38 am by gpb01
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 :smiley-roll:
Search is Your friend ... or I am Your enemy !

paulus1969

speravo in un consiglio con sketch annesso...
In quei link ci sono anche gli esempi

-d0b-

#5
Apr 09, 2015, 05:49 pm Last Edit: Apr 09, 2015, 05:50 pm by -d0b-
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:

Code: [Select]
//   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

Code: [Select]
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

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


secondo voi si puo forzare quell'accensione?

stefa24

#6
Apr 09, 2015, 08:16 pm Last Edit: Apr 09, 2015, 08:18 pm by stefa24
non ho letto tutto lo sketch, ma con tutti questi IF io proverei ad usare lo SWITCH
https://sites.google.com/site/agritronica/
https://sites.google.com/site/t3chconcrete/
https://www.youtube.com/channel/UCnY1DNrSywgadjyqqtbvyew

Go Up