Problème affichage Led, Projet FastLED et ruban WS2815

Bonjour à tous,
bon ce n'est pas la première fois que je viens ici pour un problème de code avec des rubans Led, mais comme je lance mes projets tout les deux ou trois ans et que je fais très peu de code entre temps j'oublie malheureusement le peu accumulé entre chaque expérience...
Pour faire simple mon projet et de piloter simplement un strip led avec une douzaine de boutons (type arcade).
A savoir : bouton enfoncé le ruban s'allume d'une couleur ou un pattern / bouton relâché le ruban s'éteint. + si deux boutons ensemble le mélange de couleur se fait (au moins des couleurs fixes)
Voilà où j'en suis : j'arrive à avoir mes différentes couleurs et mes effets sur chaque boutons mais il y a comme un léger clignotement et peu de puissance sur les couleurs fixes. Pour les effets il marche beaucoup moins bien quand je les contraints aux boutons (fonction if) que lorsque qu'il marche de façon autonome.
Et je ne comprend pas pourquoi mais quand j'ai par exemple le rouge et le vert en fixe dans mon code. Le vert va être stable et dés que j'ajoute une ligne après pour le bleu par exemple, le vert clignote... seule ma dernière couleur dans mon loop est stable...

Voici où j'en suis de mon code et j'avoue que malgré mes recherches je ne comprend pas bien où ça coince, comme souvent j'ai l'impression d'être proche de la vérité et qu'il ne me reste qu'un truc à modifier pour que tout fonctionne comme je le souhaite. Mais je sais aussi que ça se trouve je ne suis pas du tout parti dans la bonne direction et mes fonctions ne sont pas du tout les bonnes auquel cas je ne pourrais jamais faire ce que je souhaite, c'est pourquoi je viens vous demander votre aide.
Par avance merci j'espère ne pas trop être à coté de la plaque et pouvoir trouver une solution à mon projet.

Le code ci dessous :

#include <FastLED.h>
#include <FastLED_NeoPixel.h>
#define LED_PIN 2
#define DATA_PIN 2
#define NUM_LEDS 44
#define FRAMES_PER_SECOND 120
CRGB leds[NUM_LEDS];

FastLED_NeoPixel<NUM_LEDS, DATA_PIN, NEO_GRB> strip;

void setLEDs(int K, int N) {
  FastLED.clear();
  for (int i = 0; i < NUM_LEDS; i++) {
    if (i % N == K) leds[i].setRGB(255, 0, 255);  // set red LED
  }
  FastLED.show();
}


void setup() {
  delay(3000);

  FastLED.addLeds<WS2813, LED_PIN, RGB>(leds, NUM_LEDS);
  FastLED.setBrightness(255);

  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
  pinMode(11, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);
  pinMode(13, INPUT_PULLUP);
}

uint8_t gHue = 0;

void loop() {

  if (!digitalRead(3)) {
    fill_solid(leds, NUM_LEDS, CRGB(255, 0, 0));
    FastLED.show();
  }
  if (digitalRead(3)) {
    fill_solid(leds, NUM_LEDS, CRGB(0, 0, 0));
    FastLED.show();
  }


  if (!digitalRead(4)) {
    fill_solid(leds, NUM_LEDS, CRGB(0, 255, 0));
    FastLED.show();
  }
  if (digitalRead(4)) {
    fill_solid(leds, NUM_LEDS, CRGB(0, 0, 0));
    FastLED.show();
  }

  if (!digitalRead(5)) {
    fill_solid(leds, NUM_LEDS, CRGB(0, 0, 255));
    FastLED.show();
  }
  if (digitalRead(5)) {
    fill_solid(leds, NUM_LEDS, CRGB(0, 0, 0));
    FastLED.show();
  }
  if (!digitalRead(6)) {
    fill_solid(leds, NUM_LEDS, CRGB(255, 255, 255));
    FastLED.show();
    delay(50);
    fill_solid(leds, NUM_LEDS, CRGB(0, 0, 0));
    FastLED.show();
    delay(50);
  }
  if (!digitalRead(7)) {
    leds[0] = CRGB(0, 0, 255);
    FastLED.show();
    delay(250);
    leds[24] = CRGB(0, 0, 255);
    FastLED.show();
    delay(250);
    leds[42] = CRGB(0, 0, 255);
    FastLED.show();
    delay(250);
    leds[9] = CRGB(0, 0, 255);
    FastLED.show();
    delay(250);
    leds[38] = CRGB(0, 0, 255);
    FastLED.show();
    delay(250);
  }
  if (!digitalRead(8)) {
    int N = 4;
    for (int i = 0; i < N; i++) {
      setLEDs(i, N);
      delay(50);
    }


    FastLED.show();
  }
  if (!digitalRead(9)) {
    fill_rainbow(leds, NUM_LEDS, gHue, 7);
    addGlitter(80);
    FastLED.show();
    // insert a delay to keep the framerate modest
    FastLED.delay(1000 / FRAMES_PER_SECOND);

    // do some periodic updates
    EVERY_N_MILLISECONDS(20) {
      gHue++;
    }  // slowly cycle the "base color" through the rainbow
  }

  if (!digitalRead(10)) {
    fadeToBlackBy(leds, NUM_LEDS, 10);
    int pos = random16(NUM_LEDS);
    leds[pos] += CHSV(gHue + random8(64), 200, 255);

    FastLED.show();
    // insert a delay to keep the framerate modest
    FastLED.delay(1000 / FRAMES_PER_SECOND);

    // do some periodic updates
    EVERY_N_MILLISECONDS(20) {
      gHue++;
    }  // slowly cycle the "base color" through the rainbow
  }

  if (!digitalRead(11)) {
    fadeToBlackBy(leds, NUM_LEDS, 20);
    int pos = beatsin16(13, 0, NUM_LEDS - 1);
    leds[pos] += CHSV(gHue, 255, 192);

    FastLED.show();
    // insert a delay to keep the framerate modest
    FastLED.delay(1000 / FRAMES_PER_SECOND);

    // do some periodic updates
    EVERY_N_MILLISECONDS(20) {
      gHue++;
    }  // slowly cycle the "base color" through the rainbow
  }
}
void addGlitter(fract8 chanceOfGlitter) {
  if (random8() < chanceOfGlitter) {
    leds[random16(NUM_LEDS)] += CRGB(125, 125, 125);
  }
}

