Intégration Scintillement sur une Bande Led allumée Fixe

Bonjour ,

Actuellement entrain d'essayer de Réaliser un code avec une bande Led ws2812b qui comportes 200Leds .

Mon programme est une boucle toujours Vrai afin d'allumer les Led en Blue .

Je souhaiterais créer un effet scintillent blanc aléatoire sur cette même bande Led , mais je ne sais pas comment procéder , après quelques recherches L'effet Random pourrais convenir mais je n'arrive pas a la mettre en application .

Avez-vous une idée ?

Merci d'avance pour votre aide , voici le code actuel .

#include <FastLED.h>

#define NUM_LEDS8 200

#define DATA_PIN8 8

#define BRIGHTNESS 160 //luminosité entre 0 et 255.

CRGB leds8[NUM_LEDS8];

void setup() {

  FastLED.addLeds<WS2812B, DATA_PIN8, BRG>(leds8, NUM_LEDS8).setCorrection(TypicalLEDStrip);

  pinMode(DATA_PIN8, OUTPUT); // la broche led (8) est initialisée en sortie BRANCHE 8

  FastLED.setBrightness(BRIGHTNESS);

  digitalWrite(DATA_PIN8, LOW); // Eteindre PIN 8

}
void loop() {

  for (int i = 0; i < 200; i++) {
    8[i] = CRGB::Blue;
    delay(0);
    FastLED.show();
  }

}

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

Bonjour @baptiste457

publié tel quel ton code aura peu de lecteurs

les "Bonnes Pratiques du Forum" , partie 'Quelques Outis', indiquent comment publier le code, après en avoir pris connaissance édites ton message initial .

Bonjour, comme l'indique @al1fch ton code tel quel, surtout sans indentation, ne motive pas trop à t'aider.

Le code que tu présente ne fait pas d'action simultanés puisque tu passe par une série de boucle "For" bloquante.

Je ne suis pas sûr de comprendre la phrase un Random aléatoire en blanc, qu'est-ce qui est aléatoire/random ?

Comme l'indique souvent @J-M-L les animations de LED, sont propices à utiliser une machine à état, qui n'utilisera pas une série de boucle bloquante.

Bonjour ,

J'ai reformuler ma demande afin de la rendre plus clair

Merci

Tu n'a toujours pas indenté ton code, comme l'a indiqué @al1fch

Pour commencer tu pourrais déjà tiré une de tes 200 LEDs au hasard.
Puis dans ta boucle "for" la faire passer du blanc au noir suivant son état précédent.
Grace à une variable global, tu pourrais tirer une autre LED au hasard au bout d'une dizaine de clignotement.

Bonjour ,

En effet veuillez m'excuser ce sont mes premiers pas sur la plateforme , je viens d'effectuer la modification .

Entendu pour vos préconisations je suis d'accord dans le raisonnement mais je ne sais pas comment je pourrais écrire ce code ...

Merci d'avance pour votre aide .

Actuellement tu as initialisé 200 LEDs en bleu.
Disons que tu veux avoir une vingtaine de LEDs blanches sur l'ensemble

  1. Tu fais une fonction qui rempli un tableau de 20 valeurs au hasard avec un nombre compris entre 0 et 199. Chaque case du tableau va donc contenir un n° de LED qui sera allumé en blanc
  2. Tu parcours le tableau, pour chaque case du tableau tu lis la valeur de la case tu allumes en blanc la LED dont tu viens de tirer le n°.
  3. Une fois que tu as parcouru tout le tableau, tu mets à jour l'affichage avec .show()
  4. Tu parcours de nouveau le tableau, pour chaque case du tableau tu lis la valeur de la case tu remets en bleu la LED dont tu viens de tirer le n°. Comme ça, le tableau des LEDs est prêt pour l'itération suivante.
  5. tu quittes la fonction

Il suffit ensuite d'appeler dans loop() cette fonction au rythme qui te plait pour avoir l'effet souhaité.

Tu ne sais pas écrire quoi exactement ?
Qu'à tu essayé de faire et quel est le comportement que tu as obtenu ?

Sans proposition de ta pars ou questions précises difficile de t'aider :worried:

Avez vous un exemple afin que je puisse mettre en pratique cette méthode ?

Merci

Malheureusement je n'est pas réaliser d'essais , je suis d'accord avec le raisonnement mais la mise en pratique ne met pas si évidente , avez vous un exemple de code sur lequel je pourrais me baser pour faire des essais ?

Merci

Comme ça non, mais rien qu'en commençant à taper "arduino random" google me propose "arduino random led light up"
et le premier lien est celui-ci

Mais je t'avoue que cela me choque que tu ne puisse rien me proposer et je pense que ce n'est pas forcément t'aider que de t'envoyer sur des exemples plus ou moins bon, aux quel tu risque de rien comprendre.
Je vais donc insisté quitte à paraitre un peu(beaucoup) lourd, qu'a tu essayé pour la mis en pratique, par exemple de la proposition de @fdufnews qui est très bien décrite?
A quel moment ou mot bloque tu ?
As tu essayé de tirer un nombre au hasard ?
Qu'as tu utilisé comme mot de recherche sur Google?

Pour faire simple et rapide essais d’insérer cette ligne dans ta boucle juste avant le FastLED.show.

