Aide sur Création code : 2 boutons + 2 bandes led strip de 3 LED RGB

Bonjour à tous,
Je suis novice dans l'arduino de façon général. J'arrive à me débrouiller avec tous ce que je trouve ici et là, sur la toile etc... mais là je ne trouve pas un bon exemple sur lequel partir.

Materiel :
arduino nano
2 bandes Ws2812 de 3 leds RGB
2 boutons poussoirs (2 bornes)

Je souhaiterai une aide pour un code qui me donnerai comme résultat, l'explication suivante
, l'explication est valable pour les 2 boutons mais j'explique pour 1 :.

(1 bouton - 1 strip led de 3 led uniquement en bleu)
pour 1 appui : allumé la 1ere led RGB en BLEU
pour 2 appui : allumé la seconde led RGB en BLEU
pour 3 appui : allumé la troisième led RGB en BLEU
pour 1 appui long : éteindre toutes les leds

(2nd bouton - 1 strip led de 3 leds uniquement en ROUGE)

merci d'avance pour l'aide que vous pourrez m'apporter.

Cordialement
Vincent

Bonjour,
Peut-être déjà lire ce tuto :

Puis voir comment gérer vos leds dans le cadre d'une machine à état.

A creuser dans cette direction peut-être.
Bonne journée.

oui c'est typiquement une définition de programme qui se prête bien à la programmation par machine à états et une bibliothèque de boutons va simplifier le développement

merci ça semble s'y préter en effet. cependant comme j'utilise des strip led et que je ne maitrise pas totalement le code et l'utilisation de librairies je vais pas m'en sortir.
merci quand même

c'est juste une question de pratique. Allez y lentement et ça va le faire.

Pour bien débuter avec l'arduino, un bon point de départ c'est de lire les tutos d'eskimon par exemple, et puis prenez le temps de faire un cours sur le C++ (openClassRoom en a un gratuit)


pour vous aider, en utilisant des bibliothèques pour se simplifier la vie

#include <FastLED.h>
#include <OneButton.h>

const int nbLeds = 3;
const byte bandeBleuePin = 7;
const byte bandeRougePin = 8;

const byte boutonBleuPin  = 2;
const byte boutonRougePin = 3;

CRGB ledsBleues[nbLeds];
CRGB ledsRouges[nbLeds];

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

void appuiBleu() {
  if (nbBleu < nbLeds) nbBleu++;
  for (int i = nbBleu; i < nbLeds; 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, nbLeds, CRGB::Black);
  FastLED.show();
}

void appuiRouge() {
  if (nbRouge < nbLeds) nbRouge++;
  for (int i = nbRouge; i < nbLeds; 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, nbLeds, CRGB::Black);
  FastLED.show();
}

void setup() {
  FastLED.addLeds<WS2812B, bandeBleuePin, GRB>(ledsBleues, nbLeds);
  FastLED.addLeds<WS2812B, bandeRougePin, GRB>(ledsRouges, nbLeds);
  boutonBleu.attachClick(appuiBleu);
  boutonRouge.attachClick(appuiRouge);
  boutonBleu.attachLongPressStart(appuiBleuLong);
  boutonRouge.attachLongPressStart(appuiRougeLong);
  Serial.begin(115200);
}

void loop() {
  boutonBleu.tick();
  boutonRouge.tick();
  // ici vous pouvez faire autre chose de non bloquant
}

merci je vais m'y atteler gentillement ... j'ai tendance à m'embrouiller rapidement :wink:

Lancez l’application sur le simulateur

Bonsoir, j'ai testé c'est super ça fonctionne au poil.
Merci

Amusez vous bien.
C’est pour compter quoi au fait ?

c'est pour compter les manches d'un match de drone soccer :wink:
encore merci

Cool !

bonsoir J-M-L,
J'ai essayé de faire progresser votre code ! j'y ai passé une bonne partie de l'après midi mais je craque... je voudrais rajouter une fonction avec un autre bouton et une autre bande led rgb de 80 leds.
par defaut sur bouton momentané On-On , le strip leds est allumé led full blanche,
lors de l'action et le maintien du switch , le strip leds passe en rouge, on relache ça repasse au blanc.
si vous pouvez m'aider je vous en serait reconnaissant merci

#include <FastLED.h>
#include <OneButton.h>

const int nbLeds = 3;
const int nbLeds1 = 80;
const byte bandeBleuePin = 7;
const byte bandeRougePin = 8;
const byte bandeLEDPin = 9;

