Problema lampeggio led con pausa usando millis()

Biongiorno a tutti,
ha scritto un codice che deve essere accendere un led (led1), poi spegnerlo ed accendere un secondo led (led2), il tutto con una funzione millis ().
Il mio problema è quello di aggiungere una pausa tra lo spegnimento del led1 e l’accensione del led2 e viceversa tra lo spegnimento del led2 e l’accensione del led1.
Qualcuno ha qualche dritta?
Grazie.

unsigned long time                                                                                               
int led1 = 8;                                         
int led2 = 12;
int state2 = ALTO;
int state1 = LOW;
                                                       
void setup ()
{                   
pinMode (led2, OUTPUT);                                                 
pinMode (led1, OUTPUT);                              
time = millis ();                                       
}                                                  

void loop () 
{
digitalWrite (led1, state1);
digitalWrite (led2, state2);
if ((time + 2500) <millis ())
{
state1 =! State1;
state2 =! Stato2;
time = millis (); 
}
}

devi aggiungere altre variabili come la time (tra l’altro sarebbe meglio se cambiassi il nome essendo time una parola riservata e lo vedi in quanto si colora in arancio) che controllino i tempi tra un’azione e l’altra con delle if

inoltre la if su millis per non avere problemi non va impostata come l’hai messa tu:

if ((time + 2500) <millis ())

ma in questo modo

if ((millis()- time) >  2500)

Per capire come funziona e come applicare la funzione millis(), puoi studiare prima QUI, poi QUI ed infine leggere anche QUI e QUI … vedrai che ti sarà tutto più chiaro

OK ho cambiato la variabile e l' if,
ma non ho capito come mettere la pausa?
puoi spiegarti meglio?

 unsigned long tempo;                                                                                               
int led1 = 8;                                         
int led2 = 12;
int state2 = HIGH;
int state1 = LOW;
                                                         
void setup()
{                   
  pinMode(led2, OUTPUT);                                                 
  pinMode(led1, OUTPUT);                              
  tempo = millis();                                       
}                                                  

void loop() 
{
  digitalWrite(led1, state1);
  digitalWrite(led2, state2);
  if((millis() - tempo) > 2500)
  {
  state1 = !state1;
  state2 = !state2;
  tempo = millis(); 
  }
}

Poi impara anche la funzione digitalRead(), osì oe tre variabili state le puoi eliminare

il programma funziona, ma allo spegnimento di un led immediatamente si accende l' altro, la mia domanda è come posso mettere un pausa tra lo spegnimento e l' accensione dell' altro? ovviamente senza delay()

beh un esempio (non ho provato se funziona) potrebbe essere questo:

unsigned long tempo;
unsigned long tempoLed1;
unsigned long tempoLed2;

const long tempoTotCiclo = 2500;
const long tempoBlinkLed1 = 1000;
const long tempoBlinkLed2 = 500;

int led1 = 8;
int led2 = 12;
//int state2 = HIGH;
bool state1 = true;

void setup() {
   pinMode(led2, OUTPUT);
   pinMode(led1, OUTPUT);
   tempo = millis();
}

void loop() {
   if ((millis() - tempo) > 2500  && state1) {
      digitalWrite(led1, HIGH);
      state1 = false;
      tempoLed1 = millis();
   }
   if ((digitalRead(led1) == HIGH) && (millis() - tempoLed1) > tempoBlinkLed1) {
      digitalWrite(led1, LOW);
      digitalWrite(led2, HIGH);
      tempoLed2 = millis();
   }
   if ((digitalRead(led2) == HIGH) && (millis() - tempoLed2) > tempoBlinkLed2) {
      digitalWrite(led2, LOW);
      state1 = true;
   }
   tempo = millis();
}

ovvio che se il programma non deve fare altro
così fai prima

unsigned long tempo;


int led1 = 8;
int led2 = 12;

void setup() {
   pinMode(led2, OUTPUT);
   pinMode(led1, OUTPUT);
   tempo = millis();
}

void loop() {
   if ((millis() - tempo) > 2500 ) {
      digitalWrite(led1, HIGH);
      delay(1000);
      digitalWrite(led1, LOW);
      digitalWrite(led2, HIGH);
      delay(600);
      digitalWrite(led2, LOW);
   }
   tempo = millis();
}

