Projet Neopixel PC + HC-SR04 + Bouton

Bonjour à tous,

Donc voila mon petit projet avance tout doucement, Le but est assez simple ont contrôle 2 x 8 neopixel (ring) à l’aide de 3 boutons et 1 capteur ultrason.

3 Boutons pour 3 mode différent:

-Bouton 1 Mode 1 on active le mode chenillard 6 couleur défilent.

-Bouton 2 Mode 2 on affiche une seul couleur fixe.

-Bouton 3 Mode 3 on éteint.

-Capteur Ultrason (HC-SR04) affiche une couleur quand il détecte ma main à moins de 7cm.

-Afficheurs qui affiche dans quel mode on est.

Voici mon soucis, après plusieurs tentative sans succès je viens demander un peu d’aide,

Actuellement lorsque j’appuie sur le bouton 2 on allume les neopixel ici en l’occurance en jaune, ce que je voudrais c’est qu’à chaque appuie sur le bouton 2 ont change de couleur, facile à dire mes je n’ai pas réussi.

Merci d’avance

#include <Adafruit_NeoPixel.h>
#define PIN 6
#define nbLED 8
#ifdef __AVR__
#include<avr/power.h>
#endif
#include <LiquidCrystal.h> // on importe la bibliothèque

LiquidCrystal monEcran(12,11,5,4,3,2); // on crée l'objet écran

Adafruit_NeoPixel strip = Adafruit_NeoPixel(nbLED, PIN, NEO_GRB + NEO_KHZ800);

#define trigPin 10     //Trig 
#define echoPin 13     //Echo 

//Déclaration des Variables

// 1 = bouton 1
// 2 = bouton 2
// 3 = bouton 3
int idBouton = 3; // on stock dans idBouton l'identifiant du dernier bouton qui a été appuyé

// -1 eteint
//  0 rouge
//  1 vert
//  2 bleu
//  3 cyan
//  4 jaune
//  5 magenta
int idCouleurCourante = -1; // on stock dans idCouleurCourante l'identifiant de la couleur qu'il faut afficher

int bouton1 = 7;
int bouton2 = 8; 
int bouton3 = 9;
const int APPUI=0;
const int PAS_APPUI = 1;

//Variable Capteur Ultrason:
char pinTrig = 13;
char pinEcho = 10;
float distance;

//Initialisation du port série et des entrées sorties
void setup()
{
 //Capteur Ultrason:
 
  pinMode(pinTrig, OUTPUT);
  pinMode(pinEcho, INPUT);
  digitalWrite(pinTrig, HIGH); 
 
 //Bouton:
 
  pinMode(bouton1, INPUT);
  digitalWrite(bouton1, HIGH);
  pinMode(bouton2, INPUT);
  digitalWrite(bouton2, HIGH);
  pinMode(bouton3, INPUT);
  digitalWrite(bouton3, HIGH);
  
  //NEOPIXEL:
  
  strip.setBrightness(100);
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
  Serial.begin(9600);
}

//programme principal
void loop()
 {  
    menuPrinc();
    capteur();
    majIdBouton();
    majIdCouleur();
    uint32_t color = getCouleurCourante();
    colorWipe(color, 100);
    strip.show(); // je ne suis pas sur que cette ligne soit nécessaire
 }

void majIdBouton()
{
    //lecture de l'état du bouton et stockage dans etatBouton
    boolean etatBouton1 = digitalRead(bouton1);
    boolean etatBouton2 = digitalRead(bouton2);
    boolean etatBouton3 = digitalRead(bouton3);

      
    if(etatBouton1 == APPUI){
        idBouton = 1;
    }
    else if(etatBouton2 == APPUI){
      idBouton = 2;
    }                 
    else if(etatBouton3 == APPUI){
        idBouton = 3;
        screenAccueil();
    }
}

void majIdCouleur()
{

    if(idBouton == 1){ // si le dernier bouton appuyé est le 1 on poursuit la farandole
        idCouleurCourante = (idCouleurCourante + 1) % 6;
         chenillard();
    }
    else if(idBouton == 2){ // si le dernier bouton appuyé est le 2 on affiche jaune
        idCouleurCourante = 4;
        mode2();                        
    }
    else if(idBouton == 3){ // si le dernier bouton appuyé est le 3 on eteint
        idCouleurCourante = -1;                          
    }
    else if(idBouton == 7){ // si le dernier bouton appuyé est le 3 on eteint
        idCouleurCourante = 7; 
  }
}