const byte boutonBleuPin  = 2;
const byte boutonRougePin = 3;
const byte boutonLEDPin = 4;

CRGB ledsBleues[nbLeds];
CRGB ledsRouges[nbLeds];
CRGB ledsBlanches[nbLeds1];

OneButton boutonBleu(boutonBleuPin, true);
OneButton boutonRouge(boutonRougePin, true);
OneButton boutonLED(boutonLEDPin, true);

int nbBleu = 0;    // Nombre de leds bleues allumées
int nbRouge = 0;   // Nombre de leds rouges allumées
int nbblanche = 80;   // Nombre de leds blanches allumées

void appuiBleu() {
  if (nbBleu < nbLeds) nbBleu++;
  for (int i = nbBleu; i < nbLeds; 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, nbLeds, CRGB::Black);
  FastLED.show();
}

void appuiblancLong() {
  nbblanches = 0;
  fill_solid(ledsblanc, nbLeds, CRGB::255,0,0);
  FastLED.show();
}

void appuiRouge() {
  if (nbRouge < nbLeds) nbRouge++;
  for (int i = nbRouge; i < nbLeds; 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, nbLeds, CRGB::Black);
  FastLED.show();
}

void setup() {
  FastLED.addLeds<WS2812B, bandeBleuePin, GRB>(ledsBleues, nbLeds);
  FastLED.addLeds<WS2812B, bandeRougePin, GRB>(ledsRouges, nbLeds);
  FastLED.addLeds<WS2812B, bandeLEDPin, GRB>(ledsblanches, nbLeds1);
  boutonBleu.attachClick(appuiBleu);
  boutonRouge.attachClick(appuiRouge);
  boutonBleu.attachLongPressStart(appuiBleuLong);
  boutonRouge.attachLongPressStart(appuiRougeLong);
  boutonBlanc.attachLongPressStart(appuiblancLong);
  Serial.begin(115200);
}

void loop() {
  boutonBleu.tick();
  boutonRouge.tick();
  boutonBlanc.tick();
  // ici vous pouvez faire autre chose de non bloquant
}


Bonjour,
as tu essayé d'utiliser attachLongPressStop ?

tu as fais surement une faute de frappe dans l'instruction suivante, tu n'as pas d'erreur de compilation?
fill_solid(ledsblanc, nbLeds, CRGB::255,0,0);

au lieu de fill_solid(ledsBlanches, nbLeds, CRGB::255,0,0);

Tes noms de variables et de fonctions sont du coup pas des plus approprié.
peut être qu'un truc du genre ledsStrip et appuiStripLong relacheStrip serait plus parlant ou si cela correspond à une fonction particuliére pour toi?

bonsoir,
Je vais m'y recoller avec tes conseils merci beaucoup

bonsoir, alos je suis reparti de zéro avec un bon tuto de abrège (youtube) mais quand j'appui sur le bouton j'ai pas de rouge mais un semblant de qqchose enfin il se passe un truc

voici le code`, si vous pouviez m'aider ?

#include <FastLED.h>

// How many leds in your strip?
#define NUM_LEDS 3
#define DATA_PIN 7
#define BUTTON_PIN 3

// Define the array of leds
CRGB leds[NUM_LEDS];

void setup() {
  
    Serial.begin(9600);
    FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);  // GRB ordering is assumed
    pinMode(3, INPUT_PULLUP);
    FastLED.setBrightness(40);
 }

void loop() { 

    fill_solid(leds, NUM_LEDS, CRGB::White);
    FastLED.show();
 
   int valeurBouton = digitalRead(BUTTON_PIN);
   if (valeurBouton == LOW){
      fill_solid(leds, NUM_LEDS, CRGB::Red); {
   FastLED.show();
   }
   
}   
}

qu'est-ce qui n'allait pas avec le code du post 5 ???
pourquoi repartir de 0 avec des boutons qui vont rebondir, on ne sait pas comment vous les avez câblés, etc...

le post #5 est parfait !
je voulais juste rajouter une autre fonction pour mon projet

Faut étendre le code du post 5 alors si c’est le même projet

oui j'ai tenté mais comme je débute je me suis dis "essaie de comprendre" et part de zéro sur au moins la prochaine partie pensant qu'ensuite je pourrai l'ajouter à votre programme.

C’est bien d’explorer mais le code co dessus utilise la bibliothèque OneButton par exemple pour les boutons. Vous ne faites pas les digitalRead vous même