Comment faire plusieurs actions en même temps?

Bonjour, je suis en train de faire un programme ou l'on doit être le premier a appuyer sur un bouton après que des leds se soient allumées a une intervalle aléatoire. Je n'arrive pas a faire en sorte que si l'on appuie sur le bouton avant que les leds aient fini de s'allumer, une led rouge s'allume. Merci de m'aider

on ne peut pas faire plusieurs actions en même temps avec un processeur mono-coeur..

Au plus proche du matériel - soit votre arduino est en train d'allumer une LED (activer une pin), soit il est en train d'écouter un bouton (lire l'état d'une pin)... c'est séquentiel... mais comme il va super vite, les humains peuvent penser que tout se passe en même temps...

postez déjà ce que vous avez on peut partir de là...

il existe les interruptions...

MAis maintenant il faut savoir si tu sais allumé une LED? plusieurs led??

le temps aleatoirement, tu as la fonction random ( qui n'est pas forcement aleatoire, mais c'est un autre sujet)

Maintenant il faut connaitre l'etat de tes led avec un flag...

( 0 si il y a une led eteinte, et 1 si toutes les led sont allumé)

les bouton poussoir, il faut connaitre l'etat...

si on appui sur un bouton et que ton flag est a Zero alors tu allume une led rouge..

Voila mon code :

//Ports
long BoutonStart = 10;
long BoutonJ1 = 8;
long BoutonJ2 = 9;
long LedStart = 3;
long LedJ1 = 2;
long LedJ2 = 4;
//Variables
int Allumage = 0;
int Debut = 0;
int Fin = 0;
int StopJ1 = 0;
long TempsAleatoire;
//Etats
long EtatBoutonStart = LOW;
long EtatBoutonJ1 = LOW;
long EtatBoutonJ2 = LOW;

void setup() {
  pinMode(BoutonStart, INPUT_PULLUP);
  pinMode(BoutonJ1, INPUT_PULLUP);
  pinMode(BoutonJ2, INPUT_PULLUP);
  pinMode(LedStart, OUTPUT);
  pinMode(LedJ1, OUTPUT);
  pinMode(LedJ2, OUTPUT);
  pinMode(5, OUTPUT);

}

void loop() {
  EtatBoutonStart = digitalRead(BoutonStart);
  EtatBoutonJ1 = digitalRead(BoutonJ1);
  EtatBoutonJ2 = digitalRead(BoutonJ2);

  TempsAleatoire = random(500, 2500); //Generation d'un nombre aléatoire entre 500 et 2500

  if (EtatBoutonStart == LOW)
    {digitalWrite(LedJ1, LOW);
    digitalWrite(LedJ2, LOW);
    StopJ1 = 0;
    Fin = 0;
    Debut = 0;
    Allumage = 1;
    delay(1000);
    digitalWrite(LedStart, HIGH);
    delay(500);
    digitalWrite(LedStart, LOW);
    delay(1000);
    digitalWrite(LedStart, HIGH);
    delay(500);
    digitalWrite(LedStart, LOW);
    delay(1000);
    digitalWrite(LedStart, HIGH);
    delay(500);
    digitalWrite(LedStart, LOW);
    delay(TempsAleatoire);
    Debut = 1;
    digitalWrite(LedStart, HIGH);
    delay(1000);
    digitalWrite(LedStart, LOW);}
   else
      {digitalWrite(LedStart, LOW);}

   if ( (EtatBoutonJ1 == LOW) && (Allumage == 1) && (Debut == 0) ) 
    {
     StopJ1 = 1;
     digitalWrite(5, HIGH); 
    }
   if ( (EtatBoutonJ1 == LOW) && (Allumage == 1) && (Debut == 1) && (Fin == 0) && (StopJ1 == 0) )
     {digitalWrite(LedJ1, HIGH);
     Fin = 1;}
   if ( (EtatBoutonJ1 == LOW) && (Allumage == 1) && (Debut == 1) && (Fin == 1) )
     {
      StopJ1 = 1;
      digitalWrite(5, LOW);
     }
  
}

La led du port 5 est la led rouge que je veux allumer si on appuie sur le bouton avant que la "LedStart" se soit allumée la dernière fois

pepe: Plus exactement, on ne peut pas réaliser plusieurs opérations logicielles en même temps sur un processeur mono-cœur (sans pipeline).

