Arduino Forum

International => Français => Topic started by: Toinit on Jan 27, 2019, 06:43 pm

Title: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: Toinit on Jan 27, 2019, 06:43 pm
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


Code: [Select]


#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();
               }

}







Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: J-M-L on Jan 27, 2019, 08:17 pm
il faut virer les  delay() donc utiliser la technique de millis() (cf l'exemple blink without millis() ) et une machine à états (cf mon tuto (http://forum.arduino.cc/index.php?topic=470879.0) sur ce sujet éventuellement)
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: b2r on Jan 27, 2019, 09:42 pm
Quote
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 :smiley-mr-green:
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: Toinit on Jan 29, 2019, 09:24 pm
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é.
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: lesept on Jan 29, 2019, 10:31 pm
J'avais aidé un autre membre du forum sur un sujet similaire (http://forum.arduino.cc/index.php?topic=575880.0)
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: Toinit on Feb 01, 2019, 12:46 pm
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.
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: Toinit on Feb 01, 2019, 05:51 pm
voila mon code en entier
Code: [Select]
#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();
                                                         }
                                            }
}
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: lesept on Feb 01, 2019, 05:59 pm
Fais un CTRL T dans l'IDE pour corriger l'indentation. Il manque la loop aussi...
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: Toinit on Feb 01, 2019, 06:20 pm
désolé, voila mon code en entier
Code: [Select]

#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();
  }

}
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: Toinit on Feb 01, 2019, 06:54 pm
je viens de poster une video sur youtube. ca aidera a mieux comprendre ce que j'aimerais faire. voici le lien.

https://www.youtube.com/watch?v=5FCdHe6ozGI
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: Toinit on Feb 09, 2019, 02:37 pm
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

 
Code: [Select]