uint32_t getCouleurCourante()
{
    if(idCouleurCourante == 0)
    {
        return strip.Color(250, 0, 0);
    }
    else if (idCouleurCourante  == 1)
    {
        return strip.Color(0, 250, 0);
    }
    else if (idCouleurCourante  == 2)
    {
        return strip.Color(0, 0, 250);
    }
    else if (idCouleurCourante  == 3)
    {
        return strip.Color(0, 250, 250);
    }
    else if (idCouleurCourante  == 4)
    {
        return strip.Color(250, 250, 0);
    }
    else if (idCouleurCourante  == 5)
    {
        return strip.Color(250, 0, 250);
    }
    else if (idCouleurCourante  == 7)
    {
        return strip.Color(250, 0, 250);
    }
    else if (idCouleurCourante  == 8)
    {
        return strip.Color(0, 100, 250);
    }
    else if (idCouleurCourante == -1)
    {
        return strip.Color(0, 0, 0);
    }
}
 
//FONCTION BOUTON 1
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<nbLED; i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);

  }
}

//Affichage lors de l'arrêt des NEOPIXEL
void screenAccueil(){
   //Gestion Ecran
  monEcran.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
  monEcran.clear(); // on efface l'écran
  monEcran.setCursor(4,1); //on passe à la ligne suivante
  monEcran.print("Bye Bye"); // on écrit Bonjour
  delay(5000);   
}

//Affichage Couleur Mode Bouton 2 
void mode2(){
  monEcran.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
  monEcran.clear(); // on efface l'écran
  monEcran.print("Mode Couleur"); // on écrit Bonjour
  monEcran.setCursor(0,1); //on passe à la ligne suivante
  monEcran.print("Jaune"); // on écrit Bonjour
}

//Affichage Principale & après l'arrêt des Led
void menuPrinc(){
  //Gestion Ecran
  monEcran.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
  monEcran.clear(); // on efface l'écran
  monEcran.print("Hello,"); // on écrit Bonjour
  monEcran.setCursor(2,1); //on passe à la ligne suivante
  monEcran.print("TitoGam3"); // on finit d'écrire

}

//Mode Bouton 1 Chenillard
void chenillard(){
        monEcran.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
          monEcran.clear(); // on efface l'écran
           monEcran.print("Mode 1"); // on écrit Bonjour
            monEcran.setCursor(0,1); //on passe à la ligne suivante
             monEcran.print("chenille"); // on finit d'écrire
}

void capteur()
{
  digitalWrite(pinTrig, LOW);        
  delayMicroseconds(10);
  digitalWrite(pinTrig, HIGH);
  delayMicroseconds(10);
  digitalWrite(pinTrig, LOW);

// Mesure de l'impulsion
  distance = pulseIn(pinEcho, HIGH) /58.0;
//Si inférieur à 7cm::
    if(distance < 7){
        idBouton = 7;
// Affiche La Valeur       
    monEcran.clear();
    monEcran.setCursor(0,0);
    monEcran.print("Distance: ");
    monEcran.setCursor(0,1);  
    monEcran.print(distance);
    monEcran.println(" cm");  
  delay(200);
  }
}

Tu définis un tableau dans lequel tu mets ta liste de couleurs et tu incrémentes un compteur à chaque appui sur le bouton. En prenant garde à ne pas dépasser le nombre de couleurs dans ton compteur, avec la fonction modulo, symbole pourcent %

J'ai fait un truc similaire récemment, ça donne ça :

Définition du tableau de couleurs (avec la bibli fastLEDs)

// Couleurs
#define N_COUL 8
CRGB couleur[] = { CRGB::Red, CRGB::Green, CRGB::Blue, CRGB::Turquoise,
                   CRGB::Magenta, CRGB::Orange, CRGB::Purple, CRGB::Violet
                 };

Dans mon code je choisis une couleur aléatoirement, mais tu peux utiliser un compteur :

compteur += 1;
compteur = compteur % N_COUL;
... utiliser la couleur couleur[compteur] ...