Oui - j'ai fait un peu de simplification abusive pour le niveau de zelflame33 (effectivement en travaillant avec les PORT on peut lire ou activer plusieurs pins d'un coup par exemple, il y a les ISR etc.. )

@zelflame33 Votre approche ne va pas (où ça va super vite devenir plat de spaghetti) et faudrait passer par des interruptions...

étudiez "blink without delay" et le post en anglais Demonstration code for several things at the same time

En gros faut virer tous ces delay() dans le code et c'est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

Merci beaucoup je vais tester ça et me renseigner sur la commande millis

Je n'arrive pas à faire attendre une seconde après que j'aie appuyé sur le bouton avec millis Mon code :

unsigned long chrono;
//Ports
long BoutonStart = 10;
long BoutonJ1 = 8;
long BoutonJ2 = 9;
long LedStart = 3;
long LedJ1 = 2;
long LedJ2 = 4;
//Variables
int Allumage = 0;
int Debut = 0;
int Fin = 0;
int StopJ1 = 0;
long TempsAleatoire;
long temps;
//Etats
long EtatBoutonStart = LOW;
long EtatBoutonJ1 = LOW;
long EtatBoutonJ2 = LOW;

void setup() {
  pinMode(BoutonStart, INPUT_PULLUP);
  pinMode(BoutonJ1, INPUT_PULLUP);
  pinMode(BoutonJ2, INPUT_PULLUP);
  pinMode(LedStart, OUTPUT);
  pinMode(LedJ1, OUTPUT);
  pinMode(LedJ2, OUTPUT);
  pinMode(5, OUTPUT);

}

void loop() {
  EtatBoutonStart = digitalRead(BoutonStart);
  EtatBoutonJ1 = digitalRead(BoutonJ1);
  EtatBoutonJ2 = digitalRead(BoutonJ2);

  TempsAleatoire = random(500, 2500); //Generation d'un nombre aléatoire entre 500 et 2500

  if (EtatBoutonStart == LOW){
    chrono = millis();
    if (millis() - chrono >= 1000)
    {digitalWrite(LedStart, HIGH);
    }

   if ( (EtatBoutonJ1 == LOW) && (Allumage == 1) && (Debut == 0) ) 
    {
     StopJ1 = 1;
     digitalWrite(5, HIGH); 
    }
   if ( (EtatBoutonJ1 == LOW) && (Allumage == 1) && (Debut == 1) && (Fin == 0) && (StopJ1 == 0) )
     {digitalWrite(LedJ1, HIGH);
     Fin = 1;}
   if ( (EtatBoutonJ1 == LOW) && (Allumage == 1) && (Debut == 1) && (Fin == 1) )
     {
      StopJ1 = 1;
      digitalWrite(5, LOW);
     }
  }
}

essayez de décrire votre projet sous forme d'une machine à états

J'ai essayé avec la boucle while mais ça ne fonctionne pas, j'ai du mal m'y prendre

unsigned long chrono;
const unsigned long TAttente = 1000ul;
//Ports
long BoutonStart = 10;
long BoutonJ1 = 8;
long BoutonJ2 = 9;
long LedStart = 3;
long LedJ1 = 2;
long LedJ2 = 4;
//Variables
int Allumage = 0;
int Debut = 0;
int Fin = 0;
int StopJ1 = 0;
long TempsAleatoire;
long temps;
//Etats
long EtatBoutonStart = LOW;
long EtatBoutonJ1 = LOW;
long EtatBoutonJ2 = LOW;

void setup() {
  pinMode(BoutonStart, INPUT_PULLUP);
  pinMode(BoutonJ1, INPUT_PULLUP);
  pinMode(BoutonJ2, INPUT_PULLUP);
  pinMode(LedStart, OUTPUT);
  pinMode(LedJ1, OUTPUT);
  pinMode(LedJ2, OUTPUT);
  pinMode(5, OUTPUT);

}