Grazie mille adesso lo provo
comunque il codice è un pezzo da inserire in un programma più lungo per questo che volevo usare il millis()

forse non mi sono spiegato bene ma in parole povere devo riuscire a fare questo codice con il millis()

  digitalWrite(led1, HIGH);
      delay(5000);
   digitalWrite(led1, LOW);
      delay(2000);
   digitalWrite(led2, HIGH);
      delay(5000);
   digitalWrite(led2, LOW);
      delay(2000);

in parte ero riuscito a farlo ma senza la pausa di due secondi (cioè appena si spegneva un led si accendeva l'altro).

il tuo primo programma non funziona ma non riesco a capire perchè, sembra tutto corretto.

Devi fare una macchina a stati
stato 0 primo led
stato 1 prima pausa
e via così

io farei, in pseudocodice

tempi[4] array di interi coi 4 tempi dei 4 stati
stato // variabile di stato
if((millis() - tempo) > tempi[stato])
{
tempo=millis
stato++
stato=stato%4
}
switch (stato){

case 0:
......
case 1:
......
case 2:
.......
case 3:
......

}

Mi dispiace ma non ho capito.
Potete aiutarmi a risolverlo

Scusate ma non è possibile farlo solo con if e millis()

Se non fai una macchina a stati, che altro non è che un modo di definire una sequenza ordinata di azioni, come fai a stabilire temporalmente quale dei LED deve accendersi/spegnersi prima o dopo?
delay() blocca il programma, quindi la sequenza è imposta dall'attesa forzata che introduce.
millis() invece funziona diversamente, lo puoi immaginare come un cronometro che gira in parallelo al programma. Quindi sei tu che devi tenere traccia di cosa deve succedere e quando, ciò lo fai attraverso gli stati che assume il sistema che vuoi gestire. Passi allo stato successivo solo quando il precedente è stato servito, questo è il concetto.

Io devo semplicemente trasformare questo codice in uno uguale ma che non mi blocchi il programma con i delay().
Qualcuno sa spiegarmi bene come fare?
Grazie

digitalWrite(led1, HIGH);
      delay(5000);
   digitalWrite(led1, LOW);
      delay(2000);
   digitalWrite(led2, HIGH);
      delay(5000);
   digitalWrite(led2, LOW);
      delay(2000);

Ti è stata data una traccia di come fare. Ripetere le stesse richieste che hai fatto due post più su senza recepire e studiare le risposte date, oltre a non essere educato, immagino sia fuori regolamento.

Mi scuso se ho chiesto due volte la stessa cosa mi dispiace davvero ma è una cosa molto importante ( scopo lavorativo ) .
Proverò comunque come dici te a fare una macchina a stati anche se non ho la più pallida idea di come iniziare.
Non è che potresti darmi qualche dritta?mi saresti davvero di aiuto.
Grazie a tutti comunque per la disponibilità.

le cose fatte in fretta... raramente funzionano bene. Soprattutto se non hai capito come si fanno

come ti ho detto qualche post più sopra, prenditi il tuo tempo e studia questi documenti

:wink:

Per capire come funziona e come applicare la funzione millis(), puoi studiare prima QUI, poi QUI ed infine leggere anche QUI e QUI ... vedrai che ti sarà tutto più chiaro

inoltre puoi sempre cercare con google (o qualsiasi altro motore di ricerca)
"arduino programmazione stati finiti"
ti si apre un mondo :slight_smile:

Ho letto tutto ed ho capito qualcosa in più sulla funzione millis() rispetto a prima ma non riesco a capire che cos' è questa macchina a stati.

FraZappino:
Ho letto tutto ed ho capito qualcosa in più sulla funzione millis() rispetto a prima ma non riesco a capire che cos’ è questa macchina a stati.

Spiegazione teorica di che cos’è una macchina (o automa) a stati:
multitasking-arduino-automa-stati-finiti

Programma Arduino con esempio applicativo di una macchina a stati (molto simile a quello proposto da Standardoil e che si usa solitamente):
controllo-vasca.ino

EDIT:
Qua trovi addirittura un video che ti spiega il funzionamento del programma del controllo vasca:
Controllo di un vasca con Arduino - macchine e stati - #45

FraZappino:
non riesco a capire che cos' è questa macchina a stati.