Ritardo con Millis()

Salve a tutti,
ho creato un parte di Sketch che quando sono verificate delle condizioni esegue le seguenti fasi:

Condizioni ? ---> OK
Attendi un tempo stabilito;
accendi un led;
Attendi un tempo stabilito;
spegni il led;

lo Sketch che ho creato funziona, ma voglio imparare comandi nuovi che semplificano lo Sketch,
questo è parte del codice

int Thyristors;
int Pin_Thyristors = 7;
unsigned long previousMillis_Thyristors1 =0;
unsigned long interval_Thyristors1 = 365; 
unsigned long previousMillis_Thyristors2 =0;
unsigned long interval_Thyristors2 = 20; //Tempo interruttore on-off
int Sato_Thyristors = 0;

//Thyristors
          
void Ciclo_Thyristors(){
  if (Caso1 == A &&  Caso2== B){                                                                      //se si verifica le condizioni...
     previousMillis_Thyristors1 = millis();                                                                                   //assegna miillis() a previousMillis_Thyristors1
     Sato_Thyristors = 1;                                                                                                     //passa alla fasee successiva
  }
  else if (Sato_Thyristors == 1 && millis() - previousMillis_Thyristors1 == interval_Thyristors1){                            //esegui un ritardo inpostato da interval_Thyristors1
    Sato_Thyristors = 2;
    digitalWrite(led, HIGH);
    digitalWrite(Pin_Thyristors, HIGH);
    Serial.println(millis() - previousMillis_Thyristors1);
  }
  else if (Sato_Thyristors == 2 && millis() - previousMillis_Thyristors1 == interval_Thyristors1 + interval_Thyristors2){     //esegui un ritardo inpostato da interval_Thyristors2
    Sato_Thyristors = 3;
    digitalWrite(led, LOW);
    digitalWrite(Pin_Thyristors, LOW);
    Serial.println(millis() - previousMillis_Thyristors1);
  }
}

Spero di essere stato chiaro.

Grazie!
:slight_smile:

C'è poco da semplificare, il codice è minimo.
Al max potresti iniziare ad usare la manipolazione diretta delle porte logiche, ma si va su un livello superiore rispetto alle semplici istruzioni di Arduino.

Altra cosa, non fare mai confronti temporali col segno di "uguale" (==). Metti sempre le condizioni "maggiore o uguale" (>=) oppure "minore o uguale" (<=) perché se perdi quell'istante esatto, l'if viene saltato.

Grazie per i consigli su (=> ; =<), in futuro lo correggerò,
ma è corretto switchare le seguenti fasi:

Attendi un tempo stabilito;
accendi un led;
Attendi un tempo stabilito;
spegni il led;

con il comando
Sato_Thyristors = 1;
Sato_Thyristors = 2:
Sato_Thyristors = 3;

??

Lo stato o lo cambi dall'esterno (esempio leggendo un pin) oppure dall'interno. E' giusto perciò cambiare l'azione da eseguire assegnando ad una variabile un valore che poi vai ad analizzare con if o con switch

Grazie mille per il supporto!
o in questo caso... grazie Millis() per il supporto!

Parlando sempre di Millis(), ma un'altro Sketch, che funziona se lo voglio esegue una sola volta,
mentre se desidero metterlo dentro un ciclo for, non riesco a controllarlo, ho provato ferie soluzioni e non sono riuscito
a sbrogliare la matassa, la seguente è l'ultima soluzione che ho provato, ma non va!
dove sbaglio??

void Ciclo_SolenoidValve() {
  if(Start_Ciclo == 1){         
     for(int i=0;i<10;i++){   
       if(Stato_SolenoidValve1 == 1){
        Serial.println("Led ON");
        digitalWrite(Pin_SolenoidValve, HIGH);
        digitalWrite(led, HIGH);
        Stato_SolenoidValve1 = 2;        
       }
       
      else if (millis()-previousMillis_SolenoidValve1 >= interval_SolenoidValve1+interval_SolenoidValve2 && Stato_SolenoidValve1 == 2){
        Serial.println("Led OFF");
        digitalWrite(Pin_SolenoidValve, HIGH);
        digitalWrite(led, LOW);
        Stato_SolenoidValve1 = 3;
       }
       
      else if(millis()-previousMillis_SolenoidValve1>=interval_SolenoidValve1+interval_SolenoidValve2+interval_SolenoidValve3 && Stato_SolenoidValve1 == 3){
        Serial.println("Attesa");
        previousMillis_SolenoidValve1 = millis();
        Stato_SolenoidValve1 = 1;        
       Start_Ciclo=0;
      }
      
    }
 }
}

