Leds strip/Projet phares arrière. Problème code pour clignoteur

Bonjour a tous. Mon projet est de remplacer les ampoules des phares arrieres de ma voiture, par des bandes leds.
Ils y aura 2 modèles de bandes dans chaque phares (ws2812b rgb et sk6812 rgbw), qui seront
controlées par une carte arduino uno r3 en utilisant la bibliothèque adafruit neopixel.( je compte peut
être utiliser une carte olimex dans le futur, "soucis de bon fonctionnement").
J'aimerais utiliser le courant 12v qui sort de mon levier de clignotant, (prendre le courant avant le relais
du clignoteur pour avoir un courant maintenu, (cela supprimera la temporisation on, off du
relais du clignoteur)). Ce courant 12v, je compte le transformer en 5v en utilisant un ubec 5v (pas trop
cher) pour pouvoir le brancher sur l'entrée concernée de la carte arduino. Je compte utiliser des ubec 5v
pour chaque courant de commandes, cet a dire, 1 pour cligno gauche, 1 pour cligno droit, 1 pour
warning cligno, 1 pour freins, 1 pour marche arrière. Dans le futur, j'aimerais ajouter 2 commandes
supplémentaires pour lock et unlock encore 2 en plus. Ca fait 7 commandes qu'il faudra transformer le courant 12v en 5v pour pouvoir les brancher sur les entrées arduino. (7 ubec c'est beaucoup).
Ma première question est de savoir si quelqu'un pourrais m'aider a résoudre ce problème d'alim
d'entrées de commandes. Y a t il un moyen plus simple pour passer mes courant de commandes 12v en
5v?

Mon deuxième problème, c'est le code.
J'ai 4 boutons pour simuler l'arriver de courant sur les entrées de la carte. cligno droit, cligno gauche
,freins, et marche arrière.
Les clignos sont dynamique, donc le code des clignos comporte des boucle for avec delay. Quand j'appuie
sur le bouton freins juste après avoir appuyer sur le BP cligno, les freins ne s'allume qu'au moment ou
ma boucle for des clignos se termine. Même problème pour la marche arrière. Même chose
quand je change d'un clignoteur a l'autre, la boucle du premier cligno doit se terminer pour que l'autre
commence a clignoter.

Comment supprimer ce décalage de temps (1 a 2 secondes) et faire en sorte que les leds s'allument instantanément dès qu'on bascule l'appuie d'un bouton a un autre?

voici mon code et un schéma de mon projet

#include <Adafruit_NeoPixel.h>
#define NUMPIXELS      5


Adafruit_NeoPixel clignoGauche = Adafruit_NeoPixel(NUMPIXELS, 5, NEO_RGBW + NEO_KHZ800);
Adafruit_NeoPixel clignoDroit = Adafruit_NeoPixel(NUMPIXELS, 6, NEO_RGBW + NEO_KHZ800);
Adafruit_NeoPixel freins = Adafruit_NeoPixel(NUMPIXELS, 11, NEO_RGB + NEO_KHZ800);


boolean etat_ClignoGauche = 0;
boolean etat_ClignoDroit = 0;
boolean etat_Freins = 0;


