controllo temporizzato di 2 led[Risolto]

Salve ragazzi, allora il mio programma prevede il controllo di due led tramite un pulsante e in base al tempo trascorso. Ovvero alla pressione di un pulsante si deve accendere il primo led per 4 secondi, passato questo intervallo di tempo il led si deve spegnere e si deve accendere il secondo per 3 secondi, passato questo arco di tempo il led si deve spegnere e si deve riaccendere il primo per 4 secondi e cosi via. Spero di essermi fatto capire.
Vi allego lo sketch che ho provato a fare

int pul_pin = 2;
int Led_MA  = 3;
int Led_MD  = 4;
int Led_SX  =11;
int Led_DX  =12;

//definizione variabili
int bot            =    0;  
long diff          =    0;
long diff2         =    0;
long time_start    =    0;
long time_bot      =    0;
long time_marcia   = 4000;
long time_sterzata = 3000;
long t=0;
long debounce_delay = 200;

void setup()
{
  pinMode(pul_pin, INPUT);
  pinMode(Led_MA, OUTPUT);
  pinMode(Led_MD, OUTPUT);
  pinMode(Led_SX, OUTPUT);
  pinMode(Led_DX, OUTPUT);
  Serial.begin(9600);
  digitalWrite(Led_MA, LOW);
  digitalWrite(Led_MD, LOW );
  digitalWrite(Led_SX, LOW );
  digitalWrite(Led_DX, LOW );
}

void loop(){

time_start = millis();

 
if(digitalRead(pul_pin))
{
  digitalWrite(Led_MA, HIGH);
  digitalWrite(Led_MD, LOW );
  digitalWrite(Led_SX, LOW );
  digitalWrite(Led_DX, LOW );
  time_bot = millis();
  bot = 1;
}

diff = time_start - time_bot;


if(digitalRead(Led_MA) && diff > time_marcia)
{
  digitalWrite(Led_MA, LOW) ;
  digitalWrite(Led_MD, LOW  );
  digitalWrite(Led_SX, LOW  );
  digitalWrite(Led_DX, HIGH );
  t = millis();
  bot = 1;
}


diff2 = time_start - t;

if(diff2 > time_sterzata)
{
  digitalWrite(Led_MA, HIGH );
  digitalWrite(Led_MD, LOW  );
  digitalWrite(Led_SX, LOW  );
  digitalWrite(Led_DX, LOW  );
}

Con questo sketch il primo led si accende per 4 secondi e poi spegne e si accende il secondo che però resta acceso anche passati i 3 secondi.
grazie mille in anticipo

Domanda: io premo il pulsante per attivare il tutto, ma come lonspengo? Premendo il pulsante? Rilasciandolo? In altro modo? Non lo spengo?

La metodologia adatta è quella di riscrivere il programma con una macchina a stati.
Si parte a definire delle variabili numeriche costanti che specificano gli stati e il loro ordine:

const int IDLE = 0;
const int LED1_ACCESO = 1;
const int LED1_SPENTO = 2;

E così via per il resto degli stati da gestire.

Definisci la variabile stato che determinerà lo svolgersi degli eventi, ovvero il cambio da uno stato all'altro.

int stato = IDLE;

IDLE è lo stato iniziale in cui si pone il sistema, può servire per condizionare l'inizio dei lampeggi alla pressione di un tasto o a qualunque altro evento di tuo interesse.

Poi nel loop usi una struttura switch-case:

switch(stato) {
  case IDLE:
    if(digitalRead(TASTO)) stato = LED1_ACCESO;
    break;
  case LED1_ACCESO:
   digitalWrite(LED, HIGH);
   delay(4000);
   stato = LED1_SPENTO;
   break;
  case LED1_SPENTO:
    digitalWrite(LED, LOW);
    stato = IDLE;
    break;
}

Ho usato delay per far prima a scrivere, si può fare anche con millis. Questo è un caso di una macchina a stati sequenziale cioè gli stati vengono eseguiti sempre nel medesimo ordine 0-1-2-3-4..., se ne possono però fare altre in cui si può decidere tramite degli if a quale stato saltare: successivo o precedente.

Grazie a tutti sono riuscito a risolvere :slight_smile:

Michele06:
Grazie a tutti sono riuscito a risolvere :slight_smile:

come?

utilizzando millis() e il debounce per lo stato del pulsante