3 bandes led WS2812B et 9 boutons - compteur de points

Bonjour,

Je fais appel à vous car je ne trouve pas la solution à mon problème.

j'ai débuter il y a quelques longtemps et je viens toujours voir sur ce forum qui m'aide beaucoup.

Mon projet est de faire un compteur de points avec 3 bandes led et 9 boutons, 3 bouton par bande led et 56 leds par bande. 1 bouton ajoute "1" à une variable, 1 bouton soustrait "1" à cette même variable et le 3e remet à zéro. Tout fonctionne correctement sur une bande, mais là où ça se corse c'est que je veux ajouter 2 autres bande led avec les même fonctions sur une arduino mega et je n'y arrive pas.

J'ai lu beaucoup sur le multiple strip mais ça ne convient pas à ce que je veux faire, soit ma variable ne bouge pas, soit toutes les bandes led font la même chose en même temps.

Pouvez-vous m'aider ou me donner une piste de solution s.v.p.

Si vous pouviez joindre le code + le schéma afin que l'on puisse vous aider, merci.

Voici mon code

#include <Wire.h>
#include <FastLED.h>

#define LED_PIN 7
#define NUM_LEDS 28

#define BRIGHTNESS 250
#define LED_TYPE WS2812B
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];

byte VarManche = 0;
int boutonPlusManche = 4;
int boutonMoinsManche = 6;
int boutonZeroManche = 2;
int etatBoutonManche = 0;
int etatBoutonManche2 = 0;
int etatBoutonManche3 = 0;

void setup() {
// put your setup code here, to run once:
pinMode(boutonPlusManche, INPUT);
pinMode(boutonMoinsManche, INPUT);
pinMode(boutonZeroManche, INPUT);
pinMode(LED_PIN, OUTPUT);
Serial.begin(9600);
FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
FastLED.setBrightness( BRIGHTNESS );

}

