afficher couleur LED (neopixel strip)

Bonjour,

Je recrée le jeu Mastermind en ligne sur Tinkercad (je précise car il n'y a pas toutes les bibliothèques disponibles par ex) et j'ai déjà bien progressé mais j'ai un problème pour renvoyer dans le moniteur la combinaison de couleur entrée sur les neopixel strips. Je vous mets en pj mon montage et mon code complet en dessous. J'ai quand même un retour dans le moniteur assez proche de ce que je voudrais avoir : j'obtiens la combinaison entrée mais elle s'affiche en continue (ex: rjvbrjvbrjvb) au lieu d'une seule fois.

Je mets aussi l'URL de mon projet tinkercad si ça peut vous aider à mieux comprendre.

Merci!

code

#include <Adafruit_NeoPixel.h>

int buttonPin1 = 10;
int buttonPin2 = 11;
int buttonPin3 = 12;
int buttonPin4 = 13;
int buttonPin[] = {buttonPin1,buttonPin2,buttonPin3,buttonPin4};

int counter1=0;
int counter2=0;
int counter3=0;
int counter4=0;
int counter[] = {counter1,counter2,counter3,counter4};


int buttonState1=0;
int buttonState2=0;
int buttonState3=0;
int buttonState4=0;
int buttonState[] = {buttonState1,buttonState2,buttonState3,buttonState4};


int lastbuttonState1=0;
int lastbuttonState2=0;
int lastbuttonState3=0;
int lastbuttonState4=0;
int lastbuttonState[] = {lastbuttonState1,lastbuttonState2,lastbuttonState3,lastbuttonState4};

int buttonbloqPin = 9;
int buttonbloqState = 0;
int lastbuttonbloqState = 0;
int counterbloq = 0;

char c1;
char c2;
char c3;
char c4;
char code_joueur[]= {c1,c2,c3,c4};

Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(10, 2);
Adafruit_NeoPixel strip2 = Adafruit_NeoPixel(10, 3);
Adafruit_NeoPixel strip3 = Adafruit_NeoPixel(10, 4);
Adafruit_NeoPixel strip4 = Adafruit_NeoPixel(10, 5);
Adafruit_NeoPixel strip[] = {strip1, strip2, strip3, strip4};


void setup() {
  Serial.begin(9600);
  for (int i=0; i <= 3; i++){
    pinMode(buttonPin[i], INPUT);
  }
  for (int j=0; j <=3; j++) {
    strip[j].begin();
    strip[j].show(); // Initialize all pixels to 'off'
  }
}


void loop() {
 
  buttonbloqState = digitalRead(buttonbloqPin);
  if (buttonbloqState != lastbuttonbloqState) {
    if (buttonbloqState == HIGH) {
      counterbloq++;
    }
    else{
      counterbloq =counterbloq;
    }
    lastbuttonbloqState = buttonbloqState;
  }

  for (int i=0; i <= 9; i++){
    
    if (counterbloq == i) { 
    
      for (int j=0; j <= 3; j++){
        uint32_t rose = strip[j].Color(255, 0, 255);
        uint32_t bleu = strip[j].Color(1, 102, 102);
        uint32_t vert = strip[j].Color(0, 255, 0);
        uint32_t jaune = strip[j].Color(255, 255, 0);
        
        buttonState[j] = digitalRead(buttonPin[j]);
        
        if (buttonState[j] != lastbuttonState[j]) {
          if (buttonState[j] == HIGH) {
            counter[j]++;
          }
          else{
            counter[j]=counter[j];
          }
          lastbuttonState[j] = buttonState[j];
        }
        
        if(counter[j]==0){
          strip[j].setPixelColor(i, 0, 0, 0);         //noir
          strip[j].show();
        }
        else if (counter[j]%4==1){
          strip[j].setPixelColor(i, rose);        //rose
          strip[j].show();
        }
        else if (counter[j]%4==2){
          strip[j].setPixelColor(i, bleu);        //bleu
          strip[j].show();
        }
        else if (counter[j]%4==3 ){
          strip[j].setPixelColor(i, vert);          //vert
          strip[j].show();
        }
        else if (counter[j]%4==0){
          strip[j].setPixelColor(i, jaune);       //jaune
          strip[j].show();
        }
        
        if (strip[j].getPixelColor(i) == rose) {
          code_joueur[j]='r';
        }
        else if (strip[j].getPixelColor(i) == bleu) {
          code_joueur[j]='b';
        }
        else if (strip[j].getPixelColor(i) == vert) {
          code_joueur[j]='v';
        }
        else if (strip[j].getPixelColor(i) == jaune) {
          code_joueur[j]='j';
        }
      }
    }
  }
  Serial.print(code_joueur);
}

Bonjour,

leabarlet:
j'obtiens la combinaison entrée mais elle s'affiche en continue (ex: rjvbrjvbrjvb) au lieu d'une seule fois.

C'est normal, tu as placé ton Serial.print() juste à la fin de loop() cette ligne de code s'exécute de manière inconditionnelle. Il faudrait conditionner sont exécution au fait que la combinaison a changé.

Dans ta boucle for, tu testes si un bouton a changé. Tu pourrais, par exemple, positionner un booléen à true lorsque c'est le cas et l'utiliser dans un test qui exécuterait ou pas le Serial.print()

ok j'ai compris, mais juste pour savoir dans ma variable code_joueur il y a bien seulement 1 fois les lettres ? (du type {'r','r','r','r'})

Je ne comprends pas le sens de ta question

Oui, tu n’as bien qu’une fois les lettres, à cause de la définition de ta variable :

char c1;
char c2;
char c3;
char c4;
char code_joueur[]= {c1,c2,c3,c4};

c1, c2, etc. ne peuvent contenir qu’une lettre.

Pour rendre l’affichage plus clair, tu devrais utiliser Serial.println() qui ajoute un retour à la ligne plutôt que Serial.print() qui ne le fait pas, comme ça ça t’afficherait :

rrrr
rrrr
rrrr...

plutôt que « rrrrrrrrrrrrrrr… »