Go Down

Topic: Leds strip/Projet phares arrière. Problème code pour clignoteur (Read 1 time) previous topic - next topic

J-M-L

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

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Toinit

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

J-M-L

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
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Toinit

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

J-M-L

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)

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;
  }
}
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Toinit

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?

J-M-L

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 
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Toinit

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 ?

J-M-L

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
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous


J-M-L

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Toinit

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

J-M-L

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
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Toinit

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

J-M-L

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
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Go Up