justement j'étais en train de comprendre le fonctionnement ...
OK
Explorez bien
j'ai repris votre sketch mais je ne vois pas ou mettre l'info que de base les leds sont blanche
fill_solid(ledsStrip, nbStrip, CRGB(248, 242, 242));
j'avance un peu je commence à comprendre mais je n'ai pas les subtilités encore
je pense ne plus être très loin du résultat attendu mais la je sèche
voici le code avec 3 boutons et les 10 Leds blanches qui sont allumées au départ.
à vous de gérer ce que vous voulez faire des LEDs blanches et du bouton blanc. Son appui court appelle la fonction appuiBlanc()
et un appui long appelle la fonction appuiBlancLong()
qui pour le moment ne font rien à part imprimer un message sur le moniteur série.
J'ai changé le nom de certaines constantes pour que ce soit plus lisible et mis le bouton blanc sur A4 parce que c'était plus joli, le fil ne traversait pas la Nano
à tester ici
#include <FastLED.h>
#include <OneButton.h>
const byte bandeBleuePin = 7;
const byte bandeRougePin = 8;
const byte bandeStripPin = 9;
const byte boutonBleuPin = 2;
const byte boutonRougePin = 3;
const byte boutonBlancPin = A4;
const int nbLedsScore = 3;
const int nbledBlanches = 10;
CRGB ledsBleues[nbLedsScore];
CRGB ledsRouges[nbLedsScore];
CRGB ledBlanches[nbledBlanches];
OneButton boutonBleu(boutonBleuPin, true);
OneButton boutonRouge(boutonRougePin, true);
OneButton boutonBlanc(boutonBlancPin, true);
int nbBleu = 0; // Nombre de leds bleues allumées
int nbRouge = 0; // Nombre de leds rouges allumées
int nbBlanc = 10; //nombre de led blanche/rouges alluméés
void appuiBleu() {
if (nbBleu < nbLedsScore) nbBleu++;
for (int i = nbBleu; i < nbLedsScore; i++) ledsBleues[i] = CRGB::Black;
if (nbBleu != 0)
for (int i = 0; i < nbBleu; i++) ledsBleues[i] = CRGB::Blue;
FastLED.show();
}
void appuiBleuLong() {
nbBleu = 0;
fill_solid(ledsBleues, nbLedsScore, CRGB::Black);
FastLED.show();
}
void appuiRouge() {
if (nbRouge < nbLedsScore) nbRouge++;
for (int i = nbRouge; i < nbLedsScore; i++) ledsRouges[i] = CRGB::Black;
if (nbRouge != 0)
for (int i = 0; i < nbRouge; i++) ledsRouges[i] = CRGB::Red;
FastLED.show();
}
void appuiRougeLong() {
nbRouge = 0;
fill_solid(ledsRouges, nbLedsScore, CRGB::Black);
FastLED.show();
}
void appuiBlanc() {
Serial.println("appui bouton blanc");
}
void appuiBlancLong() {
Serial.println("appui long bouton blanc");
}
void setup() {
FastLED.addLeds<WS2812B, bandeBleuePin, GRB>(ledsBleues, nbLedsScore);
FastLED.addLeds<WS2812B, bandeRougePin, GRB>(ledsRouges, nbLedsScore);
FastLED.addLeds<WS2812B, bandeStripPin, GRB>(ledBlanches, nbledBlanches);
boutonBleu.attachClick(appuiBleu);
boutonRouge.attachClick(appuiRouge);
boutonBlanc.attachClick(appuiBlanc);
boutonBleu.attachLongPressStart(appuiBleuLong);
boutonRouge.attachLongPressStart(appuiRougeLong);
boutonBlanc.attachLongPressStart(appuiBlancLong);
fill_solid(ledBlanches, nbledBlanches, CRGB::White);
FastLED.show();
Serial.begin(115200);
Serial.println("PRET");
}
void loop() {
boutonBleu.tick();
boutonRouge.tick();
boutonBlanc.tick();
// ici vous pouvez faire autre chose de non bloquant
}
Merci J-M-L,
Alors je souhaite après avoir cliquez sur le bouton blanc avoir des LED rouges à la place des 10 Leds blanches déjà allumées. J'ai modifié le code mais je ne comprend pas pourquoi ça ne fonctionne pas.
dans cet exemple
un appui long sur le bouton blanc alterne la couleur entre rouge et blanc
#include <FastLED.h>
#include <OneButton.h>
const byte bandeBleuePin = 7;
const byte bandeRougePin = 8;
const byte bandeStripPin = 9;
const byte boutonBleuPin = 2;
const byte boutonRougePin = 3;
const byte boutonBlancPin = A4;
const int nbLedsScore = 3;
const int nbledBlanches = 10;
CRGB ledsBleues[nbLedsScore];
CRGB ledsRouges[nbLedsScore];
CRGB ledBlanches[nbledBlanches];
OneButton boutonBleu(boutonBleuPin, true);
OneButton boutonRouge(boutonRougePin, true);
OneButton boutonBlanc(boutonBlancPin, true);
int nbBleu = 0; // Nombre de leds bleues allumées
int nbRouge = 0; // Nombre de leds rouges allumées
int nbBlanc = 0; //nombre de led blanche/rouges alluméés
void appuiBleu() {
if (nbBleu < nbLedsScore) nbBleu++;
for (int i = nbBleu; i < nbLedsScore; i++) ledsBleues[i] = CRGB::Black;
if (nbBleu != 0)
for (int i = 0; i < nbBleu; i++) ledsBleues[i] = CRGB::Blue;
FastLED.show();
}
void appuiBleuLong() {
nbBleu = 0;
fill_solid(ledsBleues, nbLedsScore, CRGB::Black);
FastLED.show();
}
void appuiRouge() {
if (nbRouge < nbLedsScore) nbRouge++;
for (int i = nbRouge; i < nbLedsScore; i++) ledsRouges[i] = CRGB::Black;
if (nbRouge != 0)
for (int i = 0; i < nbRouge; i++) ledsRouges[i] = CRGB::Red;
FastLED.show();
}
void appuiRougeLong() {
nbRouge = 0;
fill_solid(ledsRouges, nbLedsScore, CRGB::Black);
FastLED.show();
}
void appuiBlancLong() {
static bool jeSuisRouge = false;
if (jeSuisRouge) {
fill_solid(ledBlanches, nbledBlanches, CRGB::White);
} else {
fill_solid(ledBlanches, nbledBlanches, CRGB::Red);
}
jeSuisRouge = !jeSuisRouge;
FastLED.show();
}
void setup() {
FastLED.addLeds<WS2812B, bandeBleuePin, GRB>(ledsBleues, nbLedsScore);
FastLED.addLeds<WS2812B, bandeRougePin, GRB>(ledsRouges, nbLedsScore);
FastLED.addLeds<WS2812B, bandeStripPin, GRB>(ledBlanches, nbledBlanches);
boutonBleu.attachClick(appuiBleu);
boutonRouge.attachClick(appuiRouge);
boutonBleu.attachLongPressStart(appuiBleuLong);
boutonRouge.attachLongPressStart(appuiRougeLong);
boutonBlanc.attachLongPressStart(appuiBlancLong);
fill_solid(ledBlanches, nbledBlanches, CRGB::White);
FastLED.show();
Serial.begin(115200);
Serial.println("PRET");
}
void loop() {
boutonBleu.tick();
boutonRouge.tick();
boutonBlanc.tick();
// ici vous pouvez faire autre chose de non bloquant
}
ok j'étais loin du compte !
du coup il faut que je rajoute une condition car quand je relache le bouton tout doit redevenir blanc.
ok donc ce n'est pas un appui long qui doit déclencher mais juste le fait de tenir enfoncé ça allume puis au relâchement ça éteint ?
tenez jetez un oeil à cela
#include <FastLED.h>
#include <OneButton.h>
const byte bandeBleuePin = 7;
const byte bandeRougePin = 8;
const byte bandeStripPin = 9;
const byte boutonBleuPin = 2;
const byte boutonRougePin = 3;
const byte boutonBlancPin = A4;
const int nbLedsScore = 3;
const int nbledBlanches = 10;
CRGB ledsBleues[nbLedsScore];
CRGB ledsRouges[nbLedsScore];
CRGB ledBlanches[nbledBlanches];
OneButton boutonBleu(boutonBleuPin, true);
OneButton boutonRouge(boutonRougePin, true);
int nbBleu = 0; // Nombre de leds bleues allumées
int nbRouge = 0; // Nombre de leds rouges allumées
int nbBlanc = 0; //nombre de led blanche/rouges alluméés
void appuiBleu() {
if (nbBleu < nbLedsScore) nbBleu++;
for (int i = nbBleu; i < nbLedsScore; i++) ledsBleues[i] = CRGB::Black;
if (nbBleu != 0)
for (int i = 0; i < nbBleu; i++) ledsBleues[i] = CRGB::Blue;
FastLED.show();
}
void appuiBleuLong() {
nbBleu = 0;
fill_solid(ledsBleues, nbLedsScore, CRGB::Black);
FastLED.show();
}
void appuiRouge() {
if (nbRouge < nbLedsScore) nbRouge++;
for (int i = nbRouge; i < nbLedsScore; i++) ledsRouges[i] = CRGB::Black;
if (nbRouge != 0)
for (int i = 0; i < nbRouge; i++) ledsRouges[i] = CRGB::Red;
FastLED.show();
}
void appuiRougeLong() {
nbRouge = 0;
fill_solid(ledsRouges, nbLedsScore, CRGB::Black);
FastLED.show();
}
void testBoutonBlanc() {
static bool boutonAppuye = false;
if (digitalRead(boutonBlancPin) == LOW) { // bouton en appui
if (! boutonAppuye) { // changement d'état
boutonAppuye = true;
fill_solid(ledBlanches, nbledBlanches, CRGB::Red);
FastLED.show();
delay(20); // anti bounce du pauvre
}
} else { // bouton pas appuyé
if (boutonAppuye) { // c'est le relâchement
boutonAppuye = false;
fill_solid(ledBlanches, nbledBlanches, CRGB::White);
FastLED.show();
delay(20); // anti bounce du pauvre
}
}
}
void setup() {
pinMode(boutonBlancPin, INPUT_PULLUP);
FastLED.addLeds<WS2812B, bandeBleuePin, GRB>(ledsBleues, nbLedsScore);
FastLED.addLeds<WS2812B, bandeRougePin, GRB>(ledsRouges, nbLedsScore);
FastLED.addLeds<WS2812B, bandeStripPin, GRB>(ledBlanches, nbledBlanches);
boutonBleu.attachClick(appuiBleu);
boutonRouge.attachClick(appuiRouge);
boutonBleu.attachLongPressStart(appuiBleuLong);
boutonRouge.attachLongPressStart(appuiRougeLong);
fill_solid(ledBlanches, nbledBlanches, CRGB::White);
FastLED.show();
Serial.begin(115200);
Serial.println("PRET");
}
void loop() {
boutonBleu.tick();
boutonRouge.tick();
testBoutonBlanc();
// ici vous pouvez faire autre chose de non bloquant
}
Bonjour, super c'est exactement ce que je voulais obtenir TIP TOP
MERCI BEAUCOUP
De rien. Étudiez le code pour bien comprendre
Bonjour tout à fait mine de rien grâce a vous j'ai progressé.
J'ai téléversé le prog sur ma nano et avant l'ajout du bouton blanc tout fontionnait mais la il y a un hic sur les appui long bleu et rouge , la fonction ne s'exécute plus contrairement à ce que l'on a en ligne sur wokwi - plus d'extinction des leds
avez vous une idée ?
une vidéo avant la dernière MAJ
https://www.instagram.com/reel/ClLEZlZoxpo/?utm_source=ig_web_copy_link
Mettez plutôt une image exacte du câblage Et un dessin du circuit et des alimentations.
Je n’utilise pas Instagram et ne compte pas cliquer sur le lien.
j'arrive pas à lire c'est trop petit sur mon tel
un schéma électronique un peu plus standardisé serait plus simple
si les boutons sont déportés au bout de câbles assez longs, il est très possible que vous ayez des perturbations (le câble fait antenne) et que le pullup interne de l'arduino ne suffise pas.
➜ essayez en rajoutant un condensateur de 0.1 µF entre la pin du bouton et GND pour les perturbations (vous pouvez capter des effets de votre grosse alimentation de 10A et du bruit à 50/60 Hz)
➜ rajoutez un pullup plus fort (donc plus petite résistance) par exemple avec 10KΩ (vous pouvez conserver le pullup interne en parallèle)
➜ torsadez le câble qui va aux boutons (le Signal et le GND) s'il n'est pas blindé
Je viens de trouver , j'avais modifié les valeurs de onebutton.h pour le scoreboard !
j'ai remis les valeurs pas defaut et ça refonctionne. désolé
Bonjour J-M-L
j'ai une dernière question : a votre avis la luminosité des leds blanches est-elle au max par défaut ?
merci
vincent
Oui je ne crois qu’elle est a 255 avec fastLed par défaut. Mais vous pouvez la changer avec setBrightness() ou voir la valeur par défaut avec getBrightness()
A tester
PS : bien sûr ensuite ça dépend de votre alim et de sa capacité à fournir le courant - 60mA par LED pour être à fond en blanc
Bonjour JML
le réglement pour le lequel j'utilisais ce code à changer mais là c'est bien plus complexe serait-il possible d'avoir un coup de main ?
@ savoir dans le jeu, chaque arbitre à une télécommande avec le bouton BLanc de ce programme ( sketch.ino - Wokwi Arduino and ESP32 Simulator et donc interviens sur les 2 buts en même temps et la modification porte surtout sur les bandes LED
en gros j'ai 2 boutons blanc, 1 pour chaque but il y a un bandeau led (blanc par defaut et rouge quand on appui sur le bouton)
voici ce que je viens de lire ce matin pour les nouvelles règles
Pour les arbitres, il y aura 3 commandes pour gérer les buts :
1/ un appui d'au moins 2s (cela donne le temps de relâcher sans comptabiliser de but si l'arbitre s'est trompé) pour compter un but et verrouiller les 2 buts (rouge fixe),
2/un appui bref pour lancer le décompte des 3s (rouge clignotant) avant le réouverture des 2 buts (couleur blanc)
3/ un double appui bref pour attribuer une pénalité (rouge clignotant)