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();
}
}
les "Bonnes Pratiques du Forum" , partie 'Quelques Outis', indiquent comment publier le code, après en avoir pris connaissance édites ton message initial .
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.
Actuellement tu as initialisé 200 LEDs en bleu.
Disons que tu veux avoir une vingtaine de LEDs blanches sur l'ensemble
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
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°.
Une fois que tu as parcouru tout le tableau, tu mets à jour l'affichage avec .show()
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.
tu quittes la fonction
Il suffit ensuite d'appeler dans loop() cette fonction au rythme qui te plait pour avoir l'effet souhaité.
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 ?
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?
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 ?
je m'aperçois que j'ai dit une énorme connerie.
Ton delay était exécuté une seul fois
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.