inviare comandi distanziati

salve

forse mi sto perdendo in un bicchiere d'acqua ma non sono espertissimo di programmazione
in un progetto devo inviare 5 comandi via seriale distanziati una dal altro di 500 millisecondi senza usare il delay ma immagino con il millis in tempo pari a 2,5 secondi poi ripetersi il tutto

esempio
tempo 0ms invio primo comando
tempo 500ms invio secondo comando
tempo 1000 ms invio .........
..............
tempo 2500 ms invio quinto comando

poi ripersi

mi potete aiutare grazie

Nel setup metti t=millis(); poi, nel loop, metti una variabile che conta continuamente da 1 a 5 e, in base al valore della variabile, invii il comando appropriato.

if (millis()-t>499)
  {
  t=millis();
  contatore+=1;
  if contatore==6 contatore=1;
  fatto=0;
  }

Ogni volta che invii un comando, metti
if(fatto==0) {invia il comando(); fatto=1;}
per evitare che venga ripetuto. Esempio:

if(fatto==0)
  {
  if(contatore==1) {invia_il_comando_1();}
  else if(contatore==2) {invia_il_comando_2();}
  ...
  fatto=1;
  }

Forse è più logico con da_fare:

if (millis()-t>499)
  {
  t=millis();
  contatore+=1;
  if contatore==6 contatore=1;
  da_fare=1;
  }

Ogni volta che invii un comando, metti
if(da_fare==1) {invia il comando(); da_fare=0;}
per evitare che venga ripetuto. Esempio:

if(da_fare==1)
  {
  if(contatore==1) {invia_il_comando_1();}
  else if(contatore==2) {invia_il_comando_2();}
  ...
  da_fare=0;
  }

Al posto degli if(contatore) / else puoi usare uno switch/case, ma credo che vengano compilati esattamente nello stesso modo.

Nota: ho fatto un po' di modifiche e aggiunte.

grazie mille

capito

ora ho un altro quesito
vorrei che in un loop mi invia tutti i 5 comandi come mi hai spiegato ogni 500 ms
nel loop successivo solo gli ultimi 2
poi ancora tutti
e cosi via

è possibile?

birrohgt:
è possibile?

Disegnarsi un diagrammino risolverebbe tanti dubbi :wink:

Deve contare
ciclo_rid==0: 1-2-3-4-5
ciclo_rid==1: 4-5

ciclo_rid==0: 1-2-3-4-5
ciclo_rid==1: 4-5

...

if (millis()-t>499)
  {
  t=millis();
  contatore+=1;
  if (!ciclo_rid)
    {
    if(contatore==6) {contatore=1; ciclo_rid=1;}
    }
  else
    {
    if(contatore==3) {contatore=1; ciclo_rid=0;}
    }
  da_fare=1;
  }


if(da_fare==1)
  {
  if(contatore==1) {invia_il_comando_1();}
  else if(contatore==2) {invia_il_comando_2();}
  ...
  da_fare=0;
  }

Uhm.. Così, però, fa
1-2-3-4-5
1-2

if (millis()-t>499)
  {
  t=millis();
  contatore+=1;
  if (!ciclo_rid)
    {
    if(contatore==6) {contatore=1; ciclo_rid=1;}
    }
  else
    {
    if(contatore==3) {contatore=1; ciclo_rid=0;}
    }
  da_fare=1;
  }


if(da_fare==1)
  {
  byte contatore_tot=contatore;
  if(ciclo_rid) contatore_tot+=3;
  if(contatore==1) {invia_il_comando_1();}
  else if(contatore==2) {invia_il_comando_2();}
  ...
  da_fare=0;
  }

grazie ma ci ho capito poco :frowning:

non capisco il ciclo_rid

È una variabile byte, che significa ciclo ridotto

ok capito si ho visto

pero forse non mi sono spiegato bene

il modo è giusto ma i tempi devono essere sempre gli stessi da un comando al altro

cerco di spiegare ogni comando singolo deve avere lo stesso tempo di stacco di ogni ciclo vuol dire che se nel ciclo 1 faccio 1,2,3,4,5 distaccati da uno dal altro 500ms fin qui ok
ma nel ciclo 2 praticamente il tempo totale deve essere uguale al ciclo 1 cioe deve ""saltare"" il comando 1,2,3 inserendo equivalente pausa per mantenere sempre il tempo totale del ciclo di 2.5 secondi altrimenti i comandi 4,5 sono ripetuti 2 volte nel arco di tempo troppo breve

non so se sono riuscito a spiegarmi

grazie ma non capisco il primo passaggio ciclo_rid == 00 or ciclo_rid == 1 and n>3 ????

È quello che hai chiesto: trasmettere N in tutti i passaggi in cui 'ciclo_rid' vale 0, e trasmettere N solo se maggiore di 3 nei passaggi in cui 'ciclo_rid' vale 1.

Claudio_FF:
È quello che hai chiesto: trasmettere N in tutti i passaggi in cui 'ciclo_rid' vale 0, e trasmettere N solo se maggiore di 3 nei passaggi in cui 'ciclo_rid' vale 1.

si ma N sono tutti comandi diversi ogni comando deve essere inviaro una volata sola ogni 500ms

Guarda, non è difficile

Se cerchi il mio 'la pappa è fatta' trovi almeno tre discussioni con tre differenti soluzioni
Basta mettersi di buzzo buono a leggere con un minimo di interesse e curiosità

birrohgt:
N sono tutti comandi diversi ogni comando deve essere inviaro una volata sola ogni 500ms

Non sono sicuro di intuire quale sia il dubbio.... "Trasmetti N" è una scritta generica che significa: trasmetti il comando relativo al valore di N, quindi può essere sia la chiamata a una funzione che accetta il valore N e trasmette quello che deve trasmettere, sia uno switch o una struttura if/else if che facciano la stessa cosa.

Se no, fai un contatore da 1 a 10 e poi metti uno switch/case:
1 fai A
2 fai B
3 fai C
4 fai D
5 fai E
9 fai D
10 fai E.

ok ho capito ci ho messo un po :-[ :-[

grazie a tutti