void loop() {
  EtatBoutonStart = digitalRead(BoutonStart);
  EtatBoutonJ1 = digitalRead(BoutonJ1);
  EtatBoutonJ2 = digitalRead(BoutonJ2);

  TempsAleatoire = random(500, 2500); //Generation d'un nombre aléatoire entre 500 et 2500

  if ( (EtatBoutonStart == HIGH) ){
    chrono = millis();
    while(millis() - chrono >= 1000)
    {digitalWrite(LedStart, LOW);}
    while(millis() - chrono >= 1500)
    {digitalWrite(LedStart, HIGH);}
    while(millis() - chrono >= 2500)
    {digitalWrite(LedStart, LOW);}
    while(millis() - chrono >= 3000)
    {digitalWrite(LedStart, HIGH);}
    while(millis() - chrono >= 4000)
    {digitalWrite(LedStart, LOW);}
    while(millis() - chrono >= 4500)
    {digitalWrite(LedStart, HIGH);}
    while(millis() - chrono >= 5500)
    {digitalWrite(LedStart, LOW);}
    while(millis() - chrono >= TempsAleatoire + 6000)
    {digitalWrite(LedStart, HIGH);}
    

   if ( (EtatBoutonJ1 == LOW) && (Allumage == 1) && (Debut == 0) ) 
    {
     StopJ1 = 1;
     digitalWrite(5, HIGH); 
    }
   if ( (EtatBoutonJ1 == LOW) && (Allumage == 1) && (Debut == 1) && (Fin == 0) && (StopJ1 == 0) )
     {digitalWrite(LedJ1, HIGH);
     Fin = 1;}
   if ( (EtatBoutonJ1 == LOW) && (Allumage == 1) && (Debut == 1) && (Fin == 1) )
     {
      StopJ1 = 1;
      digitalWrite(5, LOW);
     }
  }
}

essayez de décrire votre projet sous forme d'une machine à états.

Dans le code ou pour décrire ce que je veux faire?

En fait j’ai trouvé ce que j’ai fait faux je croyais que la boucle while faisait l’action jusqu’à ce que la condition soit juste.
Maintenant ça fonctionne mais c’est comme au début, je doit attendre que tout se soit terminé avant de pouvoir allumer la led rouge ou la LedJ1.
Le code :

unsigned long chrono;
const unsigned long TAttente = 1000ul;
//Ports
long LedRouge = 5;
long BoutonStart = 10;
long BoutonJ1 = 8;
long BoutonJ2 = 9;
long LedStart = 3;
long LedJ1 = 2;
long LedJ2 = 4;
//Variables
int Allumage = 0;
int Debut = 0;
int Fin = 0;
int StopJ1 = 0;
long TempsAleatoire;
long temps;
//Etats
long EtatBoutonStart = LOW;
long EtatBoutonJ1 = LOW;
long EtatBoutonJ2 = LOW;

void setup() {
  pinMode(BoutonStart, INPUT_PULLUP);
  pinMode(BoutonJ1, INPUT_PULLUP);
  pinMode(BoutonJ2, INPUT_PULLUP);
  pinMode(LedStart, OUTPUT);
  pinMode(LedJ1, OUTPUT);
  pinMode(LedJ2, OUTPUT);
  pinMode(5, OUTPUT);

}

void loop() {
  EtatBoutonStart = digitalRead(BoutonStart);
  EtatBoutonJ1 = digitalRead(BoutonJ1);
  EtatBoutonJ2 = digitalRead(BoutonJ2);

  TempsAleatoire = random(500, 2500); //Generation d'un nombre aleatoire entre 500 et 2500

  if ( (EtatBoutonStart == LOW) ){
    chrono = millis();
    StopJ1 = 0;
    Fin = 0;
    Debut = 0;
    Allumage = 1;
    digitalWrite(LedJ1, LOW);
    digitalWrite(LedJ2, LOW);
    while(millis() - chrono < 1000)
    {digitalWrite(LedStart, LOW);}
    while(millis() - chrono < 1500)
    {digitalWrite(LedStart, HIGH);}
    while(millis() - chrono < 2500)
    {digitalWrite(LedStart, LOW);}
    while(millis() - chrono < 3000)
    {digitalWrite(LedStart, HIGH);}
    while(millis() - chrono < 4000)
    {digitalWrite(LedStart, LOW);}
    while(millis() - chrono < 4500)
    {digitalWrite(LedStart, HIGH);}
    while(millis() - chrono < 5500)
    {digitalWrite(LedStart, LOW);}
    while(millis() - chrono < TempsAleatoire + 6000)
    {Debut = 1;
    digitalWrite(LedStart, HIGH);}
    while(millis() - chrono < TempsAleatoire + 6500)
    {digitalWrite(LedStart, LOW);}
  }
    

   if ( (EtatBoutonJ1 == LOW) && (Allumage == 1) && (Debut == 0) ) 
    {
     StopJ1 = 1;
     digitalWrite(LedRouge, HIGH); 
    }
   if ( (EtatBoutonJ1 == LOW) && (Allumage == 1) && (Debut == 1) && (Fin == 0) && (StopJ1 == 0) )
     {digitalWrite(LedJ1, HIGH);
     Fin = 1;}
   if ( (EtatBoutonJ1 == LOW) && (Allumage == 1) && (Debut == 1) && (Fin == 1) )
     {
      StopJ1 = 1;
      
     }
  }

