Probleme programme led adressable

Bonjour je poste ce message dans le but de trouver réponse à mes questions par rapport a mon projet de stage en cours ( je suis encore amateur). Mon objectif sur cette carte arduino est de piloter une bande led adressable avec 4 boutons ON/OFF, le but étant de pouvoir changer la couleur de la bande via un changement d'état d'un bouton peu importe lequel. J'ai pour l'instant un début de code mais rien d'utilisable car les couleurs se mélangent au lieu de changer une par une, c'est donc pourquoi je cherche le moyen de rendre le dernier appuie de bouton prioritaire sur les autres et changer la bande de couleurs en fonction du dernier bouton ON/OFF utilisé en rappelant bien que peu importe le changement d'état du bouton (ON ou OFF) la couleur de la bande dois changer. J'ai utiliser la librairie adafruit_neopixel pour ce projet.

:warning: mise en forme par la modération pour cette fois.. Merci de lire "Les bonnes pratiques du Forum Francophone”

#include <Adafruit_NeoPixel.h>
int bouton1=9;
int bouton2=10;
int bouton3=11;
int bouton4=12;
int bouton5=13;
int etat0=0;
int etat1=0;
int etat2=0;
int etat3=0;
int etat4=0;
int etat5=0;

#define PIXEL_COUNT 7 
#define PIXEL_PIN 3
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800); 

void setup() {
  pinMode(bouton1,INPUT_PULLUP);
  pinMode(bouton2,INPUT_PULLUP);
strip.begin(); // Lance la connection
strip.show(); // Initialise toute les led à 'off'

strip.setBrightness(100);
}

/* Définition des couleurs */
int RED[3] = {255, 0, 0}; // Couleur Rouge
int GREEN[3] = {0, 255, 0}; // Couleur Verte
int CYAN[3] = {0, 255, 255}; // Couleur Cyan
int YELLOW[3] = {255, 125, 0}; // Couleur Jaune
int ORANGE[3] = {255, 40, 0}; // Couleur Orange
int PURPLE[3] = {255, 0 , 255}; // Couleur Violette
int PINK[3] = {255, 0, 100}; // Couleur Rose
int BLUE[3] = {0, 0, 255}; // Couleur Bleu
int WHITE[3] = {255, 255, 255}; // Couleur Blanche
int OFF[3] = {0, 0, 0}; // Éteint



void allLeds(int COLOR[])
{
for(int i = 0 ; i < PIXEL_COUNT ; i++)
{
strip.setPixelColor(i, COLOR[0], COLOR[1], COLOR[2]);
}
strip.show();
}

void loop() {
  
   etat1 = digitalRead(bouton1);
if (etat1 == HIGH ||etat1 == LOW ) {
  
  allLeds(RED);

}




etat2 = digitalRead(bouton2);

if (etat2 == HIGH || etat2 == LOW) {
  allLeds(GREEN);

  

}
}

Ton problème vient de ta condition de test.

Cette condition est toujours vraie puisque l'état ne peut prendre que les valeurs HIGH et LOW et que ta condition est soit l'une soit l'autre.

Il faut que tu te renseignes sur comment détecter un changement d'état d'un bouton.
Si tu utilises un bouton poussoir, il existe des bibliothèques qui te feront ça très simplement, par exemple celle de @bricoleau

Je n'utilise pas un bouton poussoir j'utilise un bouton a 2 états ON/OFF et je sais que la condition est toujours vrai c'est en même temps ce que je cherche et en même temps une erreur vue que c'est toujours vrai Ce que je cherche vraiment, comme tu l'a préciser c'est de trouver le moyen de capter ce changement d'état j'ai chercher dans les bibliothèque mais je n'ai pas trouver de fonction qui ce concentre sur un changement d'état pur a part bool actualiser(); mais je ne vois pas comment l'intégrer dans mon programme.

Regarde la bibliothèque simpleBouton et ses exemples. La méthode vientDEtreEnfonceOuRelache() me semble capter un changement d'état.

Si cette bibliothèque n'est pas adaptée aux interrupteurs (mais il faut tester pour le savoir), il te faut utiliser une variable qui stocke l'état précédent. La loop devient :

void loop() {

etat1 = digitalRead(bouton1);
if (etat1 != ancienEtat1 ) allLeds(RED);
ancienEtat1 = etat1;

// etc ...
}

Et tu définis une variable ancienEtat1 comme tu définis etat1.

Au passage, ton code peut être optimisé en utilisant des tableaux.

Au lieu de

int etat0=0;
int etat1=0;
int etat2=0;
int etat3=0;
int etat4=0;
int etat5=0;

tu peux faire

#define N 5  // 5 variables
int etat[N] = {0};

Pareil pour les pins des boutons
int bouton[N] = {9, 10, 11, 12, 13};

Tu peux ensuite faire des boucles for, par exemple pour les pinMode:
for (int i=0, i<N; i++) pinMode(bouton[i],INPUT_PULLUP);
Et aussi pour la surveillance de tes boutons dans la loop:

for (int i=0; i<N; i++) {
etat[i] = digitalRead(bouton[i]);
if (etat[i] != ancienEtat[i] ) allLeds(couleur[i]);
ancienEtat[i] = etat[i];
}

Il faudra alors définir un tableau de couleurs. Je connais mal la bibliothèque Adafruit_NeoPixel mais je pense que les couleurs sont codées sur des entiers en 32bits. Par exemple, une utilisation de la fonction que tu emploies est:
void setPixelColor(uint16_t n, uint32_t c);
et la couleur est 'c' codée en uint32_t (entier 32 bits non signé).

Donc tu peux définir un tableau de couleurs
uint32_t couleur[N] = { ... };
et y mettre les valeurs de tes couleurs

En utilisant un colorpicker, comme celui de Google tu peux connaitre les valeurs 32bits des couleurs
Exemple, tu places le point en haut à droite (sur le rouge) et tu obtiens : #ff0000 sous 'HEX'. Pour le vert, tu peux prendre #00ff00, etc
Il faut ensuite traduire ces valeurs en hexa compréhensible par arduino : pour ça tu changes le # en 0x

  • 0xff0000
  • 0x00ff00
  • etc

Ton tableau devient
uint32_t couleur[N] = { 0xff0000, 0x00ff00, 0x0000ff, etc... };
Là j'ai mis rouge, vert, bleu.

J'ai finalement réussi mon projet en utilisant la librairie switch qui était vraiment parfaite pour ce que je faisais. Merci beaucoup de ton aide j'ai compris pas mal de truc grâce a toi sur les boucles for, if etc... Voila le code fini pour ce que sa aiderais ou intéresserais .

#include <Adafruit_NeoPixel.h>
#include "Switch.h"
#define N 5
const byte button1pin=9;//Definition des pins des boutons
const byte button2pin=10;
const byte button3pin=11;
const byte button4pin=12;
const byte button5pin=13;

Switch button1 = Switch(button1pin,INPUT_PULLUP);//Intialisation des boutons
Switch button2 = Switch(button2pin,INPUT_PULLUP);
Switch button3 = Switch(button3pin,INPUT_PULLUP);
Switch button4 = Switch(button4pin,INPUT_PULLUP);
Switch button5 = Switch(button5pin,INPUT_PULLUP);



#define PIXEL_COUNT 7 // On définit le nombre de LED compris sur le Ruban de LED soit 150 pour le ruban de 5m50
#define PIXEL_PIN 3
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800); // Paramètre l'objet strip qui correspond à toute les LED du ruban

void setup() {
 

strip.begin(); // Lance la connection
strip.show(); // Initialise toute les led à 'off'
Serial.begin(9600);

strip.setBrightness(100);//Règle la luminosité


}
int RED[3] = {255, 0, 0}; // Couleur Rouge
int GREEN[3] = {0, 255, 0}; // Couleur Verte
 int CYAN[3] = {0, 255, 255}; // Couleur Cyan
int YELLOW[3] = {255, 125, 0}; // Couleur Jaune
int ORANGE[3] = {255, 40, 0}; // Couleur Orange
int PURPLE[3] = {255, 0 , 255}; // Couleur Violette
int PINK[3] = {255, 0, 100}; // Couleur Rose
int BLUE[3] = {0, 0, 255}; // Couleur Bleu
int WHITE[3] = {255, 255, 255}; // Couleur Blanche
int OFF[3] = {0, 0, 0}; // Éteint

void allLeds(int COLOR[])
{
for(int i = 0 ; i < PIXEL_COUNT ; i++)
{
strip.setPixelColor(i, COLOR[0], COLOR[1], COLOR[2]);
}
strip.show();
}

void loop() {
  button5.poll();//Sonde le bouton 5 pour y repérer un changement d'état
  if(button5.on()){//On vérifie que le bouton5 est sur on si oui on affiche la première banque de couleur sinon la deuxième
button1.poll();
if (button1.switched()) allLeds(RED);//si il y'a un changement d'état sur le bouton 1 alors toutes les leds en rouge
button2.poll();
if (button2.switched()) allLeds(GREEN);
button3.poll();
if (button3.switched()) allLeds(PURPLE);
button4.poll();
if (button4.switched()) allLeds(CYAN);
  }else {
    button1.poll();
if (button1.switched()) allLeds(PINK);
button2.poll();
if (button2.switched()) allLeds(YELLOW);
button3.poll();
if (button3.switched()) allLeds(WHITE);
button4.poll();
if (button4.switched()) allLeds(BLUE);
  }
}
1 Like

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.