Merci et bonne soirée

Tu as un petit problème. Pour certains boutons tu allumes les LEDs d'une couleur et tu les éteints s'il est inactif.

Si on analyse le morceau de code ci-dessus.

Si on se met dans le cas où le bouton 3 est actif et le 4 inactif on a ça:

  • le bouton 3 est actif tu allumes les LEDs en rouge.
  • le bouton 4 est inactif tu éteints toutes les LEDs que tu avais allumées juste avant

Donc, lorsque tu allumes un pattern, tu l'éteints aussitôt ce qui explique pourquoi tes LEDs s'allument faiblement.

Ah oui effectivement. Je comprends mieux du coup il lit en même temps :

  if (!digitalRead(3)) {
    fill_solid(leds, NUM_LEDS, CRGB(255, 0, 0));
    FastLED.show();
  }

et

  if (digitalRead(4)) {
    fill_solid(leds, NUM_LEDS, CRGB(0, 0, 0));
    FastLED.show();
  }

Et donc allume et éteint en même temps les leds trés rapidement d'où le clignotement ?

Mais si j'enlève la ligne d'extinction les leds vont rester allumer quand je relâche non ? Je crois avoir essayer de supprimer :

  if (digitalRead(4)) {
    fill_solid(leds, NUM_LEDS, CRGB(0, 0, 0));
    FastLED.show();
  }

et pourtant j'avais quand même le scintillement ou le problème était autre mais en tout cas un truc n'allait pas.
Je n'ai pas de quoi essayer mais du coup dois je supprimer cette commande ?
Merci beaucoup en tout cas

Salut,
Bon j'ai pu réessayer aujourd'hui et effectivement j'ai trouvé la solution grâce à tes explications @fdufnews .
Il fallait prendre en compte les autres paramètres et pas uniquement celui sur lequel j'agissais dans chaque possibilités et combinaison.
Du coup je partage ma solution ici, si cela peut aider des gens.
Par ailleurs je suis preneur de solutions pour simplifier mon code si jamais car je penses que mon approche est sans doute un peu laborieuse.

Merci pour tout en tout cas.

Voici le code qui fonctionne comme désiré :

#include <FastLED.h>
#include <FastLED_NeoPixel.h>
#define LED_PIN 2
#define DATA_PIN 2
#define NUM_LEDS 44
#define FRAMES_PER_SECOND 120
CRGB leds[NUM_LEDS];

FastLED_NeoPixel<NUM_LEDS, DATA_PIN, NEO_GRB> strip;

void setLEDs(int K, int N) {
  FastLED.clear();
  for (int i = 0; i < NUM_LEDS; i++) {
    if (i % N == K) leds[i].setRGB(255, 0, 255);  // set red LED
  }
  FastLED.show();
}


void setup() {
  delay(3000);

  FastLED.addLeds<WS2813, LED_PIN, RGB>(leds, NUM_LEDS);
  FastLED.setBrightness(255);

  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
  pinMode(11, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);
  pinMode(13, INPUT_PULLUP);
}

uint8_t gHue = 0;