void loop() {
// put your main code here, to run repeatedly:

etatBoutonManche = digitalRead(boutonPlusManche);
if (etatBoutonManche == HIGH){
VarManche = VarManche+1;
}
etatBoutonManche2 = digitalRead(boutonMoinsManche);
if (etatBoutonManche2 == HIGH){
VarManche = VarManche-1;
}
etatBoutonManche3 = digitalRead(boutonZeroManche);
if (etatBoutonManche3 == HIGH){
VarManche = VarManche=0;
}

if (VarManche == 0){

FastLED.clear();
for(int i = 0; i<=2; i++){
leds = CRGB(0, 0, 255);

  • }*
    for(int i = 3; i<=5; i++){
    _ leds = CRGB(0, 0, 255);_
    * }*
    for(int i = 6; i<=8; i++){
    _ leds = CRGB(0, 0, 255);
    * }
    for(int i = 9; i<=11; i++){
    leds = CRGB(0, 0, 255);
    }
    for(int i = 12; i<=14; i++){
    leds = CRGB(0, 0, 255);
    }
    for(int i = 15; i<=17; i++){
    leds = CRGB(0, 0, 255);
    }
    for(int i = 18; i<=20; i++){
    leds = CRGB(0, 0, 0);
    }
    for(int i = 21; i<=23; i++){
    leds = CRGB(0, 0, 0);
    }
    for(int i = 24; i<=26; i++){
    leds = CRGB(0, 0, 0);
    }
    FastLED.show();
    }
    if (VarManche == 1){
    FastLED.clear();
    for(int i = 0; i<=2; i++){
    leds = CRGB(0, 0, 255);
    }
    for(int i = 3; i<=5; i++){
    leds = CRGB(0, 0, 0);
    }
    for(int i = 6; i<=8; i++){
    leds = CRGB(0, 0, 0);
    }
    for(int i = 9; i<=11; i++){
    leds = CRGB(0, 0, 0);
    }
    for(int i = 12; i<=14; i++){
    leds = CRGB(0, 0, 0);
    }
    for(int i = 15; i<=17; i++){
    leds = CRGB(0, 0, 255);
    }
    for(int i = 18; i<=20; i++){
    leds = CRGB(0, 0, 0);
    }
    for(int i = 21; i<=22; i++){
    leds = CRGB(0, 0, 0);
    }
    for(int i = 23; i<=24; i++){
    leds = CRGB(0, 255, 0);
    }
    FastLED.show();
    }
    if (VarManche == 2){
    FastLED.clear();
    for(int i = 0; i<=2; i++){
    leds = CRGB(0, 0, 255);
    }
    for(int i = 3; i<=5; i++){
    leds = CRGB(0, 0, 0);
    }
    for(int i = 6; i<=8; i++){
    leds = CRGB(0, 0, 0);
    }
    for(int i = 9; i<=11; i++){
    leds = CRGB(0, 0, 0);
    }
    for(int i = 12; i<=14; i++){
    leds = CRGB(0, 0, 0);
    }
    for(int i = 15; i<=17; i++){
    leds = CRGB(0, 0, 255);
    }
    for(int i = 18; i<=20; i++){
    leds = CRGB(0, 0, 0);
    }
    for(int i = 21; i<=22; i++){
    leds = CRGB(255, 0, 0);
    }
    for(int i = 23; i<=24; i++){
    leds = CRGB(0, 0, 0);
    }
    FastLED.show();
    }
    if (VarManche == 3){
    FastLED.clear();
    for(int i = 0; i<=2; i++){
    leds = CRGB(0, 0, 0);
    }
    for(int i = 3; i<=5; i++){
    leds = CRGB(0, 0, 255);
    }
    for(int i = 6; i<=8; i++){
    leds = CRGB(0, 0, 255);
    }
    for(int i = 9; i<=11; i++){
    leds = CRGB(0, 0, 0);
    }
    for(int i = 12; i<=14; i++){
    leds = CRGB(0, 0, 255);
    }
    for(int i = 15; i<=17; i++){
    leds = CRGB(0, 0, 255);
    }
    for(int i = 18; i<=20; i++){
    leds = CRGB(0, 0, 255);
    }
    for(int i = 21; i<=22; i++){
    leds = CRGB(0, 0, 0);
    }
    for(int i = 23; i<=24; i++){
    leds = CRGB(0, 255, 0);
    }
    FastLED.show();
    }
    if (VarManche == 4){
    FastLED.clear();
    for(int i = 0; i<=2; i++){
    leds = CRGB(0, 0, 0);
    }
    for(int i = 3; i<=5; i++){
    leds = CRGB(0, 0, 255);
    }
    for(int i = 6; i<=8; i++){
    leds = CRGB(0, 0, 255);
    }
    for(int i = 9; i<=11; i++){
    leds = CRGB(0, 0, 0);
    }
    for(int i = 12; i<=14; i++){
    leds = CRGB(0, 0, 255);
    }
    for(int i = 15; i<=17; i++){
    leds = CRGB(0, 0, 255);
    }
    for(int i = 18; i<=20; i++){
    leds = CRGB(0, 0, 255);
    }
    for(int i = 21; i<=22; i++){
    leds = CRGB(255, 0, 0);
    }
    for(int i = 23; i<=24; i++){
    leds = CRGB(0, 0, 0);
    }
    FastLED.show();
    }
    if (VarManche == 5){
    FastLED.clear();
    for(int i = 0; i<=2; i++){
    leds = CRGB(0, 0, 255);
    }
    for(int i = 3; i<=5; i++){
    leds = CRGB(0, 0, 255);
    }
    for(int i = 6; i<=8; i++){
    leds = CRGB(0, 0, 0);
    }
    for(int i = 9; i<=11; i++){
    leds = CRGB(0, 0, 0);
    }
    for(int i = 12; i<=14; i++){
    leds = CRGB(0, 0, 255);
    }
    for(int i = 15; i<=17; i++){
    leds = CRGB(0, 0, 255);
    }
    for(int i = 18; i<=20; i++){
    leds = CRGB(0, 0, 255);
    }
    for(int i = 21; i<=22; i++){
    leds = CRGB(0, 0, 0);
    }
    for(int i = 23; i<=24; i++){
    leds = CRGB(0, 255, 0);
    }
    FastLED.show();
    }

    // DISPLAY DATA*

    Serial.println(VarManche);
    delay(300);
    }_

Votre code ne compile pas sinon je vois que vous déclarez 28 leds alors que votre bande fait 56 leds et dans votre code vous allez jusqu'à 24 ou 26 suivant la valeur de VarManche.

Tout fonctionne correctement sur une bande

Dans ce cas, serait t'il possible que vous puissiez poster le code qui fonctionne et qui compile.

je veux ajouter 2 autres bande led avec les même fonctions sur une arduino mega et je n'y arrive pas.

Pouvez vous aussi nous montrer le code qui doit faire fonctionner les 3 bandes leds qui compile mais qui ne donne pas le résultat voulu.

Et ces 3 bandes leds sont câblées comment?

je suppose que vous les gérer à part s'il vous faut gérer d'autres pins de commandes, vous pouvez aussi les relier les unes à la suite des autres.

Bonjour,

Je vous envoi mon code en fichier ainsi que mon branchement en image. J'ai oublié de vous mentionner qu'une de mes bande contient 28 leds et les 2 autres 56 leds. Lors de la première réponse, j'ai du racourcir mon code car il ne rentrait pas dans mon message, c'est possiblement pour cette raison qu'il ne compilait pas. Vous remarquerai que je n'ai pas fait les valeur au complet pour la variable "VarVisit" et "VarLocal". Je voulais voir si totu fonctionnait avant de continuer.

Merci pour votre aide

Compteur_de_points.ino (28.4 KB)

Quelques petits soucis dans le code mais ce qui empêche le fonctionnement attendu, est je crois, l'utilisation de la fonction FastLED.clear().

Vous déclarez plusieurs instances de -> FastLED.addLeds ... etc
mais lorsque vous utilisez FastLED.clear(), vous n'indiquer pas sur quelle bandes vous souhaitez agir et ça doit effacer l'intégralité des données de tous les tableaux.

J'ai été voir l'aide de la lib FastLed, on peut garder votre façon de faire mais dans ce cas, on ne va pas utiliser FastLED.clear() mais mettre nous même les données à 0.

  1. Supprimer toutes les lignes FastLED.clear()

  2. On va déclarer 3 procédures pour effacer les données des tableaux concernés:

void black_leds_Visit() {
    for (int i = 0; i <NUM_LEDS_Visit; i++) {
      leds_Visit[i] = CRGB::Black;
    }
}

void black_leds_Manche() {
    for (int i = 0; i <NUM_LEDS_Manche; i++) {
      leds_Manche[i] = CRGB::Black;
    }
}

void black_leds_Local() {
    for (int i = 0; i <NUM_LEDS_Local; i++) {
      leds_Local[i] = CRGB::Black;
    }
}
  1. Ajouter l'appel de ces nouvelles procédures ici:
  etatBoutonVisit = digitalRead(boutonPlusVisit);
  if (etatBoutonVisit == HIGH) {
    VarVisit = VarVisit + 1;
    VarVisit = constrain(VarVisit, 0, 1); // VarVisit dans votre code prend la valeur minimum à 0 
    black_leds_Visit();                   // et la valeur maximum à 1
  }
  etatBoutonVisit2 = digitalRead(boutonMoinsVisit);
  if (etatBoutonVisit2 == HIGH) {
    VarVisit = VarVisit - 1;
    VarVisit = constrain(VarVisit, 0, 1); // VarVisit dans votre code prend la valeur minimum à 0 
    black_leds_Visit();                   // et la valeur maximum à 1
  }
  etatBoutonVisit3 = digitalRead(boutonZeroVisit);
  if (etatBoutonVisit3 == HIGH) {
    VarVisit = 0; // A corriger, ici vous aviez écrit VarVisit = VarVisit = 0
    black_leds_Visit();
  }
  
  etatBoutonManche = digitalRead(boutonPlusManche);
  if (etatBoutonManche == HIGH) {
    VarManche = VarManche + 1;
    VarManche = constrain(VarManche, 0, 24); // VarManche dans votre code prend la valeur minimum à 0 
    black_leds_Manche();                     // et la valeur maximum à 24
  }
  etatBoutonManche2 = digitalRead(boutonMoinsManche);
  if (etatBoutonManche2 == HIGH) {
    VarManche = VarManche - 1;
    VarManche = constrain(VarManche, 0, 24); // VarManche dans votre code prend la valeur basse minimum à 0 
    black_leds_Manche();                     // et la valeur maximum à 24
  }
  etatBoutonManche3 = digitalRead(boutonZeroManche);
  if (etatBoutonManche3 == HIGH) {
    VarManche = 0; // A corriger, ici vous aviez écrit VarManche = VarManche = 0
    black_leds_Manche();
  }
  
  etatBoutonLocal = digitalRead(boutonPlusLocal);
  if (etatBoutonLocal == HIGH) {
    VarLocal = VarLocal + 1;
    VarLocal = constrain(VarLocal, 0, 1); // VarLocal dans votre code prend la valeur basse minimum à 0 
    black_leds_Local();                     // et la valeur maximum à 1
  }
  etatBoutonLocal2 = digitalRead(boutonMoinsLocal);
  if (etatBoutonLocal2 == HIGH) {
    VarLocal = VarLocal - 1;              // VarLocal dans votre code prend la valeur minimum à 0 
    VarLocal = constrain(VarLocal, 0, 1); // et la valeur maximum à 1
    black_leds_Local();
  }
  etatBoutonLocal3 = digitalRead(boutonZeroLocal);
  if (etatBoutonLocal3 == HIGH) {
    VarLocal = 0; // A corriger, ici vous aviez écrit VarLocal = VarLocal = 0
    black_leds_Local();
  }

Vous remarquerez ci dessus, l'utilisation de la fonction -> variable = constrain(variable, ValeurMin, ValeurMax) qui vous évitera de devoir gérer le dépassement des valeurs que vous aurez fixées, ainsi même si vous incrémentez indéfiniement la valeur de la variable, elle prendra au maximum la valeur définit par ValeurMax. Sinon quelques erreurs sont indiquées aussi.

Il ne vous reste plus qu'à tester et penser à modifier les valeurs Max de la fonction constrain si vous modifier votre code, le mieux est d'ajouter une constante, je vous laisse faire.

Merci!!! j'essais ça ce soir et je vous redonne des nouvelles

C'est exactement ça!!!!! c'est génial!! Merci énormément nico78. Je ne voudrais pas abuser mais serait-il possible d'ajouter une seul fois au démarrage, un genre de test de lumière sur chaque bande led? exemple :

for(int i=0;i<NUM_LEDS;i++){
leds[i-2].setRGB(0,0,0);
leds*.setRGB(0,255,255);*

  • FastLED.show();*
    est-ce je devrais le mettre au début ou plutôt le mettre lorsque la variable est a zéro?

Attention, lorsque i vaut 0, ton indice de tableau est négatif !

Le mieux est de le placer au début de la fonction loop()

  1. initialiser les valeurs des tableaux à 0
CRGB leds_Visit[NUM_LEDS_Visit];
CRGB leds_Manche[NUM_LEDS_Manche];
CRGB leds_Local[NUM_LEDS_Local];

// à remplacer par ceci:
CRGB leds_Visit[NUM_LEDS_Visit] = {0};
CRGB leds_Manche[NUM_LEDS_Manche] = {0};
CRGB leds_Local[NUM_LEDS_Local] = {0};
  1. Créer 3 procédures pour affecter des couleurs au choix pour les tableaux
    (les placer après la fonction void black_leds_Local() par exemple)
void set_color_leds_Visit(byte r, byte g, byte b) {
    for (int i = 0; i <NUM_LEDS_Visit; i++) {
      leds_Visit[i] = CRGB(r, g, b);                        
    }
}

void set_color_leds_Manche(byte r, byte g, byte b) {
    for (int i = 0; i <NUM_LEDS_Manche; i++) {
      leds_Visit[i] = CRGB(r, g, b);  
    }
}

void set_color_leds_Local(byte r, byte g, byte b) {
    for (int i = 0; i <NUM_LEDS_Local; i++) {
      leds_Visit[i] = CRGB(r, g, b);  
    }
}
  1. Un exemple de test en début de boucle
void loop() {
  static byte testAuDemarrage=0; //static signifie que la valeur de la variable est conservée
                                 // à l'intérieur de la boucle quelque soit le nombre de passage

  if (testAuDemarrage==0){
    testAuDemarrage=1;
    for (int i = 0; i < 4; i++) {
      set_color_leds_Visit(124, 255, 124); // la couleur que vous souhaitez
      FastLED.show();
      delay(500);
      black_leds_Visit();
      FastLED.show();
      delay(500);
    }
    for (int i = 0; i < 4; i++) {
      set_color_leds_Manche(124, 255, 0); // la couleur que vous souhaitez
      FastLED.show();
      delay(500);
      black_leds_Manche();
      FastLED.show();
      delay(500);
    }
    for (int i = 0; i < 4; i++) {
      set_color_leds_Local(0, 255, 124); // la couleur que vous souhaitez
      FastLED.show();
      delay(500);
      black_leds_Local();
      FastLED.show();
      delay(500);
    }
  }

// Le reste de votre code ...

Je n'ai pas regardé précisément mais il semble vous utilisez les bandes leds pour afficher des chiffres, il aurait été utile dans ce cas de travailler par segment. Mais l'essentiel est que votre code fonctionne et que vous puissiez le modifier à votre guise.

Merci pour votre aide, elle est très précieuse.

En ce qui concerne les bandes led pour afficher des chiffres, c'est exactement ce que je fais, j'étais plus à l'aise de cette façon que de la manière par segment. Je n'ai pas très bien compris cette partie de chiffre par segment, je crois que j'ai besoin d'une puce 74HC595, ou quelque chose du genre. Dans 95% des cas, ils utilisent des modules de temps de pour afficher l'heure, ce que je n'ai pas besoin. Si vous avez de la documentation ou site à me suggérer et qui convient à mon cas, je suis preneur.

Merci encore de votre aide