#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++;
    }
  }
}




Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: J-M-L on Feb 09, 2019, 02:58 pm
pouvez vous dessiner un diagramme des états (comme les ronds dans mon tuto (http://forum.arduino.cc/index.php?topic=470879.0))

Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: J-M-L on Feb 10, 2019, 04:00 pm
et Pour simplifier votre gestion des boutons, utilisez la librairie de @bricoleau (http://forum.arduino.cc/index.php?topic=375232.0)
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: Toinit on Feb 10, 2019, 05:02 pm
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.
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: J-M-L on Feb 10, 2019, 05:58 pm
voici votre dessin:

(http://forum.arduino.cc/index.php?action=dlattach;topic=593768.0;attach=294157)

vous nous expliquez comment ça se lit ?
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: J-M-L on Feb 10, 2019, 06:53 pm
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
(http://forum.arduino.cc/index.php?action=dlattach;topic=593768.0;attach=294175)

Imaginons que vous ayez l'évènement "bouton GAUCHE", la première LED de gauche doit s'allumer
(http://forum.arduino.cc/index.php?action=dlattach;topic=593768.0;attach=294177)

puis imaginez que vous ayez l'évènement "20ms écoulées", il faut allumer la deuxième LED
(http://forum.arduino.cc/index.php?action=dlattach;topic=593768.0;attach=294179)

et ainsi de suite jusqu'à allumage complet du bandeau, puis extinction progressive et là on recommence
(http://forum.arduino.cc/index.php?action=dlattach;topic=593768.0;attach=294181)

Bien sûr de manière symétrique on à la même chose à droite
(http://forum.arduino.cc/index.php?action=dlattach;topic=593768.0;attach=294183)

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.
(http://forum.arduino.cc/index.php?action=dlattach;topic=593768.0;attach=294185)

cela est bien sûr valable quel que soit l'état de clignotement à gauche
(http://forum.arduino.cc/index.php?action=dlattach;topic=593768.0;attach=294187)

et de manière similaire on aura la même chose à droite si on reçoit l'événement 'Bouton DROITE"
(http://forum.arduino.cc/index.php?action=dlattach;topic=593768.0;attach=294189)

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:
(http://forum.arduino.cc/index.php?action=dlattach;topic=593768.0;attach=294191)

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:
(http://forum.arduino.cc/index.php?action=dlattach;topic=593768.0;attach=294193)

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 :)

Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: Toinit on Feb 10, 2019, 07:13 pm
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.
Code: [Select]

#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++;
    }
  }
}
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: J-M-L on Feb 10, 2019, 07:16 pm
Quote
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
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: Toinit on Feb 10, 2019, 07:37 pm
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
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: J-M-L on Feb 10, 2019, 08:33 pm
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 (http://forum.arduino.cc/index.php?topic=375232.0)

ç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)

Code: [Select]
#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;
  }
}
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: Toinit on Feb 12, 2019, 10:53 pm
Merci encore pour toutes ces explications. Mon exemple de code que vous avez modifier m'aide énormément a comprendre comment cela fonctionne. J'ai bien les 0 et les 1 qui défilent quand j'appuie sur les boutons.(c'est bien fait d'ailleurs) mais ca ne fonctionne que si je passe le serial.begin a 9600. Pouvez vous me dire pourquoi? l'autre petit souci c'est que mes leds ne s'allume pas, croyez vous que c'est a cause de la bibliothèque adafruit neopixel qui n'est pas présente?
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: J-M-L on Feb 13, 2019, 08:49 am
Quote
mais ca ne fonctionne que si je passe le serial.begin a 9600
Sans doute parce que dans le pop up associé à la console série vous avez choisi 9600 --> passer ça à 115200

Bien sûr c'est une démo sans LEDs... je vous montre comment gérer cela dans un tableau et l'imprimer --> à adapter à votre code, mettre les librairies pour les pixels et modifier à la fois potentiellement la gestion du tableau et la fonction d'affichage pour adapter à votre cas 
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: Toinit on Feb 14, 2019, 09:22 pm
Je vous assure que je fais tout pour comprendre et faire fonctionner tout ca, mais ou bout d'un moment, je mélange tout. La seul chose que je sais faire, c'est recopier un code qui correspond  plus ou moins a mon montage,  et le modifier tant bien que mal pour avoir un résultat plus ou moins espérer. Pour moi, c'est comme un jeu d'échec ou il faudrait avoir 100 coups d'avance pour pouvoir gagné, ce qui pour moi, est impossible. Allumé une led et la faire clignoter, ok, c'est dans mes cordes mais je suis arrivé a un stade ou je ne comprend plus rien. Svp pourriez vous modifier mon code pour que mes bandes leds fonctionnent comme dans le serial moniteur ?
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: J-M-L on Feb 16, 2019, 04:59 pm
Remplacez mes tableaux par vos tableaux de LEDs et modifiez la fonction afficherPixels() pour qu'elle appelle la fonction d'allumage des bandeaux au lieu d'imprimer sur le port série
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: Toinit on Feb 17, 2019, 01:35 pm
je n'y arrive pas.
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: J-M-L on Feb 17, 2019, 02:30 pm
postez votre essai...
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: Toinit on Feb 17, 2019, 03:20 pm
je ne comprend pas comment il faut procéder.
Code: [Select]

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

const byte NUMPIXELS  = 5;

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

byte clignoDroit[NUMPIXELS];
byte clignoGauche[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()
{

  for (int i = NUMPIXELS - 1; i >= 0 ; i--)
    if (clignoGauche[i] == ETEINT) {
      clignoGauche.setPixelColor(i, clignoGauche.Color(0, 0, 0));
      clignoGauche.show();
    }
    else
    {
      clignoGauche.setPixelColor (i, clignoGauche.Color(80, 255, 0));
      clignoGauche.show();
    }




for (int i = 0; i < NUMPIXELS; i++)
  if (clignoDroit[i] == ETEINT)
  {
    clignoDroit.setPixelColor(i, clignoDroit.Color(0, 0, 0));
    clignoDroit.show();
  }

  else
  {
    clignoDroit.setPixelColor (i, clignoDroit.Color(80, 255, 0));
    clignoDroit.show();
  }

}

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++) {
    clignoDroit[i] = ETEINT;
    clignoGauche[i] = ETEINT;
  }
  afficherPixels();
  etat = REPOS;
}

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

void setup() {
 
  mettreAuRepos();
}

void loop() {

  // on teste les boutons
  actualiserLesBoutons();

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

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

    case CLIGNOTE_DROITE:
      if (boutonDroite.estRelache()) mettreAuRepos();
      else if (millis() - chrono >= periodeClignotement) {
        etapeSuivante(clignoDroit);
        chrono += periodeClignotement;
      }
      else if (boutonGauche.vientDEtreEnfonce()) {
        mettreAuRepos();
        chrono = millis();
        etapeSuivante(clignoGauche);
        etat = CLIGNOTE_GAUCHE;
      }
      break;
  }
}
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: J-M-L on Feb 17, 2019, 03:38 pm
les 2 tableaux
Code: [Select]
byte clignoDroit[NUMPIXELS];
byte clignoGauche[NUMPIXELS];
ne doivent plus exister.

il faut directement utiliser
Code: [Select]
Adafruit_NeoPixel clignoGauche = Adafruit_NeoPixel(NUMPIXELS, 5, NEO_RGBW + NEO_KHZ800);
Adafruit_NeoPixel clignoDroit = Adafruit_NeoPixel(NUMPIXELS, 6, NEO_RGBW + NEO_KHZ800);


et remplacer là où je mets vrai ou faux dans le tableau par des couleurs (avec clignoGauche.setPixelColor() ou clignoDroit.setPixelColor()) et tester la couleur (allumé ou éteint)


Une fois que c'est fait le code d'affichage est alors simplement
Code: [Select]
void afficherPixels()
{
    clignoGauche.show();
    clignoDroit.show();
}
les pixels qu'on allume


si vous voulez garder à la fois mes tableaux ET la mémoire associée aux LEDs, alors oui il faut recopier l'état des LEDS avant de faire l'affichage sans doute un

Code: [Select]
void afficherPixels()
{

  for (int i = NUMPIXELS - 1; i >= 0 ; i--)
    if (clignoGauche[i] == ETEINT) {
      clignoGauche.setPixelColor(i, clignoGauche.(Color(0, 0, 0));
    } else {
      clignoGauche.setPixelColor (i, clignoGauche.Color(80, 255, 0));
    }
  clignoGauche.show();

  for (int i = 0; i < NUMPIXELS; i++)
    if (clignoDroit[i] == ETEINT)
    {
      clignoDroit.setPixelColor(i, clignoDroit.Color(0, 0, 0));
    } else {
      clignoDroit.setPixelColor (i, clignoDroit.Color(80, 255, 0));
    }
  clignoDroit.show();

}
mais c'est un peu bête.. autant utiliser la mémoire du ruban directement
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: Toinit on Feb 17, 2019, 04:16 pm
comme ceci ?
Code: [Select]

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

const byte NUMPIXELS  = 5;

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


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()
{

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

}

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()
{
 
 
  afficherPixels();
  etat = REPOS;
}

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

void setup() {
 
  mettreAuRepos();
}

void loop() {


  // on teste les boutons
  actualiserLesBoutons();

  // on prend une décision
  switch (etat) {
    case REPOS:
      if (boutonGauche.estEnfonce()) {
        chrono = millis();
        Adafruit_NeoPixel clignoGauche = Adafruit_NeoPixel(NUMPIXELS, 5, NEO_RGBW + NEO_KHZ800);
        clignoGauche.setPixelColor ( clignoGauche.Color(0, 0, 0));
        etat = CLIGNOTE_GAUCHE;
      }
      else if (boutonDroite.estEnfonce()) {
        chrono = millis();
        Adafruit_NeoPixel clignoDroit = Adafruit_NeoPixel(NUMPIXELS, 6, NEO_RGBW + NEO_KHZ800);
        clignoDroit.setPixelColor( clignoDroit.Color(0, 0, 0));
        etat = CLIGNOTE_DROITE;
      }
      break;

    case CLIGNOTE_GAUCHE:
      if (boutonGauche.vientDEtreRelache()) mettreAuRepos();
      else if (millis() - chrono >= periodeClignotement) {
        Adafruit_NeoPixel clignoGauche = Adafruit_NeoPixel(NUMPIXELS, 5, NEO_RGBW + NEO_KHZ800);
        clignoGauche.setPixelColor ( clignoGauche.Color(0, 0, 0));
        chrono += periodeClignotement;
      }
      else if (boutonDroite.vientDEtreEnfonce()) {
        mettreAuRepos();
        chrono = millis();
        Adafruit_NeoPixel clignoGauche = Adafruit_NeoPixel(NUMPIXELS, 5, NEO_RGBW + NEO_KHZ800);
        clignoGauche.setPixelColor ( clignoGauche.Color(80, 255, 0));
       
        etat = CLIGNOTE_DROITE;
      }
      break;

    case CLIGNOTE_DROITE:
      if (boutonDroite.estRelache()) mettreAuRepos();
      else if (millis() - chrono >= periodeClignotement) {
        Adafruit_NeoPixel clignoDroit = Adafruit_NeoPixel(NUMPIXELS, 6, NEO_RGBW + NEO_KHZ800);
        clignoDroit.setPixelColor( clignoDroit.Color(0, 0, 0));
       
        chrono += periodeClignotement;
      }
      else if (boutonGauche.vientDEtreEnfonce()) {
        mettreAuRepos();
        chrono = millis();
        Adafruit_NeoPixel clignoDroit = Adafruit_NeoPixel(NUMPIXELS, 6, NEO_RGBW + NEO_KHZ800);
        clignoDroit.setPixelColor( clignoDroit.Color(80, 255, 0));
       
        etat = CLIGNOTE_GAUCHE;
      }
      break;
  }
}
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: J-M-L on Feb 17, 2019, 04:32 pm
Non...

pourquoi vous avez
Code: [Select]
Adafruit_NeoPixel clignoGauche = Adafruit_NeoPixel(NUMPIXELS, 5, NEO_RGBW + NEO_KHZ800);dans le
Code: [Select]
  switch (etat) {
    case REPOS:....



vous devriez mettre le projet de côté et lire un tuto sur le langage C et les bases du C++

En essayant au hasard vous n'arrivez à rien
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: Toinit on Feb 17, 2019, 07:07 pm
j'abandonne tout cour
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: lesept on Feb 17, 2019, 07:15 pm
N"abandonne pas : apprends à ta vitesse avec des tutos sur d'autres sujets qui te permettront de bien comprendre le langage C et reviens sur ton projet lorsque tu te sentiras plus à l'aise. Tu sais déjà les points sur lesquels tu dois t'améliorer : switch / case, machine d'états, etc.
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: J-M-L on Feb 18, 2019, 10:47 am
j'abandonne tout court
Si on l'ecrit Pour vous vous n'aurez rien appris... Faut batailler. Et quand vous aurez votre premier programme perso fonctionnel vous serez super content!

allez pour vous aider à avancer, jetez un oeil sur ce code: j'ai simplement conservé ma structure de code ci dessus et remplacé la lecture des pixels dans le tableau par la lecture de leur couleur dans la bande. j'ai tapé cela ici, je ne sais même pas si ça compile et encore moins si ça va fonctionner. à vous de creuser

Code: [Select]
#include <simpleBouton.h> // http://forum.arduino.cc/index.php?topic=375232.0
#include <Adafruit_NeoPixel.h>

const byte NUMPIXELS  = 5;

Adafruit_NeoPixel pixelsClignoGauche = Adafruit_NeoPixel(NUMPIXELS, 5, NEO_RGBW + NEO_KHZ800);
Adafruit_NeoPixel pixelsClignoDroit = Adafruit_NeoPixel(NUMPIXELS, 6, NEO_RGBW + NEO_KHZ800);

uint32_t noir, vert;
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()
{
  pixelsClignoGauche.show();
  pixelsClignoDroit.show();
}

void etapeSuivante(Adafruit_NeoPixel& bandeDePixel)
{
  int unPixel;

  for (unPixel = 0; unPixel < NUMPIXELS; unPixel++)
    if (bandeDePixel.getPixelColor(unPixel) != noir) break; // on en a trouvé un allumé

  if (unPixel == NUMPIXELS) bandeDePixel.setPixelColor(0, vert); // allumé 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.getPixelColor(0) != noir) && (bandeDePixel.getPixelColor(NUMPIXELS - 1) == noir)) {
      // on cherche le premier pas allumé et on l'allume
      for (unPixel = 0; unPixel < NUMPIXELS; unPixel++) {
        if (bandeDePixel.getPixelColor(unPixel) != noir) {
          bandeDePixel.setPixelColor(unPixel, vert); // allumé
          break;
        }
      }
    } else {
      // c'est qu'on descend
      // on cherche le premier allumé et on l'éteint
      for (unPixel = 0; unPixel < NUMPIXELS; unPixel++) {
        if (bandeDePixel.getPixelColor(unPixel) != noir) {
          bandeDePixel.setPixelColor(unPixel, noir); //éteint
          break;
        }
      }
    }
  }
  // on rend visible notre modif
  afficherPixels();
}

void mettreAuRepos()
{
  pixelsClignoGauche.clear();
  pixelsClignoDroit.clear();
  etat = REPOS;
  afficherPixels();
}

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

void setup() {
  Serial.begin(115200);
  pixelsClignoGauche.begin();
  pixelsClignoDroit.begin();
  noir = pixelsClignoGauche.Color(0, 0, 0);
  vert = pixelsClignoGauche.Color(80, 255, 0);
  mettreAuRepos();
}

void loop() {

  // on teste les boutons
  actualiserLesBoutons();

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

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

    case CLIGNOTE_DROITE:
      if (boutonDroite.estRelache()) mettreAuRepos();
      else if (millis() - chrono >= periodeClignotement) {
        etapeSuivante(pixelsClignoDroit);
        chrono += periodeClignotement;
      }
      else if (boutonGauche.vientDEtreEnfonce()) {
        mettreAuRepos();
        chrono = millis();
        etapeSuivante(pixelsClignoGauche);
        etat = CLIGNOTE_GAUCHE;
      }
      break;
  }
}
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: Toinit on Feb 18, 2019, 06:00 pm
Merci beaucoup de m'encourager. Je vais batailler et je vais y arriver. Merci encore a tout le monde.
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: J-M-L on Feb 18, 2019, 06:09 pm
Jetez un oeil sur le code ci dessus, avec un peu de chance il va tomber en marche
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: Toinit on Mar 10, 2019, 03:56 pm
Le code fonctionne :D  :D  :D . J'ai juste remplacer "noir" par "vert" dans la fonction "void etapeSuivante(...)" a la condition "on cherche le premier pas allumé et on l'allume".

Mais il y a un petit souci.

La fonction mettreAuRepos(); doit s'exécutée que si le bouton opposé est enfoncé, exemple :

Si bouton gauche enfoncé(le cycle de clignotement gauche commence). Si relaché, le cycle de clignotement continue jusqu'a ce que toutes les leds soient éteintes, puis ont passe a la fonction mettreAuRepos.

Si le cycle de clignotement (bouton gauche) n'est pas terminé et qu'on enfonce le bouton droit, la fonction mettreAuRepos doit s'exécuté. Le cycle de clignotement (bouton gauche) s'interrompt et le cycle de clignotement (bouton droit) doit commencer.

En conclusion, il me faut une fonction etapeSuivante dont son exécution commence au relachement des boutons et se termine quand la derniere leds est éteintes mais il faut que la fonction etapeSuivante soit interrompue si l'autre bouton est enfoncé.
Comment pourrais je faire ?






Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: J-M-L on Mar 10, 2019, 05:20 pm
Quote
Si bouton gauche enfoncé(le cycle de clignotement gauche commence). Si relaché, le cycle de clignotement continue jusqu'a ce que toutes les leds soient éteintes, puis ont passe a la fonction mettreAuRepos.
Euh...sur ma voiture quand je désactive mon clignotant il s'éteint instantanément, il ne continue pas à clignoter " un peu" (sauf mode impulsion où il clignote trois fois).


Mais bon, ça veut dire qu'il faut créer des états supplémentaires, tout simplement.. au lieu de
Code: [Select]
    case CLIGNOTE_GAUCHE:
      if (boutonGauche.vientDEtreRelache()) mettreAuRepos();
il faut passer dans un état FINIR_CLIGNOTE_GAUCHE (idem à droite)

la notion de "finir le clignotement" n'étant pas définie pour le moment il faut par exemple modifier la fonction void etapeSuivante(byte bandeDePixel[]) pour qu'elle retourne un booléen qui dit si à la sortie tout est éteint. comme cela dans FINIR_CLIGNOTE_GAUCHE (et idem à droite) on testera s'il faut clignoter et si oui on testera si on a tout éteint et testant la valeur retournée par la fonction etapeSuivante() --> un truc du genre
Code: [Select]
      if (millis() - chrono >= periodeClignotement) {
        if (etapeSuivante(pixelsClignoGauche)) mettreAuRepos();
        else chrono += periodeClignotement;
      }
bien sûr dans cette étape il faut aussi tenir compte (éventuellement à vous de voir) de l'appui sur l'autre bouton donc on rajoutera comme dans l'état CLIGNOTE_GAUCHE la détection de l'appui sur droite

Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: Toinit on Mar 11, 2019, 12:33 pm
Pouvez vous faire le code Svp. Je ne suis pas encore prêt pour comprendre tout ça.
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: Toinit on Mar 11, 2019, 01:18 pm
Doit je remplacer case CLIGNO GAUCHE par FINIR CLIGNO GAUCHE ? ou ajouter case FINIR CLIGNO GAUCHE dans enum état en plus de case CLIGNO GAUCHE?
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: Toinit on Mar 24, 2019, 08:05 pm
Merci infiniment  J-M-L, pour tout ce que vous avez fait pour m'aider. Vous devez être complètement épuisé de moi (tout a fait normal, je comprend)

C'est pour cela que je demande a quelqu'un d'autres pour m'aider a finir mon code svp.

Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: lesept on Mar 24, 2019, 08:21 pm
Pas facile de reprendre un code écrit par quelqu'un d'autre, fut-ce J-M-L... ;)
Poste le code en l'état et explique bien ce que tu veux en plus, comme si tu commençais un nouveau fil de discussion.
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: J-M-L on Mar 24, 2019, 09:00 pm
J'ai pas répondu parce que j'aimerai bien que vous essayez de faire la modif...
Title: Re: Leds strip/Projet phares arrière. Problème code pour clignoteur
Post by: Toinit on Mar 26, 2019, 11:29 pm
 

Code: [Select]

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

const byte NUMPIXELS  = 18;

Adafruit_NeoPixel pixelsClignoGauche = Adafruit_NeoPixel(NUMPIXELS, 5, NEO_RGBW + NEO_KHZ800);
Adafruit_NeoPixel pixelsClignoDroit = Adafruit_NeoPixel(NUMPIXELS, 6, NEO_RGBW + NEO_KHZ800);

uint32_t noir, vert;
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 {FINIR_CLIGNOTE_DROITE, FINIR_CLIGNOTE_GAUCHE, REPOS} etat;

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

void afficherPixels()
{
  pixelsClignoGauche.show();
  pixelsClignoDroit.show();
}

void etapeSuivante(Adafruit_NeoPixel& bandeDePixel)
{
  int unPixel;

  for (unPixel = 0; unPixel < NUMPIXELS; unPixel++)
    if (bandeDePixel.getPixelColor(unPixel) != noir) break; // on en a trouvé un allumé

  if (unPixel == NUMPIXELS) bandeDePixel.setPixelColor(0, vert); // allumé 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.getPixelColor(0) != noir) && (bandeDePixel.getPixelColor(NUMPIXELS - 1) == noir)) {
      // on cherche le premier pas allumé et on l'allume
      for (unPixel = 0; unPixel < NUMPIXELS; unPixel++) {
        if (bandeDePixel.getPixelColor(unPixel) != vert) {
          bandeDePixel.setPixelColor(unPixel, vert); // allumé
          break;
        }
      }
    } else {
      // c'est qu'on descend
      // on cherche le premier allumé et on l'éteint
      for (unPixel = 0; unPixel < NUMPIXELS; unPixel++) {
        if (bandeDePixel.getPixelColor(unPixel) != noir) {
          bandeDePixel.setPixelColor(unPixel, noir); //éteint
          break;
        }
      }
    }
  }
  // on rend visible notre modif
  afficherPixels();
}


void mettreAuRepos()
{
  pixelsClignoGauche.clear();
  pixelsClignoDroit.clear();
  etat = REPOS;
  afficherPixels();
}


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

void setup() {
  Serial.begin(115200);
  pixelsClignoGauche.begin();
  pixelsClignoDroit.begin();
  noir = pixelsClignoGauche.Color(0, 0, 0);
  vert = pixelsClignoGauche.Color(80, 255, 0);
  mettreAuRepos();
}

void loop() {

  // on teste les boutons
  actualiserLesBoutons();

  // on prend une décision
  switch (etat) {
    case REPOS:
      if (boutonGauche.estEnfonce()) {
        chrono = millis();
        etapeSuivante(pixelsClignoGauche);
        etat = FINIR_CLIGNOTE_GAUCHE;
      }
      else if (boutonDroite.estEnfonce()) {
        chrono = millis();
        etapeSuivante(pixelsClignoDroit);
        etat = FINIR_CLIGNOTE_DROITE;
      }
      break;

    case FINIR_CLIGNOTE_GAUCHE:
      if (boutonGauche.vientDEtreRelache())
        if (millis() - chrono >= periodeClignotement) {
          if (etapeSuivante(pixelsClignoGauche)) mettreAuRepos;
          else chrono += periodeClignotement;
        }
        else if (boutonDroite.vientDEtreEnfonce()) {
          mettreAuRepos();
          chrono = millis();
          etapeSuivante(pixelsClignoDroit);
          etat = FINIR_CLIGNOTE_DROITE;
        }
      break;

    case FINIR_CLIGNOTE_DROITE:
      if (boutonDroite.estRelache())
        if (millis() - chrono >= periodeClignotement) {
          if (etapeSuivante(pixelsClignoDroit))mettreAuRepos;
          else chrono += periodeClignotement;
        }
        else if (boutonGauche.vientDEtreEnfonce()) {
          mettreAuRepos();
          chrono = millis();
          etapeSuivante(pixelsClignoGauche);
          etat = FINIR_CLIGNOTE_GAUCHE;
        }
      break;
  }
}


Pour l'instant, quand je lache le bouton, les leds s'éteignent toutes en meme temps.
J'aimerais que quand je lache le bouton,  les leds s'éteignent comme elles se sont allumées.(avec du dynamisme).
Dans le futur, j'aimerais ajouter au code, la fonction (frein), (marche arrière), (4 cligno warning) (dynamisme des cligno et des phares lors du verrouillage et deverouillage)...   mais ce sera dans un futur lointain a mon avis.

j'ai fait la modif FINIR_CLIGNO. Je pense que c'est bon, mais pour la fonction void etatpeSuivante() je comprend pas comment faire.