Non è mai cosa buona impegnare il micro in un ciclo lungo. Il for(int i=0;i<10;i++){ puoi realizzarlo in altro modo?

else if(millis()-previousMillis_SolenoidValve1>=interval_SolenoidValve1+interval_SolenoidValve2+interval_SolenoidValve3 && Stato_SolenoidValve1 == 3){

troppo lungo, mi ci vuole mezzora per capirlo, spezzalo.

// sumInterval lo calcoli una volta e lo usi due volte
sumInterval = interval_SolenoidValve1+interval_SolenoidValve2+interval_SolenoidValve3;
else if ( (millis() -previousMillis_SolenoidValve1) >= sumInterval && (Stato_SolenoidValve1 == 3 )) {

previousMillis_SolenoidValve1, non lo aggiorni nella prima else if, ma solo nella seconda, forse è qui il problema.

Ciao.

Si, scusami è da circa un mese che gioco con arduino e non ho mai programmato in vita mia... "E si vede"

in realta quando schiaccio un pulsante in un altro sketch
imposto
Start_Ciclo == 1;
previousMillis_SolenoidValve1 = millis();

il problema che ho riscontrato e che all'inizio il ciclo for lo eseguiva all'infinito

questo è lo sketch abbreviato

void Ciclo_SolenoidValve() {
  if(Start_Ciclo == 1){         
     for(int i=0;i<Num_Gocce;i++){   
       if(Stato_SolenoidValve1 == 1){
        Serial.println("Led ON");
        digitalWrite(Pin_SolenoidValve, HIGH);
        digitalWrite(led, HIGH);
        Stato_SolenoidValve1 = 2;        
       }
       
      else if (millis()-previousMillis_SolenoidValve1 >= sumInterval_1 && Stato_SolenoidValve1 == 2){
        Serial.println("Led OFF");
        digitalWrite(Pin_SolenoidValve, HIGH);
        digitalWrite(led, LOW);
        Stato_SolenoidValve1 = 3;
       }
       
      else if(millis()-previousMillis_SolenoidValve1>= sumInterval_2 && Stato_SolenoidValve1 == 3){
        Serial.println("Attesa");
        previousMillis_SolenoidValve1 = millis();
        Stato_SolenoidValve1 = 1;        
       Start_Ciclo=0;
      }
      
    }
 }
}

Forse devo cambiare il comando for con quello while,
che aumento dentro l'ultimo ciclo...

void Ciclo_SolenoidValve() {
  if(Start_Ciclo == 1){         
     wile(int i<=10){   
       if(Stato_SolenoidValve1 == 1){
        Serial.println("Led ON");
        digitalWrite(Pin_SolenoidValve, HIGH);
        digitalWrite(led, HIGH);
        Stato_SolenoidValve1 = 2;        
       }
       
      else if (millis()-previousMillis_SolenoidValve1 >= sumInterval_1 && Stato_SolenoidValve1 == 2){
        Serial.println("Led OFF");
        digitalWrite(Pin_SolenoidValve, HIGH);
        digitalWrite(led, LOW);
        Stato_SolenoidValve1 = 3;
       }
       
      else if(millis()-previousMillis_SolenoidValve1>= sumInterval_2 && Stato_SolenoidValve1 == 3){
        Serial.println("Attesa");
        previousMillis_SolenoidValve1 = millis();
        Stato_SolenoidValve1 = 1;    
       Start_Ciclo=0;
       i++;                                   
      }
      
    }
 }
}

Non ho resistito......
ho provato a sostituire for con while e funziona alla perfezione!!!!

wile è un comando nuovo per me!
:slight_smile: