Auteur Sujet: Fastled et changement de couleur  (Lu 182 fois)

bryanbrown

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
Fastled et changement de couleur
« le: février 20, 2021, 05:00:13 pm »
Salut à tous,

Je suis nouveau dans la communauté ARDUINO.
Je code régulièrement en VBS :-X, mais pas en C ++, mais je me debrouille.

Je réalise une bande led avec des effets différents selon une entrée de l'Arduino.
Cependant, je bloque sur un effet très important (le principal !!!) :

https://www.tweaking4all.com/wp-content/uploads/2015/11/LEDEffect-RunningLights.mp4?_=16
Je voudrais cet effet, mais en deux couleurs, (exemple: 6px vert, 6px bleu, 2px noir, redémarrage)
les deux couleurs seront déterminées en fonction de l'entrée sur arduino.
exemple d'entrée 1 Rouge
entrée 2 Vert
entrée 3 Bleu

Mes premiers effets sont en FASTLED, j'ai testé celui ci avec Adafruit, NeoPixel et avec WS2812fx sans réussir.

En désespoir de cause et pour simplifié, j'ai essayé de faire changer la couleur du premier pixel en fonction d'un tableau.
Mais la bande reste désespérément fixe. le pixel reste rouge comme si Z n'évoluais pas (en changeant la valeur de départ de z, la couleur change).

#include "FastLED.h"
#define NUM_LEDS 191
#define DATA_PIN 3
CRGB leds[NUM_LEDS];

void setup() {
  FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);  // GRB ordering is typical
}

void loop() {
  int ttt[8][3] = {
    {255, 0, 0},
    {255, 0, 0},
    {0, 255, 0},
    {0, 255, 0},
    {0, 0, 255},
    {0, 0, 255},
    {0, 0, 0},
    {0, 0, 0}
  };
  int z;
  z = 0;
  for (int i = 0; 30; i++) {
    leds[1] = CRGB((ttt[z][0]), (ttt[z][1]), (ttt[z][2]));  //turn every third pixel on
    z = z + 1;
    if (z = 8) {
      z = 0;
    }
    FastLED.show();
    delay(100);
  }
}


Pouvez-vous m'aider?
Merci. ;)

Coyotte

  • Newbie
  • *
  • Messages: 18
    • Voir le profil
Re : Fastled et changement de couleur
« Réponse #1 le: février 22, 2021, 08:03:53 am »
Bonjour,

Dans ton test d'égalité de z avec 8 il manque un '=' :
if ( z == 8 )
Dans l'état actuel du code, tu assignes la valeur 8 à z et tu indices en dehors de ton tableau. ;)

Coyotte

bryanbrown

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
Re : Fastled et changement de couleur
« Réponse #2 le: février 22, 2021, 09:21:21 pm »
Super merci, c'était bien ca ;)

il me reste maintenant 3 problèmes:

1) mes deux tableaux ne réagissent pas de la même manière, j'ai tout essaye pour le tableau ttt mais les valeur ne sortes pas correctement (A ok).
2) à chaque avancement, les 9 premières led ne change pas de couleur,
3) j'essaye de déplacer le speeddelay pour ne pas avoir de saccade mais cela ne fonctionne pas.

voici la vidéo avec les deux tableaux (ttt puis A)



pouvez vous encore m'aider?
merci.

#include "FastLED.h"
#define NUM_LEDS 191
CRGB leds[NUM_LEDS];
#define PIN 3

void setup()
{
  FastLED.addLeds<WS2812B, PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
}

void loop() {
  theaterChase(60);
}

void theaterChase(int SpeedDelay) {
  int ttt[9][3] = {
    {255, 0, 0},
    {255, 0, 0},
    {255, 0, 0},
    {0, 255, 0},
    {0, 255, 0},
    {0, 255, 0},
    {0, 0, 0},
    {0, 0, 0},
    {0, 0, 0}
  };
  int *P;
  P = (int *)ttt;  /* conversion forcée */

  int A[10][4];
  A[1][1] = 255;
  A[1][2] = 0;
  A[1][3] = 0;

  A[2][1] = 255;
  A[2][2] = 0;
  A[2][3] = 0;

  A[3][1] = 255;
  A[3][2] = 0;
  A[3][3] = 0;

  A[4][1] = 0;
  A[4][2] = 255;
  A[4][3] = 0;

  A[5][1] = 0;
  A[5][2] = 255;
  A[5][3] = 0;

  A[6][1] = 0;
  A[6][2] = 255;
  A[6][3] = 0;

  A[7][1] = 0;
  A[7][2] = 0;
  A[7][3] = 0;

  A[8][1] = 0;
  A[8][2] = 0;
  A[8][3] = 0;

  A[9][1] = 0;
  A[9][2] = 0;
  A[9][3] = 0;

  int z;
  for (int q = 0; q < 10; q++) {
    z = 1;
    for (int i = 0; i < NUM_LEDS; i++) {
      //leds[i + q] = CRGB((A[z][1]), (A[z][2]),(A[z][3])); //turn every third pixel on
      leds[i + q] = CRGB((ttt[z][0]), (ttt[z][1]), (ttt[z][2])); //turn every third pixel on
      z = z + 1;
      if (z == 10) {
        z = 1;
      }
    }
    //}
    FastLED.show();
    delay(SpeedDelay);
    ;
  }
}
« Modifié: Aujourd'hui à 08:52:05 am par Thierry »

Coyotte

  • Newbie
  • *
  • Messages: 18
    • Voir le profil
Re : Fastled et changement de couleur
« Réponse #3 le: février 23, 2021, 10:04:24 am »
Bonjour,

Il y a quelques problèmes d'adressage du tableau ttt :
Ce tableau est déclaré avec une taille de 9x3 donc les indices vont de 0 à 8 et de 0 à 2.

 z prend les valeurs de 1 à 9 ce qui fait qu'à un moment, tu adresses des éléments hors du tableau (valeur indéfinie)...

D'autre part, lorsque tu incrémentes q dans la boucle principale
1) Tu n'adresses plus la première, puis la 2e, puis le 3e led...
2) Tu adresses des LEDs non déclarées (NUM_LEDS, NUM_LEDS+1, +2, ... )

Le point 1 détermine certainement pourquoi tes première LED ne sont pas modifiées. (Elle ne sont plus adressées au fur et à mesure que ta boucle progresse)

Coyotte

bryanbrown

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
Re : Fastled et changement de couleur
« Réponse #4 le: février 24, 2021, 09:41:17 pm »
un grand merci  ;D ;D ;D

Tu m'as super bien dépanner, ca fonctionne à merveille.
Voici mon code:
//Libraries
#include <FastLED.h>

//Constants
#define LED_PIN     3
#define COLOR_ORDER GRB
#define LED_TYPE WS2812B
#define NUM_LEDS 191
#define BRIGHTNESS  255
#define SATURATION  255
struct CRGB leds[NUM_LEDS];

void setup()
{
  LEDS.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalSMD5050);
  FastLED.setBrightness( BRIGHTNESS );
}

void loop() {
  theaterChase(130);
}

void theaterChase(int SpeedDelay) {
  int ttt[8][3] = {
    {255, 0, 0},
    {255, 0, 0},
    {255, 0, 0},
    {0, 0, 0},
    {0, 0, 255},
    {0, 0, 255},
    {0, 0, 255},
    {0, 0, 0}
  };

  int z;
  int ze;
  for (int q = 0; q < 9 ; q++) {
    //for (int q = 8; q > -1 ; q--) { //reverse
    z = 0;

    if (q > 0) {
      ze = 7;
      for (int x = q; x > -1 ; x--) {
        if (ze == -1) {
          ze = 7;
        }
        leds[x] = CRGB((ttt[ze][0]), (ttt[ze][1]), (ttt[ze][2]));
        ze--;
      }
    }

    for (int i = 1 ; i < NUM_LEDS - q; i++) {

      leds[i + q] = CRGB((ttt[z][0]), (ttt[z][1]), (ttt[z][2]));
      z++;
      if (z == 8) {
        z = 0;
      }
    }
    FastLED.show();
    delay(SpeedDelay);
  }
}

Il me reste pour faire quelque chose de propre, le déplacement du tableau ttt dans setup? mais je peux l'appeler dans la commande loop?
exemple
void loop() {
  theaterChase(130,ttt);
}

void theaterChase(int SpeedDelay,ttt) {

? merci.