int pin_ClignoGauche = 2;
int pin_ClignoDroit = 7;
int pin_Freins = 4;


 
void setup() 
{
  pinMode(pin_ClignoGauche,INPUT);
  pinMode(pin_ClignoDroit,INPUT);
  pinMode(pin_Freins,INPUT);
      

  clignoGauche.begin();
  clignoDroit.begin();
  freins.begin();

  clignoGauche.show();
  clignoDroit.show();
  freins.show();
  

void loop() 
{
  etat_ClignoGauche = digitalRead(pin_ClignoGauche);
  etat_ClignoDroit = digitalRead(pin_ClignoDroit);
  etat_Freins = digitalRead(pin_Freins);


     if(etat_ClignoGauche==1 && etat_ClignoDroit==0)
         {
           codeClignoGauche();
         }


            if(etat_ClignoDroit==1 && etat_ClignoGauche==0)
                {
                  codeClignoDroit();
                }


                   if(etat_ClignoGauche==1 && etat_ClignoDroit==1)
                       {
                         code_4_Clignotant();
                       }

                                        if(etat_Freins==1)
                                            {
                                              codeFreins();
                                            }
                                               else
                                                   {
                                                    codeFreinsEteint();
                                                   }
                                                   
}


void codeClignoGauche()
{
        for(int i=0; i<=4; i++)                                     
           {
             clignoGauche.setPixelColor(i, clignoGauche.Color(80,255,0));
             clignoGauche.show();
             delay(30);
           }
      delay(250);
            for(int i=0; i<=4; i++)
               {
                 clignoGauche.setPixelColor(i, clignoGauche.Color(0,0,0));
                 clignoGauche.show();
                 delay(30);
               }
      delay(250);
}


void codeClignoDroit()
{
      for(int i=0; i<=4; i++)                                     
           {
             clignoDroit.setPixelColor(i, clignoDroit.Color(80,255,0));
             clignoDroit.show();
             delay(30);
           }
      delay(250);
            for(int i=0; i<=4; i++)
               {
                 clignoDroit.setPixelColor(i, clignoDroit.Color(0,0,0));
                 clignoDroit.show();
                 delay(30);
               }
      delay(250);
}



void code_4_Clignotant()
{
      for(int i=0; i<=4; i++)
         {
           clignoGauche.setPixelColor(i, clignoGauche.Color(70,255,0));
           clignoDroit.setPixelColor(i, clignoDroit.Color(70,255,0));
           clignoGauche.show();
           clignoDroit.show();
           delay(30);
         }
delay(250);
          for(int i=0; i<=4; i++)
             {
               clignoGauche.setPixelColor(i, clignoGauche.Color(0,0,0));
               clignoDroit.setPixelColor(i, clignoDroit.Color(0,0,0));
               clignoGauche.show();
               clignoDroit.show();
               delay(30);     
             }
delay(250);             
}



void codeFreins()
{
      for(int i=0; i<=2; i++)
         {
           freins.setPixelColor(i, freins.Color(0,255,0));
           freins.setBrightness(255);
           freins.show();
         }
            for(int i=4; i>=0; i--)
               {
                 phareFreinGauche.setPixelColor(i, phareFreinGauche.Color(0,255,0));
                 phareFreinDroit.setPixelColor(i, phareFreinDroit.Color(0,255,0));
                 phareFreinGauche.setBrightness(255);
                 phareFreinDroit.setBrightness(255);
                 phareFreinGauche.show();                   
                 phareFreinDroit.show();
               }
}


void codeFreinsEteint()
{
      for(int i=0; i<=4; i++)
         {
           phareFreinGauche.setPixelColor(i, phareFreinGauche.Color(0,80,0));
           phareFreinDroit.setPixelColor(i, phareFreinDroit.Color(0,80,0));
           phareFreinGauche.setBrightness(80);
           phareFreinDroit.setBrightness(80);
           phareFreinGauche.show();                   
           phareFreinDroit.show();
         }
            for(int i=0; i<=2; i++)
               {
                 freins.setPixelColor(i, freins.Color(0,80,0));
                 freins.setBrightness(80);
                 freins.show();
               }

}

il faut virer les delay() donc utiliser la technique de millis() (cf l'exemple blink without millis() ) et une machine à états (cf mon tuto sur ce sujet éventuellement)

Ma première question est de savoir si quelqu'un pourrais m'aider a résoudre ce problème d'alim
d'entrées de commandes. Y a t il un moyen plus simple pour passer mes courant de commandes 12v en
5v?

Bonjour la piste pour éviter d'avoir à abaisser la tension sur chacune de tes commandes, serait de n'utiliser qu'un seul ubec pour alimenter ton arduino et faire un système de commutation avec des transistor mosfet ou optocoupleurs ou des relais

Avec ta solution initiale il faudra également faire gaffe à l'ampérage en entrée de ton arduino.

Inutile de préciser (car du doit déja sans doute le savoir) que tu seras recalé au CT mais ce n'est pas l'objet du forum :grin:

Merci a toi J-M-L, je vais de suite aller voir cette technique millis(), et en même temps, faire un tour son ton tuto.

Merci aussi b2r, j'irais voir comment fonctionnent ces composants, je déja visionné un tuto sur les mosfet, ca a l'air intéressant.

Encore merci pour vos réponses, je donnerai des nouvelles quand ce sera réglé.

J'avais aidé un autre membre du forum sur un sujet similaire

Je n'arrive pas à remplacer mes delay par cette satanée fonction millis() dans mon code. J'ai lu le tutoriel de J-M-L et d',eskimon mais pas moyen que mon cerveau comprenne l'astuce. Quelle frustration d'être bête. Je m'arrache les cheveux. Svp, aider moi à comprendre cette fonction millis() et a l'appliquer dans mon code. J'aimerais vraiment capter le fonctionnement de millis() car j'en aurais encore besoin pour de futur codes. Je posterai mon code en entier ce soir.

voila mon code en entier

#include <Adafruit_NeoPixel.h>
#define NUMPIXELS      5


Adafruit_NeoPixel clignoGauche = Adafruit_NeoPixel(NUMPIXELS, 5, NEO_RGBW + NEO_KHZ800);
Adafruit_NeoPixel clignoDroit = Adafruit_NeoPixel(NUMPIXELS, 6, NEO_RGBW + NEO_KHZ800);
Adafruit_NeoPixel phareFreinGauche = Adafruit_NeoPixel(NUMPIXELS, 9, NEO_RGB + NEO_KHZ800);
Adafruit_NeoPixel phareFreinDroit = Adafruit_NeoPixel(NUMPIXELS, 10, NEO_RGB + NEO_KHZ800);
Adafruit_NeoPixel freins = Adafruit_NeoPixel(NUMPIXELS, 11, NEO_RGB + NEO_KHZ800);
Adafruit_NeoPixel marcheArriereGauche = Adafruit_NeoPixel(NUMPIXELS, 12, NEO_RGB + NEO_KHZ800);
Adafruit_NeoPixel marcheArriereDroit = Adafruit_NeoPixel(NUMPIXELS, 13, NEO_RGB + NEO_KHZ800);

boolean etat_ClignoGauche = 0;
boolean etat_ClignoDroit = 0;
boolean etat_WarningCligno = 0;
boolean etat_Freins = 0;
boolean etat_MarcheArriere = 0;

int pin_ClignoGauche = 2;
int pin_ClignoDroit = 7;
int pin_WarningCligno = 8;
int pin_Freins = 4;
int pin_MarcheArriere = 3;

 
void setup() 
{
  pinMode(pin_ClignoGauche,INPUT_PULLUP);
  pinMode(pin_ClignoDroit,INPUT_PULLUP);
  pinMode(pin_WarningCligno,INPUT_PULLUP);
  pinMode(pin_Freins,INPUT_PULLUP);
  pinMode(pin_MarcheArriere,INPUT_PULLUP);      

  clignoGauche.begin();
  clignoDroit.begin();
  freins.begin();
  phareFreinGauche.begin();
  phareFreinDroit.begin();
  marcheArriereGauche.begin();
  marcheArriereDroit.begin();

  clignoGauche.show();
  clignoDroit.show();
  freins.show();
  phareFreinGauche.show();
  phareFreinDroit.show();
  marcheArriereGauche.show();
  marcheArriereDroit.show();
    
    for(int i=0; i<=4; i++)
       {
         phareFreinGauche.setPixelColor(i, phareFreinGauche.Color(0,40,0));
         phareFreinDroit.setPixelColor(i, phareFreinDroit.Color(0,40,0));
         delay(80);
         phareFreinGauche.show();
         phareFreinDroit.show();
         
       }
          for(int i=1; i<=2; i++)
             {
               freins.setPixelColor(i, freins.Color(0,40,0));
               delay(80);
               freins.show();
             }

             delay(200);

                for(int i=2; i>=1; i--)
                   {
                     freins.setPixelColor(i, freins.Color(0,255,0));
                     delay(45);
                     freins.show();
                   }
                      for(int i=4; i>=0; i--)
                         {
                           phareFreinGauche.setPixelColor(i, phareFreinGauche.Color(0,255,0));
                           phareFreinDroit.setPixelColor(i, phareFreinDroit.Color(0,255,0));
                           delay(45);
                           phareFreinGauche.show();
                           phareFreinDroit.show();
                         }

                         delay(1000);

                            for(int i=0; i<=4; i++)
                               {
                                 phareFreinGauche.setPixelColor(i, phareFreinGauche.Color(0,0,0));
                                 phareFreinDroit.setPixelColor(i, phareFreinDroit.Color(0,0,0));
                                 phareFreinGauche.show();
                                 phareFreinDroit.show();
                               }
                                  for(int i=0; i<=2; i++)
                                     {
                                       freins.setPixelColor(i, freins.Color(0,0,0));
                                       freins.show();
                                     }

                                     delay(600);

                                        for(int a=36; a<=80; a++)
                                           {
                                           
                                                delay(20);
                                                for(int i=0; i<=2; i++)
                                                   {
                                                    freins.setPixelColor(i, freins.Color(0,a,0));
                                                    freins.setBrightness(a);
                                                    freins.show();
                                                   }
                                                      for(int i=0; i<=4; i++)
                                                         {
                                                           phareFreinGauche.setPixelColor(i, phareFreinGauche.Color(0,a,0));
                                                           phareFreinDroit.setPixelColor(i, phareFreinDroit.Color(0,a,0));
                                                           phareFreinGauche.setBrightness(a);
                                                           phareFreinDroit.setBrightness(a);
                                                           phareFreinGauche.show();                   
                                                           phareFreinDroit.show();
                                                         }
                                            }
}

Fais un CTRL T dans l'IDE pour corriger l'indentation. Il manque la loop aussi...

désolé, voila mon code en entier

#include <Adafruit_NeoPixel.h>
#define NUMPIXELS      5


Adafruit_NeoPixel clignoGauche = Adafruit_NeoPixel(NUMPIXELS, 5, NEO_RGBW + NEO_KHZ800);
Adafruit_NeoPixel clignoDroit = Adafruit_NeoPixel(NUMPIXELS, 6, NEO_RGBW + NEO_KHZ800);
Adafruit_NeoPixel phareFreinGauche = Adafruit_NeoPixel(NUMPIXELS, 9, NEO_RGB + NEO_KHZ800);
Adafruit_NeoPixel phareFreinDroit = Adafruit_NeoPixel(NUMPIXELS, 10, NEO_RGB + NEO_KHZ800);
Adafruit_NeoPixel freins = Adafruit_NeoPixel(NUMPIXELS, 11, NEO_RGB + NEO_KHZ800);
Adafruit_NeoPixel marcheArriereGauche = Adafruit_NeoPixel(NUMPIXELS, 12, NEO_RGB + NEO_KHZ800);
Adafruit_NeoPixel marcheArriereDroit = Adafruit_NeoPixel(NUMPIXELS, 13, NEO_RGB + NEO_KHZ800);

boolean etat_ClignoGauche = 0;
boolean etat_ClignoDroit = 0;
boolean etat_WarningCligno = 0;
boolean etat_Freins = 0;
boolean etat_MarcheArriere = 0;

int pin_ClignoGauche = 2;
int pin_ClignoDroit = 7;
int pin_WarningCligno = 8;
int pin_Freins = 4;
int pin_MarcheArriere = 3;


void setup()
{
  pinMode(pin_ClignoGauche, INPUT_PULLUP);
  pinMode(pin_ClignoDroit, INPUT_PULLUP);
  pinMode(pin_WarningCligno, INPUT_PULLUP);
  pinMode(pin_Freins, INPUT_PULLUP);
  pinMode(pin_MarcheArriere, INPUT_PULLUP);

  clignoGauche.begin();
  clignoDroit.begin();
  freins.begin();
  phareFreinGauche.begin();
  phareFreinDroit.begin();
  marcheArriereGauche.begin();
  marcheArriereDroit.begin();

  clignoGauche.show();
  clignoDroit.show();
  freins.show();
  phareFreinGauche.show();
  phareFreinDroit.show();
  marcheArriereGauche.show();
  marcheArriereDroit.show();

  for (int i = 0; i <= 4; i++)
  {
    phareFreinGauche.setPixelColor(i, phareFreinGauche.Color(0, 40, 0));
    phareFreinDroit.setPixelColor(i, phareFreinDroit.Color(0, 40, 0));
    delay(80);
    phareFreinGauche.show();
    phareFreinDroit.show();

  }
  for (int i = 1; i <= 2; i++)
  {
    freins.setPixelColor(i, freins.Color(0, 40, 0));
    delay(80);
    freins.show();
  }

  delay(200);

  for (int i = 2; i >= 1; i--)
  {
    freins.setPixelColor(i, freins.Color(0, 255, 0));
    delay(45);
    freins.show();
  }
  for (int i = 4; i >= 0; i--)
  {
    phareFreinGauche.setPixelColor(i, phareFreinGauche.Color(0, 255, 0));
    phareFreinDroit.setPixelColor(i, phareFreinDroit.Color(0, 255, 0));
    delay(45);
    phareFreinGauche.show();
    phareFreinDroit.show();
  }

  delay(1000);

  for (int i = 0; i <= 4; i++)
  {
    phareFreinGauche.setPixelColor(i, phareFreinGauche.Color(0, 0, 0));
    phareFreinDroit.setPixelColor(i, phareFreinDroit.Color(0, 0, 0));
    phareFreinGauche.show();
    phareFreinDroit.show();
  }
  for (int i = 0; i <= 2; i++)
  {
    freins.setPixelColor(i, freins.Color(0, 0, 0));
    freins.show();
  }

  delay(600);

  for (int a = 36; a <= 80; a++)
  {

    delay(20);
    for (int i = 0; i <= 2; i++)
    {
      freins.setPixelColor(i, freins.Color(0, a, 0));
      freins.setBrightness(a);
      freins.show();
    }
    for (int i = 0; i <= 4; i++)
    {
      phareFreinGauche.setPixelColor(i, phareFreinGauche.Color(0, a, 0));
      phareFreinDroit.setPixelColor(i, phareFreinDroit.Color(0, a, 0));
      phareFreinGauche.setBrightness(a);
      phareFreinDroit.setBrightness(a);
      phareFreinGauche.show();
      phareFreinDroit.show();
    }
  }
}


void loop()
{
  etat_ClignoGauche = digitalRead(pin_ClignoGauche);
  etat_ClignoDroit = digitalRead(pin_ClignoDroit);
  etat_WarningCligno = digitalRead(pin_WarningCligno);
  etat_Freins = digitalRead(pin_Freins);
  etat_MarcheArriere = digitalRead(pin_MarcheArriere);

  if (etat_ClignoGauche == 0 && etat_ClignoDroit == 1 && etat_WarningCligno == 1)
  {
    codeClignoGauche();
  }


  if (etat_ClignoDroit == 0 && etat_ClignoGauche == 1 && etat_WarningCligno == 1)
  {
    codeClignoDroit();
  }


  if (etat_WarningCligno == 0)
  {

    code_4_Clignotant();
  }


  if (etat_MarcheArriere == 0)
  {
    codeMarcheArriere();
  }
  else
  {
    codeMarcheArriereEteint();
  }


  if (etat_Freins == 0)
  {
    codeFreins();
  }
  else
  {
    codeFreinsEteint();
  }

}


void codeClignoGauche()
{
  for (int i = 0; i <= 4; i++)
  {
    clignoGauche.setPixelColor(i, clignoGauche.Color(80, 255, 0));
    clignoGauche.show();
    delay(30);
  }
  delay(250);
  for (int i = 0; i <= 4; i++)
  {
    clignoGauche.setPixelColor(i, clignoGauche.Color(0, 0, 0));
    clignoGauche.show();
    delay(30);
  }
  delay(250);
}


void codeClignoDroit()
{
  for (int i = 0; i <= 4; i++)
  {
    clignoDroit.setPixelColor(i, clignoDroit.Color(80, 255, 0));
    clignoDroit.show();
    delay(30);
  }
  delay(250);
  for (int i = 0; i <= 4; i++)
  {
    clignoDroit.setPixelColor(i, clignoDroit.Color(0, 0, 0));
    clignoDroit.show();
    delay(30);
  }
  delay(250);
}



void code_4_Clignotant()
{
  for (int i = 0; i <= 4; i++)
  {
    clignoGauche.setPixelColor(i, clignoGauche.Color(70, 255, 0));
    clignoDroit.setPixelColor(i, clignoDroit.Color(70, 255, 0));
    clignoGauche.show();
    clignoDroit.show();
    delay(30);
  }
  delay(250);
  for (int i = 0; i <= 4; i++)
  {
    clignoGauche.setPixelColor(i, clignoGauche.Color(0, 0, 0));
    clignoDroit.setPixelColor(i, clignoDroit.Color(0, 0, 0));
    clignoGauche.show();
    clignoDroit.show();
    delay(30);
  }
  delay(250);
}


void codeMarcheArriere()
{
  for (int i = 0; i <= 4; i++)
  {
    marcheArriereGauche.setPixelColor(i, marcheArriereGauche.Color(50, 100, 40));
    marcheArriereDroit.setPixelColor(i, marcheArriereDroit.Color(50, 100, 40));
    marcheArriereGauche.show();
    marcheArriereDroit.show();
  }
}


void codeMarcheArriereEteint()
{
  for (int i = 0; i <= 4; i++)
  {
    marcheArriereGauche.setPixelColor(i, marcheArriereGauche.Color(0, 0, 0));
    marcheArriereDroit.setPixelColor(i, marcheArriereDroit.Color(0, 0, 0));
    marcheArriereGauche.show();
    marcheArriereDroit.show();
  }
}

void codeFreins()
{
  for (int i = 0; i <= 2; i++)
  {
    freins.setPixelColor(i, freins.Color(0, 255, 0));
    freins.setBrightness(255);
    freins.show();
  }
  for (int i = 4; i >= 0; i--)
  {
    phareFreinGauche.setPixelColor(i, phareFreinGauche.Color(0, 255, 0));
    phareFreinDroit.setPixelColor(i, phareFreinDroit.Color(0, 255, 0));
    phareFreinGauche.setBrightness(255);
    phareFreinDroit.setBrightness(255);
    phareFreinGauche.show();
    phareFreinDroit.show();
    delay(40);
  }
}


void codeFreinsEteint()
{
  for (int i = 0; i <= 4; i++)
  {
    phareFreinGauche.setPixelColor(i, phareFreinGauche.Color(0, 80, 0));
    phareFreinDroit.setPixelColor(i, phareFreinDroit.Color(0, 80, 0));
    phareFreinGauche.setBrightness(80);
    phareFreinDroit.setBrightness(80);
    phareFreinGauche.show();
    phareFreinDroit.show();
  }
  for (int i = 0; i <= 2; i++)
  {
    freins.setPixelColor(i, freins.Color(0, 80, 0));
    freins.setBrightness(80);
    freins.show();
  }

}

je viens de poster une video sur youtube. ca aidera a mieux comprendre ce que j'aimerais faire. voici le lien.

j'ai réussi a remplacer mes delay par la fonction millis() mais je n'arrive pas a faire fonctionner une machine a état dans mon code. Je remémore le projet. j'ai deux boutons poussoir(etat_clignoGauche) et (etat_clignoDroit) qui commande chacun une bande leds.

Quand j'appuie sur le BP (etat_clignoGauche), les leds de la bande de gauche commence, et reste allumer dans cet ordre :de 0 a 1, de 1 a 2, jusqu'a ce quelle soit toutes allumées, puis elles s'éteignent dans le meme ordre : de 0 a 1, de 1 a 2, jusqu'a ce qu'elles soit toutes éteintes. Le BP (etat_clignoDroit) agit exactement de la meme facon sur la bande led de droite, normal, c'est des clignoteur.

Dès que j'appuie sur BP (etat_clignoGauche), les leds de la bande de gauche font leur cycles.
Si j'appuie sur BP (etat_clignoDroit) directement apres avoir relaché BP (etat_clignoGauche), les leds de la bande de droite commenceront a s'allumer que quand la bande de gauche aura terminé sont cycle. Meme chose dans le sens inverse

Ce que j'aimerais, c'est que dès que j'appuie sur le bouton, la bande concerné s'allume et l'autre s'éteint instantanément.

Merci d'avance pour vos aident
voici le code

#include <Adafruit_NeoPixel.h>
#define NUMPIXELS 5

Adafruit_NeoPixel clignoGauche = Adafruit_NeoPixel(NUMPIXELS, 5, NEO_RGBW + NEO_KHZ800);
Adafruit_NeoPixel clignoDroit = Adafruit_NeoPixel(NUMPIXELS, 6, NEO_RGBW + NEO_KHZ800);

boolean etat_ClignoGauche = 0;
boolean etat_ClignoDroit = 0;

int pin_ClignoGauche = 2;
int pin_ClignoDroit = 7;

long prevMillis = 0;
int allumageClignoGaucheEtDroit = 30;
int tempsAttenteHighEtLow = 50;

void setup()
{
  Serial.begin(9600);
  pinMode(pin_ClignoGauche, INPUT_PULLUP);
  pinMode(pin_ClignoDroit, INPUT_PULLUP);

  clignoGauche.begin();
  clignoDroit.begin();

  clignoGauche.show();
  clignoDroit.show();
}


void loop()
{
  etat_ClignoGauche = digitalRead(pin_ClignoGauche);
  etat_ClignoDroit = digitalRead(pin_ClignoDroit);

  if (etat_ClignoGauche == 0 && etat_ClignoDroit == 1)
  {
    codeClignoGauche();
  }
  if (etat_ClignoDroit == 0 && etat_ClignoGauche == 1)
  {
    codeClignoDroit();
  }
}

void codeClignoGauche()
{
  for (int i = 0; i <= 4; i)
  {
    if ( millis() - prevMillis > allumageClignoGaucheEtDroit) {
      prevMillis = millis();
      clignoGauche.setPixelColor (i, clignoGauche.Color(80, 255, 0));
      clignoGauche.show();
      i++;
    }
  }
  for (int i = 0; i <= 4; i)
  {
    if ( millis() - prevMillis > tempsAttenteHighEtLow ) {
      prevMillis = millis();
      clignoGauche.setPixelColor (i, clignoGauche.Color(80, 255, 0));
      clignoGauche.show();
      i++;
    }
  }
  for (int i = 0; i <= 4; i)
  {
    if ( millis() - prevMillis > allumageClignoGaucheEtDroit) {
      prevMillis = millis();
      clignoGauche.setPixelColor(i, clignoGauche.Color(0, 0, 0));
      clignoGauche.show();
      i++;
    }
  }
  for (int i = 0; i <= 4; i)
  {
    if ( millis() - prevMillis > tempsAttenteHighEtLow ) {
      prevMillis = millis();
      clignoGauche.setPixelColor (i, clignoGauche.Color(0, 0, 0));
      clignoGauche.show();
      i++;
    }
  }
}

void codeClignoDroit()
{

  for (int i = 0; i <= 4; i)
  {
    if ( millis() - prevMillis > allumageClignoGaucheEtDroit) {
      prevMillis = millis();
      clignoDroit.setPixelColor (i, clignoDroit.Color(80, 255, 0));
      clignoDroit.show();
      i++;
    }
  }
  for (int i = 0; i <= 4; i)
  {
    if ( millis() - prevMillis > tempsAttenteHighEtLow ) {
      prevMillis = millis();
      clignoDroit.setPixelColor (i, clignoDroit.Color(80, 255, 0));
      clignoDroit.show();
      i++;
    }
  }
  for (int i = 0; i <= 4; i)
  {
    if ( millis() - prevMillis > allumageClignoGaucheEtDroit) {
      prevMillis = millis();
      clignoDroit.setPixelColor(i, clignoDroit.Color(0, 0, 0));
      clignoDroit.show();
      i++;
    }
  }
  for (int i = 0; i <= 4; i)
  {
    if ( millis() - prevMillis > tempsAttenteHighEtLow ) {
      prevMillis = millis();
      clignoDroit.setPixelColor (i, clignoDroit.Color(0, 0, 0));
      clignoDroit.show();
      i++;
    }
  }
}

pouvez vous dessiner un diagramme des états (comme les ronds dans mon tuto)

et Pour simplifier votre gestion des boutons, utilisez la librairie de @bricoleau

voici le diagramme d'une partie de mon code qui comporte 2 bandes leds commandées par 2 boutons. Un bouton pour chaque bandes leds.

voici votre dessin:

vous nous expliquez comment ça se lit ?

Voici une tentative d'approche de votre projet - je sépare volontairement les étapes pour que ce soit simple à comprendre, au codage bien sûr il faudra regrouper certains états

Au départ, état INITIAL, les 2 bandeaux sont éteints

Imaginons que vous ayez l'évènement "bouton GAUCHE", la première LED de gauche doit s'allumer

puis imaginez que vous ayez l'évènement "20ms écoulées", il faut allumer la deuxième LED

et ainsi de suite jusqu'à allumage complet du bandeau, puis extinction progressive et là on recommence

Bien sûr de manière symétrique on à la même chose à droite

Maintenant imaginons qu'on veuille arrêter le clignotant gauche alors qu'on est en train de clignoter à Gauche --> Quand on reçoit l'évènement "bouton GAUCHE", on revient alors à l'état de départ.

cela est bien sûr valable quel que soit l'état de clignotement à gauche

et de manière similaire on aura la même chose à droite si on reçoit l'événement 'Bouton DROITE"

Maintenant si je suis en train de clignoter à gauche et que l'on reçoit l'événement 'Bouton DROITE", vous voulez interrompre le clignotement de gauche et démarrer celui de droite. On doit donc aussi avoir les transitions suivantes:

et de manière symétrique, si vous êtes en train de clignoter à droite et que que l'on reçoit l'événement 'Bouton GAUCHE", vous voulez interrompre le clignotement de droite et démarrer celui de gauche. On doit donc aussi avoir les transitions suivantes:

On voit qu'il faut donc savoir gérer 3 événements, GAUCHE, DROITE et 20ms écoulées. Je ne représente pas le graphe avec toutes les flèches parce que ce serait illisible mais je suppose que vous comprenez le principe.

On peut coder comme cela mais c'est un peu lourd, surtout si on ne connait pas le nombre de LEDs. Dans ce cas comme dans tous les états de clignotement à gauche ou droite on attend les mêmes évènements, on peut les regrouper et traiter la LED à allumer ou éteindre avec une variable spécifique à cet état, qu'on prendra soin de remettre à sa valeur initiale quand on sort du clignotement en cours.

Voilà - à vous de jouer :slight_smile:

Les flèches correspondent aux états des boutons.

Flèche verte pour bouton gauche appuyé.
Flèche bleu pour bouton droit appuyé.
Flèche grise pour boutons relachés.

Les ronds correspondent a l'allumage ou a l'extinction des bandes leds.

Rond GRIS anneaux VERT(bas): Etat bouton GAUCHE sur LOW donc, bande leds GAUCHE éteinte.(BP relaché, flèche grise)

Rond GRIS anneaux BLEU(haut): Etat bouton DROITE sur LOW donc, bande leds DROITE éteinte.(BP relaché, flèche grise)

Rond VERT(gauche): Etat bouton GAUCHE sur HIGH donc, bande leds GAUCHE allumé.(BP appuyé, petite flèche verte )

Rond BLEU(droit): Etat bouton DROIT sur HIGH donc, bande leds DROITE allumé.(BP appuyé,petite flèche bleu)

Si j'appuie sur le bouton gauche(grande flèche bleu) alors que le bouton droit est appuyé, la bande leds de droite doit immédiatement s'éteindre et la bande leds de gauche doit immédiatement s'allumé.

inversément

Si j'appuie sur le bouton droit(grande flèche verte) alors que le bouton gauche est appuyé, la bande leds de gauche doit immédiatement s'éteindre et la bande leds de droite doit immédiatement s'allumé.

Ce que je n'arrive pas a faire, c'est de stopper la boucle for(int i=0; i<=4; i++) du dynamisme des leds.
Il faut a chaque fois attendre que la boucle du cligno droit se termine pour que la boucle du cligno gauche commence et inversément.

je vous remet une partie de mon code(que les 2 boutons cligno gauche et cligno droit) en sachant qu'il y a encore 4 autres boutons a imbriquer dans mon code.

#include <Adafruit_NeoPixel.h>
#define NUMPIXELS 5

Adafruit_NeoPixel clignoGauche = Adafruit_NeoPixel(NUMPIXELS, 5, NEO_RGBW + NEO_KHZ800);
Adafruit_NeoPixel clignoDroit = Adafruit_NeoPixel(NUMPIXELS, 6, NEO_RGBW + NEO_KHZ800);

boolean etat_ClignoGauche = 0;
boolean etat_ClignoDroit = 0;

int pin_ClignoGauche = 2;
int pin_ClignoDroit = 7;

long prevMillis = 0;
int tempo_AllumageClignoGaucheEtDroit = 30;
int tempo_ResteAllumeClignoGaucheEtDroit = 50;
int tempo_EteintClignoGaucheEtDroit = 30;
int tempo_ResteEteintClignoGaucheEtDroit = 50;

void setup()
{
  Serial.begin(9600);
  pinMode(pin_ClignoGauche, INPUT_PULLUP);
  pinMode(pin_ClignoDroit, INPUT_PULLUP);

  clignoGauche.begin();
  clignoDroit.begin();

  clignoGauche.show();
  clignoDroit.show();
}

void loop()
{
  etat_ClignoGauche = digitalRead(pin_ClignoGauche);
  etat_ClignoDroit = digitalRead(pin_ClignoDroit);

  if (etat_ClignoGauche == 0 && etat_ClignoDroit == 1)
  {
    codeClignoGauche();
  }

  if (etat_ClignoDroit == 0 && etat_ClignoGauche == 1)
  {
    codeClignoDroit();
  }
}

void codeClignoGauche()
{
  for (int i = 0; i <= 4; i)
  {
    if ( millis() - prevMillis > tempo_AllumageClignoGaucheEtDroit)
    {
      prevMillis = millis();
      clignoGauche.setPixelColor (i, clignoGauche.Color(80, 255, 0));
      clignoGauche.show();
      i++;
    }
  }
  for (int i = 0; i <= 4; i)
  {
    if ( millis() - prevMillis > tempo_ResteAllumeClignoGaucheEtDroit)
    {
      prevMillis = millis();
      clignoGauche.setPixelColor (i, clignoGauche.Color(80, 255, 0));
      clignoGauche.show();
      i++;
    }
  }
  for (int i = 0; i <= 4; i)
  {
    if ( millis() - prevMillis > tempo_EteintClignoGaucheEtDroit)
    {
      prevMillis = millis();
      clignoGauche.setPixelColor(i, clignoGauche.Color(0, 0, 0));
      clignoGauche.show();
      i++;
    }
  }
  for (int i = 0; i <= 4; i)
  {
    if ( millis() - prevMillis > tempo_ResteEteintClignoGaucheEtDroit)
    {
      prevMillis = millis();
      clignoGauche.setPixelColor (i, clignoGauche.Color(0, 0, 0));
      clignoGauche.show();
      i++;
    }
  }
}

void codeClignoDroit()
{

  for (int i = 0; i <= 4; i)
  {
    if ( millis() - prevMillis > tempo_AllumageClignoGaucheEtDroit)
    {
      prevMillis = millis();
      clignoDroit.setPixelColor (i, clignoDroit.Color(80, 255, 0));
      clignoDroit.show();
      i++;
    }
  }
  for (int i = 0; i <= 4; i)
  {
    if ( millis() - prevMillis > tempo_ResteAllumeClignoGaucheEtDroit)
    {
      prevMillis = millis();
      clignoDroit.setPixelColor (i, clignoDroit.Color(80, 255, 0));
      clignoDroit.show();
      i++;
    }
  }
  for (int i = 0; i <= 4; i)
  {
    if ( millis() - prevMillis > tempo_EteintClignoGaucheEtDroit)
    {
      prevMillis = millis();
      clignoDroit.setPixelColor(i, clignoDroit.Color(0, 0, 0));
      clignoDroit.show();
      i++;
    }
  }
  for (int i = 0; i <= 4; i)
  {
    if ( millis() - prevMillis > tempo_ResteEteintClignoGaucheEtDroit)
    {
      prevMillis = millis();
      clignoDroit.setPixelColor (i, clignoDroit.Color(0, 0, 0));
      clignoDroit.show();
      i++;
    }
  }
}

Ce que je n'arrive pas a faire, c'est de stopper la boucle for(int i=0; i<=4; i++) du dynamisme des leds.
Il faut a chaque fois attendre que la boucle du cligno droit se termine pour que la boucle du cligno gauche commence et inversément.

oui puisque dans la boucle vous ne traitez pas les événements. vous ne pouvez pas avoir de boucle for qui fait une attente active, il faut remonter toujours au début de la loop.

Regardez un peu les dessins que j'ai mis plus haut, il faut changer la notion de second click sur le bouton droite ou gauche pour relâchement du bouton, mais c'est la même chose, juste un événement à traiter

merci pour l'explication, c'est du lourd. ce n'est pas comme le charabia que je viens de poster. Je vais continuer a essayer de faire aller ce code de mysère. Merci encore pour l'explication

tenez à guise d'exemple avec un affichage dans la console Série (à 115200 bauds) et pour simplifier la gestion des boutons, j'ai pris la librairie de @bricoleau

ça devrait se lire comme le dessin que j'ai fait ci dessus sauf que j'ai regroupés les états où on ne fait qu'avancer l'allumage des pixels dans une fonction etapeSuivante() qui calcule ce qu'il faut faire (on lui donne en param le tableau représentant les pixels à traiter)

#include <simpleBouton.h> // http://forum.arduino.cc/index.php?topic=375232.0

const byte NUMPIXELS  = 5;
byte pixelsDroite[NUMPIXELS];
byte pixelsGauche[NUMPIXELS];
enum : byte {ETEINT, ALLUME};

const byte pin_ClignoGauche = 2;
const byte pin_ClignoDroit = 7;

simpleBouton boutonGauche(pin_ClignoGauche); //Cablage : pin---BP---GND (le bouton sera en INPUT_PULLUP)
simpleBouton boutonDroite(pin_ClignoDroit); //Cablage : pin---BP---GND (le bouton sera en INPUT_PULLUP)

enum : byte {REPOS, CLIGNOTE_GAUCHE, CLIGNOTE_DROITE} etat;

unsigned long chrono;
const unsigned long periodeClignotement = 1000ul; // ici 1s pour qu'on voit ce qu'il se passe, 20ul pour 20ms

void afficherPixels()
{
  Serial.print(F("["));
  for (int i = NUMPIXELS - 1; i >= 0 ; i--)
      if (pixelsGauche[i] == ETEINT) Serial.write('0'); else Serial.write('1');

  Serial.print(F("]\t\t["));

  for (int i = 0; i < NUMPIXELS; i++)
      if (pixelsDroite[i] == ETEINT) Serial.write('0'); else Serial.write('1');
  Serial.println(F("]"));
}

void etapeSuivante(byte bandeDePixel[])
{
  int unPixel;

  for (unPixel = 0; unPixel < NUMPIXELS; unPixel++)
    if (bandeDePixel[unPixel] == ALLUME) break;

  if (unPixel == NUMPIXELS) bandeDePixel[0] = ALLUME;  // s'ils sont tous éteint c'est qu'on commence
  else {
    // si le premier pixel est allumé et pas le dernier c'est qu'on "monte"
    if ((bandeDePixel[0] == ALLUME) && (bandeDePixel[NUMPIXELS - 1] == ETEINT)) {
      // on cherche le premier pas allumé et on l'allume
      for (unPixel = 0; unPixel < NUMPIXELS; unPixel++) {
        if (bandeDePixel[unPixel] == ETEINT) {
          bandeDePixel[unPixel] = ALLUME;
          break;
        }
      }
    } else {
      // c'est qu'on descend
      // on cherche le premier allumé et on l'éteint
      for (unPixel = 0; unPixel < NUMPIXELS; unPixel++) {
        if (bandeDePixel[unPixel] == ALLUME) {
          bandeDePixel[unPixel] = ETEINT;
          break;
        }
      }
    }
  }
  // on rend visible notre modif
  afficherPixels();
}

void mettreAuRepos()
{
  for (byte i = 0; i < NUMPIXELS; i++) {
    pixelsDroite[i] = ETEINT;
    pixelsGauche[i] = ETEINT;
  }
  afficherPixels();
  etat = REPOS;
}

void actualiserLesBoutons()
{
  boutonGauche.actualiser();
  boutonDroite.actualiser();
}

void setup() {
  Serial.begin(115200);
  mettreAuRepos();
}

void loop() {

  // on teste les boutons
  actualiserLesBoutons();

  // on prend une décision
  switch (etat) {
    case REPOS:
      if (boutonGauche.estEnfonce()) {
        chrono = millis();
        etapeSuivante(pixelsGauche);
        etat = CLIGNOTE_GAUCHE;
      }
      else if (boutonDroite.estEnfonce()) {
        chrono = millis();
        etapeSuivante(pixelsDroite);
        etat = CLIGNOTE_DROITE;
      }
      break;

    case CLIGNOTE_GAUCHE:
      if (boutonGauche.vientDEtreRelache()) mettreAuRepos();
      else if (millis() - chrono >= periodeClignotement) {
        etapeSuivante(pixelsGauche);
        chrono += periodeClignotement;
      }
      else if (boutonDroite.vientDEtreEnfonce()) {
        mettreAuRepos();
        chrono = millis();
        etapeSuivante(pixelsDroite);
        etat = CLIGNOTE_DROITE;
      }
      break;

    case CLIGNOTE_DROITE:
      if (boutonDroite.estRelache()) mettreAuRepos();
      else if (millis() - chrono >= periodeClignotement) {
        etapeSuivante(pixelsDroite);
        chrono += periodeClignotement;
      }
      else if (boutonGauche.vientDEtreEnfonce()) {
        mettreAuRepos();
        chrono = millis();
        etapeSuivante(pixelsGauche);
        etat = CLIGNOTE_GAUCHE;
      }
      break;
  }
}