void loop() {

    if (digitalRead(3) and digitalRead(4) and digitalRead(5) and digitalRead(6) and digitalRead(7) and digitalRead(8) and digitalRead(9) and digitalRead(10) and digitalRead(11)) {
    fill_solid(leds, NUM_LEDS, CRGB(0, 0, 0));
    FastLED.show();
  }

  if (!digitalRead(3) and digitalRead(4) and digitalRead(5)) {
    fill_solid(leds, NUM_LEDS, CRGB(255, 0, 0));
    FastLED.show();
  }

  if (digitalRead(3) and !digitalRead(4) and digitalRead(5)) {
    fill_solid(leds, NUM_LEDS, CRGB(0, 255, 0));
    FastLED.show();
  }
 
  if (digitalRead(3) and digitalRead(4) and !digitalRead(5)) {
    fill_solid(leds, NUM_LEDS, CRGB(0, 0, 255));
    FastLED.show();
  }

 if (!digitalRead(3) and !digitalRead(4) and digitalRead(5)) {
    fill_solid(leds, NUM_LEDS, CRGB(255, 255, 0));
    FastLED.show();
  }

   if (!digitalRead(3) and digitalRead(4) and !digitalRead(5)) {
    fill_solid(leds, NUM_LEDS, CRGB(255, 0, 255));
    FastLED.show();
  }

     if (digitalRead(3) and !digitalRead(4) and !digitalRead(5)) {
    fill_solid(leds, NUM_LEDS, CRGB(0, 255, 255));
    FastLED.show();
  }

       if (!digitalRead(3) and !digitalRead(4) and !digitalRead(5)) {
    fill_solid(leds, NUM_LEDS, CRGB(255, 255, 255));
    FastLED.show();
  }

  if (!digitalRead(6)) {
    fill_solid(leds, NUM_LEDS, CRGB(90, 90, 90));
    FastLED.show();
    delay(50);
    fill_solid(leds, NUM_LEDS, CRGB(0, 0, 0));
    FastLED.show();
    delay(70);
  }
  if (!digitalRead(7)) {
    leds[0] = CRGB(0, 0, 255);
    FastLED.show();
    delay(250);
    leds[24] = CRGB(0, 0, 255);
    FastLED.show();
    delay(250);
    leds[42] = CRGB(0, 0, 255);
    FastLED.show();
    delay(250);
    leds[9] = CRGB(0, 0, 255);
    FastLED.show();
    delay(250);
    leds[38] = CRGB(0, 0, 255);
    FastLED.show();
    delay(250);
  }
  if (!digitalRead(8)) {
    int N = 4;
    for (int i = 0; i < N; i++) {
      setLEDs(i, N);
      delay(50);
    }


    FastLED.show();
  }
  if (!digitalRead(9)) {
    fill_rainbow(leds, NUM_LEDS, gHue, 7);
    addGlitter(80);
    FastLED.show();
    // insert a delay to keep the framerate modest
    FastLED.delay(1000 / FRAMES_PER_SECOND);

    // do some periodic updates
    EVERY_N_MILLISECONDS(20) {
      gHue++;
    }  // slowly cycle the "base color" through the rainbow
  }

  if (!digitalRead(10)) {
    fadeToBlackBy(leds, NUM_LEDS, 10);
    int pos = random16(NUM_LEDS);
    leds[pos] += CHSV(gHue + random8(64), 200, 255);

    FastLED.show();
    // insert a delay to keep the framerate modest
    FastLED.delay(1000 / FRAMES_PER_SECOND);

    // do some periodic updates
    EVERY_N_MILLISECONDS(20) {
      gHue++;
    }  // slowly cycle the "base color" through the rainbow
  }

  if (!digitalRead(11)) {
    fadeToBlackBy(leds, NUM_LEDS, 20);
    int pos = beatsin16(13, 0, NUM_LEDS - 1);
    leds[pos] += CHSV(gHue, 255, 192);

    FastLED.show();
    // insert a delay to keep the framerate modest
    FastLED.delay(1000 / FRAMES_PER_SECOND);

    // do some periodic updates
    EVERY_N_MILLISECONDS(20) {
      gHue++;
    }  // slowly cycle the "base color" through the rainbow
  }
}
void addGlitter(fract8 chanceOfGlitter) {
  if (random8() < chanceOfGlitter) {
    leds[random16(NUM_LEDS)] += CRGB(255, 255, 255);
  }
}

peut être remplacé par :

  for (int i = K; i < NUM_LEDS; i+=N) leds[i].setRGB(255, 0, 255);

mais c'est de l'ordre du détail.
Et ce n'est pas RED, c'est plutôt une sorte de violet.

Tu peux remplacer ta liste de pinMode par un tableau et une boucle for :

int pins[11] = {3,4,5,6,7,8,9,10,11,12,13};
for (int i=0; i<11; ++i) pinMode(i, INPUT_PULLUP);

merci c'est parfait.

J'ai une dernière question, comment puis je définir un certains nombre de LED et pas toute pour leurs appliquer des patterns ?

Je suppose que je dois remplacer par exemple ici NUM_LEDS par le nom de mon groupe de led mais comment je le définis ?

Merci beaucoup

C'est tout simple.
Si tu veux adresser les leds de 10 à 20, tu fais une boucle de 10 à 20 :

  for (int i = 10; i < 21; i++) {
    if (i % N == K) leds[i].setRGB(255, 0, 255);  // set red LED
  }

Si tu veux adresser les leds paires, tu fais ta boucle pour cela :

  for (int i = 0; i < NUM_LEDS; i+=2) {
    if (i % N == K) leds[i].setRGB(255, 0, 255);  // set red LED
  }

Ok merci effectivement c'est plutôt simple.
Mais si je veux une sélection de led qui ne se suivent pas ?
Par Exemple de 1à 10 de 15 à 19 de 31 à 37 et de 40 à 42 ?

Le plus simple est de les mettre dans un tableau et de faire le for sur les éléments du tableu.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.