J’ai essayé avec ton code, ça fonctionne sauf que la fonction sequenceLedStart() démarre des le début.
Comment puis-je faire en sorte qu’il se démarre que lorsque j’appuie sur le bouton BoutonStart?
Le code :

//Ports
long BoutonStart = 10;
long BoutonJ1 = 8;
long BoutonJ2 = 9;
long LedStart = 3;
long LedJ1 = 2;
long LedJ2 = 4;
//Variables
int Allumage = 0;
int Debut = 0;
int Fin = 0;
int StopJ1 = 0;
long TempsAleatoire;
long temps;
//Etats
long EtatBoutonStart = LOW;
long EtatBoutonJ1 = LOW;
long EtatBoutonJ2 = LOW;


//fontions
byte delaiEtTest(unsigned long tDelai) {
  unsigned long tDebut = millis();
  do {
    EtatBoutonJ1 = digitalRead(BoutonJ1);
    EtatBoutonJ2 = digitalRead(BoutonJ2);
    if ( (EtatBoutonJ1==LOW) || (EtatBoutonJ2==LOW) )
      return 1;
  } while( millis()-tDebut < tDelai );
  return 0;
}


byte sequenceLedStart() {
  if ( delaiEtTest(1000) )
    return 1;
  digitalWrite(LedStart, HIGH);
  if ( delaiEtTest(500) )
    return 1;
  digitalWrite(LedStart, LOW);
  if ( delaiEtTest(1000) )
    return 1;
  digitalWrite(LedStart, HIGH);
  if ( delaiEtTest(500) )
    return 1;
  digitalWrite(LedStart, LOW);
  if ( delaiEtTest(1000) )
    return 1;
  digitalWrite(LedStart, HIGH);
  if ( delaiEtTest(500) )
    return 1;
  digitalWrite(LedStart, LOW);
  if ( delaiEtTest(TempsAleatoire) )
    return 1;
  digitalWrite(LedStart, HIGH);
  if ( delaiEtTest(1000) )
    return 1;
  digitalWrite(LedStart, LOW);
  return 0;
}


void setup() {
  pinMode(BoutonStart, INPUT_PULLUP);
  pinMode(BoutonJ1, INPUT_PULLUP);
  pinMode(BoutonJ2, INPUT_PULLUP);
  pinMode(LedStart, OUTPUT);
  pinMode(LedJ1, OUTPUT);
  pinMode(LedJ2, OUTPUT);
  pinMode(5, OUTPUT);

}

void loop() {
  EtatBoutonStart = digitalRead(BoutonStart);
  EtatBoutonJ1 = digitalRead(BoutonJ1);
  EtatBoutonJ2 = digitalRead(BoutonJ2);

  TempsAleatoire = random(500, 2500); //Generation d'un nombre aléatoire entre 500 et 2500

  if (EtatBoutonStart == LOW)
  {
  sequenceLedStart();
  }

  byte tropTot = sequenceLedStart();
  if (tropTot) {
    digitalWrite(5, HIGH);
  } else {
    
 
   if ( (EtatBoutonJ1 == LOW) && (Allumage == 1) && (Debut == 1) && (Fin == 0) && (StopJ1 == 0) )
     {digitalWrite(LedJ1, HIGH);
     Fin = 1;}
   if ( (EtatBoutonJ1 == LOW) && (Allumage == 1) && (Debut == 1) && (Fin == 1) )
     {
      StopJ1 = 1;
      digitalWrite(5, LOW);
     }
  }
  
}/code]

Maintenant ça marche, Merci