Je souhaite utiliser 4 (voir plus) câbles sur différents pin. ex: D1,D2,D3,D4
et que ces quatre câbles arrive sur le data d'un strip LED.
Chaque cable aura un switch qui me permet de diffuser le signal comme je le souhaite.
Je voulais savoir si cela ne posera pas de pb a mon arduino nano ou si il faut prévoir un élément pour eviter la casse.
Si mon explication n'est pas assez claire. Precisez le moi
Si tu branches tes 4 sorties en court-circuit, il te faut prévoir des cartes Arduino de rechange en grande quantité. Chaque essai entrainera la destruction d'une carte
4 Animations distinctes choisie chacune par un bouton intercalé entre la sortie et le bandeau.
C'est pas ce qu'il y a de plus propre, surtout en cas d'appui sur 2 boutons en même temps.
Ce qui serai mieux, c'est de gérer 4 programmes d'animations avec des boutons mis sur des entrées de ta nano et de jouer ton animations sur une seul broche de sortie associée au ruban
Ce qui serai mieux, c'est de gérer 4 programmes d'animations avec des boutons mis sur des entrées de ta nano et de jouer ton animations sur une seul broche de sortie associée au ruban
L'idée des boutons me semble la meilleurs solutions. Il serait possible de branche 4 boutons et que chaque boutons active une couleur? (ex bouton1 : tout rouge. bouton2 : tout vert. bouton3 : vert et jaune etc etc)
Mes led scintille maintenant. Je n'arrive pas a saovir si ça viens de mon cablage, de mes soudures ou juste de mon code
Video du soucis
Et mon code
#include <FastLED.h>
#define LED_PIN 2
#define BUT_PIN 9
#define NUM_LEDS 118
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);
pinMode(LED_PIN, OUTPUT); //L1 est une broche de sortie
pinMode(BUT_PIN, INPUT); // BP est une broche d'entree
}
void loop() {
int test = digitalRead(BUT_PIN); // Lecture de l'entree BP et sockage du résultats dans test
if(test==LOW) // Si test est à l'état bas
{
digitalWrite(LED_PIN, HIGH); // Allumer L1
for (int i = 0; i <= 26; i++) {
leds[i] = CRGB ( 255,255,0);
}
for (int i = 26; i <= 40; i++) {
leds[i] = CRGB (0,128,0);
}
for (int i = 40; i <= 66; i++) {
leds[i] = CRGB ( 255,255,0);
}
for (int i = 66; i <= 92; i++) {
leds[i] = CRGB (0,128,0);
}
for (int i = 92; i <= 118; i++) {
leds[i] = CRGB ( 255,255,0);
}
FastLED.show();
}
else // Sinon
{
digitalWrite(LED_PIN, LOW); // Eteindre L1
for (int i = 0; i <= 118; i++) {
leds[i] = CRGB ( 0,0,255);
}
FastLED.show();
}
}
C'est un phénomène dit de "flickering", en gros tu rafraichis trop vite l'état de tes LEDs, d'où ce problème de scintillement.
Comme à chaque tour de loop(), tu lis le bouton et tu applique une consigne ça fait clignoter les LEDs.
Il te faudrait une variable en plus, dis communément un "flag" afin de mémoriser l'état précédent du bouton afin de traiter uniquement un changement d'état du bouton
Il faudrait que je la passe dans mon setup comme ceci?
#include <FastLED.h>
#define LED_PIN 2
#define BUT_PIN 9
#define NUM_LEDS 118
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);
pinMode(LED_PIN, OUTPUT); //L1 est une broche de sortie
pinMode(BUT_PIN, INPUT); // BP est une broche d'entree
int test = digitalRead(BUT_PIN); // Lecture de l'entree BP et sockage du résultats dans test
}
void loop() {
if(test==LOW) // Si test est à l'état bas
{
digitalWrite(LED_PIN, HIGH); // Allumer L1
for (int i = 0; i <= 26; i++) {
leds[i] = CRGB ( 255,255,0);
}
for (int i = 26; i <= 40; i++) {
leds[i] = CRGB (0,128,0);
}
for (int i = 40; i <= 66; i++) {
leds[i] = CRGB ( 255,255,0);
}
for (int i = 66; i <= 92; i++) {
leds[i] = CRGB (0,128,0);
}
for (int i = 92; i <= 118; i++) {
leds[i] = CRGB ( 255,255,0);
}
FastLED.show();
}
else // Sinon
{
digitalWrite(LED_PIN, LOW); // Eteindre L1
for (int i = 0; i <= 118; i++) {
leds[i] = CRGB ( 0,0,255);
}
FastLED.show();
}
}
on ne peut pas faire fonctionner un programme sans un peu d'analyse
un programme tourne comme ça :
je fais ça, puis ceci, puis cela, et je recommence
je fais ça, puis ceci, puis cela, et je recommence
je fais ça, puis ceci, puis cela, et je recommence
(ad lib en boucle)
dans le cas d'un petit programme, l'ordre de grandeur de la durée d'une boucle est le milliseconde, en d'autres termes, un programme fera "ça, puis ceci, puis cela, et je recommence" 1000 fois par seconde
si dans ton programme tu mets :
"je fais ça, puis si le bouton est appuyé j'envoie la commande pour mettre le strip au vert, et je recommence"
cela fera que si tu appuies sur le bouton pendant 1 seconde, le strip recevra 1000 fois la commande de se mettre au vert (et se demandera 999 fois ce que tu fiches)
il convient par conséquent de n'envoyer la commande qu'une fois, quand le bouton vient d'être appuyé. Pour faire cela il faut avoir en mémoire l'état du bouton dans la boucle précédente (soit 1ms avant, si tu as bien suivi)
pour avoir ceci en mémoire, il faut déclarer puis utiliser une variable, qui dans ce cas peut être booléenne, soit True si le bouton a été appuyé, False si il ne l'a pas été
quand dans ta boucle tu regardes si le bouton est appuyé, il faut distinguer les cas : 1) si oui, appuyé
on regarde comment le bouton était avant
a) si appuyé (bouton1 == true)
il n'y a rien de nouveau, on ne fait rien
b) si non appuyé (bouton1 == false)
il y a du nouveau, on envoie la commande correspondant à bouton1 appuyé
on n'oublie pas de mettre à jour la variable (bouton1 = true) 2) si non, pas appuyé
on regarde comment le bouton était avant
a) si non appuyé (bouton1 == false)
il n'y a rien de nouveau, on ne fait rien
b) si appuyé (bouton1 == true)
il n'y a du nouveau, mais on ne veut rien faire dans ce cas, donc on ne fait rien
on n'oublie pas de mettre à jour la variable (bouton1 = false)