if (random(100)<2){8[i] = CRGB::White;delay(1);}
ajuste la valeur de random100 et le délais en fonction du résultat souhaité.
++

le test sur Wokwi. ( le test utilise l'adressage des leds sans passer par "digitalWrite" mais le résultat est identique.)

Bonjour ,

Merci pour ta réponse en effet c'est exactement cela que je cherche , le seul problème étant que quand je met 200Leds cela provoque un effet de lenteur sur le random , les Led aléatoire blanches reste allumé trop longtemps .

#include <FastLED.h>

#define NUM_LEDS  200
#define LED_PIN   2

CRGB leds[NUM_LEDS];


void setup() {
  FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);
  FastLED.setBrightness(100);
}

void loop() {

  for (int i = 0; i < NUM_LEDS; i += 1) {
    leds[i] = CRGB::Blue;
    if (random(100) < 1) {
      leds[i] = CRGB::White;
      delay(1);
    }
    FastLED.show();

Voila ce que j'avais essayer de faire sous forme de pattern , sauf que plusieurs problèmes ce pose .

  • 1 le fait d'exécuter 1 un 1 les pattern provoque des pose pendant l'animation .
  • 2 Le code ne me parait pas pertinent écris comme cela
#include <FastLED.h>

FASTLED_USING_NAMESPACE


#define DATA_PIN    3
//#define CLK_PIN   4
#define LED_TYPE    WS2811
#define COLOR_ORDER GRB
#define NUM_LEDS    200
CRGB leds[NUM_LEDS];

#define BRIGHTNESS          96
#define FRAMES_PER_SECOND  120

void setup() {
  delay(3000); // 3 second delay for recovery

  // tell FastLED about the LED strip configuration
  FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
  //FastLED.addLeds<LED_TYPE,DATA_PIN,CLK_PIN,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);

  // set master brightness control
  FastLED.setBrightness(BRIGHTNESS);
}


// List of patterns to cycle through.  Each is defined as a separate function below.
typedef void (*SimplePatternList[])();
SimplePatternList gPatterns = { rainbow, rainbowWithGlitter };

uint8_t gCurrentPatternNumber = 0; // Index number of which pattern is current
uint8_t gHue = 0; // rotating "base color" used by many of the patterns

void loop()
{
  // Call the current pattern function once, updating the 'leds' array
  gPatterns[gCurrentPatternNumber]();

  // send the 'leds' array out to the actual LED strip
  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
  }
  EVERY_N_SECONDS( 1 ) {
    nextPattern();  // change patterns periodically
  }
}

#define ARRAY_SIZE(A) (sizeof(A) / sizeof((A)[0]))

void nextPattern()
{
  // add one to the current pattern number, and wrap around at the end
  gCurrentPatternNumber = (gCurrentPatternNumber + 1) % ARRAY_SIZE( gPatterns);
}

void rainbow()
{
  for  (int i = 0; i < 200; i++)
    leds[i] = CRGB::Blue;
  delay(10);

}

void rainbowWithGlitter()
{
  // built-in FastLED rainbow, plus some random sparkly glitter
  rainbow();
  addGlitter(80);
}

void addGlitter( fract8 chanceOfGlitter)
{
  if ( random8() < chanceOfGlitter) {
    leds[ random16(NUM_LEDS) ] += CRGB::White;
  }
}

Peut tu décrire ce que tu appel pose dans l'animation.

Ton code positionne progressivement (une LED toutes les 10 ms) les LED en bleu, sans les afficher. Donc tu met 2s à positionner tes LED bleu.
Puis tu positionne aléatoirement une LED blanche avec une 80 chance sur 256 d'être allumée.
Puis tu affiche toutes les LEDS dans la couleur que tu as positionné.

Je suppose que ce n'est pas trop ce que tu veux faire et donc que le delay(10) est un bout de code qui n'a plus d'utilité sans systématique show derrière.
Lorsque tu écris un algorithme, il est souvent utile d'écrire sur papier ce que tu veux faire et de dérouler virtuellement, pour comparer.

Sinon ton code me parait cohérent à première vue, je ne sais pas ce qu'en pense les autres?

En effet le DELAY ne sert a rien je l'es donc supprimé .

Je constate comme une pause dans l'exécution du programme pour la partie flash blanc comme si quelque chose s'exécutais juste avant et en boucle a chaque fois , cela provoque un effet non continue sur le random blanc je ne sais pas si tu vois ce que je veux dire ?

Pour la lenteur dans le test, déplace simplement le FastLED.show() en dehors de la boucle for, juste aprés "}" test mis à jour sur Wokwi.

je m'aperçois que j'ai dit une énorme connerie.
Ton delay était exécuté une seul fois :slight_smile:

Je vois ce que tu veux dire par contre je ne me l'explique pas.
Les choses qui expliquerais ton ralentissement est si les 200 leds[i] ou les fonctions random8 et random16 soit lente.

Après je ne connais pas assez bien cette librairie pour vraiment être pertinent.
Mais pourquoi faire EVERY_N_MILLISECONDS( 20 ) dans loop et pas dans setup?
de même pour FastLED.delay

A moins que la remarque de @sharav30000 résout ton problème, mais je n'ai pas compris pourquoi il parle d'une boucle for, avec le show.