Comandi Tempo

Ciao a tutti. Finalmente incomincio a creare qualcosa di più interessante con arduino. Ma per un mio progetto ho bisogno del vostro aiuto (essendo non tanto esperto ancora e avendo incominciato da poco a programmare un arduino).
Io vorrei aver un ON/OFF di tot relè a tempi diversi per 60000 ms poi vorrei che questi tot di relè andassero tutti in OFF e dopo 60000 tornare alla situazione di ON/OF con tempi variabili e così a loop.

Ora per la gestione dei relè sto usando la funzione millis ma non riesco a creare questa "timeline" che gestisce le due operazioni che vanno poi in loop.
Uso un Arduino (genuino) UNO.

questo è lo sketch che per adesso ho creato per la gestione dei relè:

const int RELAYa =  2; // the number of the LED pin
const int RELAYb =  3;
const int RELAYc =  4;
int State = 0; // ledState used to set the LED
int time;
int State1 = 0;
int State2 = 0;
unsigned long previousMillis1 = 0; //will store last time LED was updated
unsigned long interval1 = 100; //interval at which to blink (milliseconds)
unsigned long previousMillis2 = 0;
unsigned long interval2 = 200;
unsigned long previousMillis3 = 0;
unsigned long interval3 = 600;

void setup() {
 pinMode(RELAYa, OUTPUT); //set the digital pin as output:
 pinMode(RELAYb, OUTPUT);
 pinMode(RELAYc, OUTPUT);
}

void loop() {

 
 unsigned long currentMillis = millis();
 if(currentMillis - previousMillis1 > interval1) {
   previousMillis1 = currentMillis; //save the last time you blinked the LED
   //if the LED is off turn it on and vice-versa:
   State ^= 1;
   digitalWrite(RELAYa, State);



   unsigned long currentMillis = millis();
 if(currentMillis - previousMillis2 > interval2) {
   previousMillis2 = currentMillis; //save the last time you blinked the LED
   //if the LED is off turn it on and vice-versa:
   State1 ^= 1;
   digitalWrite(RELAYb, State1);


   unsigned long currentMillis = millis();
 if(currentMillis - previousMillis3 > interval3) {
   previousMillis3 = currentMillis; //save the last time you blinked the LED
   //if the LED is off turn it on and vice-versa:
   State2 ^= 1;
   digitalWrite(RELAYc, State2);

   time = millis();

  
    } 
   
 }
 }
}

Grazie mille per l'aiuto ragazzi!

Buongiorno,
prima di tutto, essendo il tuo primo post, nel rispetto del regolamento (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione … possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO

… dopo di che, in conformità al suddetto regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra). Grazie,

Guglielmo

Scusami per questo inconveniente non avevo fatto caso al regolamento e mi ero buttato subito a scrivere il post.
Scusami ancora e ora farò tutto bene!
Grazie mille!

P.s: il posto lo devo ripostare bene in un altra categoria?

Grazie ancora

ravellevar:
P.s: il posto lo devo ripostare bene in un altra categoria?

No, no, va bene così :slight_smile:

Io comincerei con UN relé (fai un LED) ... quando riesci a fare il ciclo ON/OFF per 60 sec e poi il ciclo OFF per altri 60 sec. e a ripetere .. passare a più di uno sarà semplice :wink:

Guglielmo

Ehi grazie! Come faccio ad impostare il ciclo che ho creato di on off per 1 minuto e il ciclo di off per un altro minuto?

Cominciamo con il caso più semplice, NON devi fare altre cose oltre quelle descritte, allora ...

... puoi creare due cicli, esempio con dei while(), ad cui esci solo dopo che sono passati 60 sec. (... basta strutturare bene la condizione nel while() usando millis()), nel primo fai le attivazionio a tempo con la solita tecnica (tanto continui a girare dentro al primo while() per 60 sec) e nel secondo non fai nulla ... è un ciclo di pausa ...

Guglielmo

Ah ok perfetto ora provo con i while!
Grazie mille per questo aiuto.

ravellevar:
questo è lo sketch che per adesso ho creato per la gestione dei relè

Non è indentato correttamente (va usata almeno al formattazione automatica delli'IDE). Se fosse indentato correttamente si vedrebbe subito che quegli if sono scritti uno dentro l'altro, quindi il secondo viene valutato solo quando diventa vero il primo, e il terzo solo quando sono contemporaneamente veri i primi due.

currentMillis rappresenta il tempo attuale , basta acquisirlo una volta per ciclo programma prima di tutti gli if.

La variabile time in questo codice non ha alcuna funzione.

Scusami per l’insistenza ma ho provato più volte a capire e cambiare la programmazione per creare i due loop che si alternano e non riesco ad ottenere il reale risultato finale.

Penso che lo sketch non sia completamente errato ma non capisco cosa manca o cosa ha di sbagliato

const int RELAYa =  2; 
const int RELAYb =  3;
const int RELAYc =  4;
unsigned long time_since_reset = 0;
int interval_one = 5000;
int interval_two = 1000;
int State   = 0; 
int State1 = 0;
int State2 = 0;
unsigned long previousMillis1 = 0; 
unsigned long interval1 = 200; 
unsigned long previousMillis2 = 0;
unsigned long interval2 = 600;
unsigned long previousMillis3 = 0;
unsigned long interval3 = 1000;

void setup() {
  pinMode(RELAYa, OUTPUT); 
  pinMode(RELAYb, OUTPUT);
  pinMode(RELAYc, OUTPUT);
 

}

void loop() 

{
  time_since_reset = millis();
  while ((millis() - time_since_reset) < interval_one) {
    
  
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis1 > interval1) {
    previousMillis1 = currentMillis; 
    
    State ^= 1;
    digitalWrite(RELAYa, State);



   
  if(currentMillis - previousMillis2 > interval2) {
    previousMillis2 = currentMillis; 

    State1 ^= 1;
    digitalWrite(RELAYb, State1);


    
  if(currentMillis - previousMillis3 > interval3) {
    previousMillis3 = currentMillis; 

    State2 ^= 1;
    digitalWrite(RELAYc, State2);
}
   
    time_since_reset = millis();
    while ((millis() - time_since_reset) < interval_two){

      digitalWrite(RELAYa, 0);
      digitalWrite(RELAYb, 0); 
      digitalWrite(RELAYc, 0);
  }
  }
  }
  }
  }

Così penso di avere creato due loop il primo di 5sec in cui ho un ON/OFF dei relè dopo 5sec dovrebbe partire il secondo loop che dura 1sec in cui tutto è spento e così da capo. Dove è il problema?

Ti prego aiutami a capire!

Grazie mille.

Cosa ti avevo detto ? Di fare le cose per gradi, UN SOLO relè all'inizio e di valutare bene la condizione del while() ...

Ritenta così e ... scrivi il codice come si deve, senza righe vuote inutili e con le giuste indentature che così ... non si può guardare !!!

Guglielmo

Perfetto ho risolto creando solo un ciclo con while!
Grazie mille per l'aiuto.
:slight_smile: ;D :wink: :smiley: ;D 8)