Controller une bande LED avec plusieurs PIN
Bonjour à tous,
Je suis en train de concevoir une lampe alimentée d'une bande LED Neopixel qui offre 3 couleurs différentes (rouge, bleu et vert). L'utilisateur pourrait choisir l'une de ces 3 options en insérant la prise jack dans une des 3 entrées présentes sur la lampe. Je me suis alors dit que chacune de ces entrées devraient être reliée à 3 pin différents.
Mon code propose donc 3 conditions en fonction du branchement de la DATA : Si branché sur PIN 6 alors LED vertes, si branché sur PIN 5 alors LED rouges et si branché sur PIN 4 alors LED bleu.
Le problème est que quand je passe d'un PIN à l'autre, la couleur reste la même. C'est seulement quand je passe d'un PIN à l'autre et que je re-transfer le code que la lumière change.
Pourriez-vous me dire ce qui ne va pas dans mon code qui fait que la lumière ne change pas dès que je branche sur un autre PIN ?
Voici le code:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| #include <FastLED.h>
#define LED_PIN6 6 /*PIN qui lance la DATA*/
#define LED_PIN5 5 /*PIN qui lance la DATA*/
#define LED_PIN4 4 /*PIN qui lance la DATA*/
#define NUM_LEDS 144 /*Nombre de LED*/
#define BRIGHTNESS 50 /*Valeur entre 0 et 255*/
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812, LED_PIN6, GRB>(leds, NUM_LEDS);
FastLED.addLeds<WS2812, LED_PIN5, GRB>(leds, NUM_LEDS);
FastLED.addLeds<WS2812, LED_PIN4, GRB>(leds, NUM_LEDS);
pinMode( LED_PIN6, INPUT);
pinMode( LED_PIN5, INPUT);
pinMode( LED_PIN4, INPUT);
FastLED.setBrightness(BRIGHTNESS); /*Attribuer la luminosité aux LEDS*/
}
void loop() {
if (digitalRead (LED_PIN4) == LOW) { /*Si Le Pin 4 est connecté*/
for (int i=0 ; i<= 19; i++){
leds[i] = CRGB (0,0,255); /*Bleu*/
FastLED.show();
delay(300); } } /*Delais d'allumage entre chaque LED*/
else if (digitalRead (LED_PIN5) == LOW) { /*Si Le Pin 5 est connecté*/
for (int i=0 ; i<= 19; i++){
leds[i] = CRGB (255,0,0); /*Rouge*/
FastLED.show();
delay(300); } /*Delais d'allumage entre chaque LED*/
}
else if (digitalRead (LED_PIN6) == LOW) { /*Si Le Pin 6 est connecté*/
for (int i=0 ; i<= 19; i++){
leds[i] = CRGB (0,255,0); /*Vert*/
FastLED.show();
delay(300); } /*Delais d'allumage entre chaque LED*/
}
else { /*Si aucun Pin n'est connecté*/
for (int i=0 ; i<= 19; i++){ /*Boucle pour allumer d'une LEd à l'autre*/
leds[i] = CRGB (0,0,0); /*Pas de couleur*/
FastLED.show();
delay(0); } /*Delais d'allumage entre chaque LED*/
}
} |
FastLED.show ou FastLED chaud ?
Bonjour,
Déjà la pin data est la 7 sur le schéma mais n'est même pas déclarée dans le programme.
Si les 4 bandes sont vues comme une seule (elles présenteront donc 4 fois les mêmes couleurs), elles doivent n'être déclarées qu'une seule fois. Mais dans le programme elles figurent trois fois : je subodore une mauvaise compréhension des commandes des leds intelligentes. Chaque puce d'une bande pilote 3 leds RGB. Quand la première voit 3 octets arriver sur Data in, elle les décode et allume ses 3 leds en fonction des valeurs, puis laisse passer les octets suivants en Data out vers le Data in de la puce suivante... Il n'y a donc pas une bande à déclarer par composante couleur.
Attention à l'alimentation, ce n'est pas possible d'alimenter beaucoup de leds sur le seul 5V de la carte : 4*144*60 mA (pour du blanc au maxi) représente plus de 34,5 Ampères sous 5 V mais "seulement" le tiers pour une couleur rouge, verte ou bleue au maxi soit 11,5 A quand même.
Salutations