[Resolue] Debutant, probleme avec else if.

Bonjour a tous.

Mon projet, installer une matrice de 16x16 a l’arrière de mon vélo avec trois boutons pour tourner et arrêter, quand je n’appuie pas sur les boutons i y a une flèche qui indique que j’avance, quand j’appuie sur le bouton gauche pour tourner, une flèche gauche apparait, mème chose pour la droite et un pour arrêter.
Pour cela j’ai fusionner 2 programme que j’ai trouver sur le net et j’ai modifier le code et j’ai pris la fonction else if pour l’état des boutons, j’ai commencer par gauche, droite arrêt et avance, ce qui donne.
if bouton gauche tourner.
else if bouton droite pour tourner.
else if bouton arrêt pour arrêter.
else pour avancer.
Mon erreur se trouve avec le else seul, l’ide m’indique qu’il y a erreur que je ne peux résoudre, mon code n’est pas au complet, il me manque ce qui va apparaitre a l’arrêt.
Voici ce que dit l’ide j’ai fait un copier coller.

ttttttttt:74:3: error: expected unqualified-id before 'else'

   else if (etatdroite == HIGH) {    

   ^

ttttttttt:85:3: error: 'matrix' does not name a type

   matrix.fillScreen(0);

   ^

ttttttttt:86:3: error: 'matrix' does not name a type

   matrix.setCursor(x, 4);

   ^

ttttttttt:87:3: error: 'matrix' does not name a type

   matrix.print(F(">>>>>"));

   ^

In file included from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:28:0,

                 from sketch\ttttttttt.ino.cpp:1:

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h:38:74: error: expected unqualified-id before ')' token

 #define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))

                                                                          ^

C:\Users\paslui\Documents\Arduino\ttttttttt\ttttttttt.ino:87:16: note: in expansion of macro 'F'

   matrix.print(F(">>>>>"));

                ^

ttttttttt:92:3: error: expected unqualified-id before 'if'

   if(--b < -30) {

   ^

ttttttttt:100:3: error: expected unqualified-id before 'else'

   else if (etatarret == HIGH) {     

   ^

ttttttttt:106:3: error: expected unqualified-id before 'else'

   else

   ^

exit status 1
expected unqualified-id before 'else'

Et voici mon code.

// Déclencher l'allumage du paneau de LED à l'aide de 4 interrupteurs

#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#define PIN 8

// Initialisation des constantes :
const int gauche = 3;     // Numéro de la broche à laquelle est connecté le bouton poussoir gauche
const int droite = 2;     // Numéro de la broche à laquelle est connecté le bouton poussoir droite
const int arret = 4;     // Numéro de la broche à laquelle est connecté le bouton poussoir arret


// Déclaration des variables :
int etatgauche = 0;         // variable qui sera utilisée pour stocker l'état du bouton gauche
int etatdroite = 0;         // variable qui sera utilisée pour stocker l'état du bouton droite
int etatarret = 0;         // variable qui sera utilisée pour stocker l'état du bouton arret

// le code dans cette fonction est exécuté une fois au début

void setup() {  

      
  // indique que la broche bouton est une entrée :
  pinMode(gauche, INPUT);     
  pinMode(droite, INPUT); 
  pinMode(arret, INPUT);     
  }

// le code dans cette fonction est exécuté en boucle
void loop(){


  // lit l'état du bouton et stocke le résultat dans etatBouton
  
  etatgauche = digitalRead(gauche);
  etatdroite = digitalRead(droite);
  etatarret = digitalRead(arret);
  
// Si etatBouton1 est à 5V (HIGH) c'est que le bouton est appuyé
// ***** gauche

  if (etatgauche == HIGH) {   
  }
   Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(16, 16, PIN,
   NEO_MATRIX_BOTTOM    + NEO_MATRIX_RIGHT +
  NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
  NEO_GRB  + NEO_KHZ800);

const uint16_t colors[] = {
 matrix.Color(0, 255, 0) }; 

  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(5);
  matrix.setTextColor(colors[0]);
 
int a    = matrix.width();
int pass = 0;

  matrix.fillScreen(0);
  matrix.setCursor(a, 4);
  matrix.print(F("<<<<<"));
  if(--a < -30) {
    a = matrix.width();
  matrix.show();
  delay(50);
}
 } 

//***** droite

  else if (etatdroite == HIGH) {    
      }
 
 Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(16, 16, PIN,
  NEO_MATRIX_BOTTOM    + NEO_MATRIX_RIGHT +
  NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG,
  NEO_GRB            + NEO_KHZ800);
 
const uint16_t colors[] = {
matrix.Color(0, 255, 0)}; 

  matrix.fillScreen(0);
  matrix.setCursor(x, 4);
  matrix.print(F(">>>>>"));

int b    = matrix.width();
int pass = 0;
 
  if(--b < -30) {
    b = matrix.width();
  matrix.show();
  delay(30);
 }
 

//***** arret
  else if (etatarret == HIGH) {     
    digitalWrite(ledRouge, HIGH);  // on allume la LED jaune
    delay(500);                   // on laisse allumée la led jaune 1/2 seconde 
  }

 // ***** avance
  else
  {
    // sinon on allume avance

 // ***** avance
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(16, 16, PIN,
  NEO_MATRIX_BOTTOM    + NEO_MATRIX_RIGHT +
  NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG,
  NEO_GRB            + NEO_KHZ800);
 
const uint16_t colors[] = {
  matrix.Color(0, 255, 0)};
 
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(5);
  matrix.setTextColor(colors[0]);

int d    = matrix.width();
int pass = 0;
  matrix.fillScreen(0);
  matrix.setCursor(x, 4);
  matrix.print(F("<<<<<"));
  
  if(--d < -30) {
    d = matrix.width();
  matrix.show();
  delay(30);
  }
  }

Pourquoi j’ai cette erreur, quelqu;un peut-il m’aider.
Je vous en remercie d’avance.

Tu dois déclarer ta matrice une seule fois avant le setup. Ces lignes :

   Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(16, 16, PIN,
   NEO_MATRIX_BOTTOM    + NEO_MATRIX_RIGHT +
  NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
  NEO_GRB  + NEO_KHZ800);

Mets les dans le setup et enlève toutes les autres.

De plus, ici :

 else if (etatdroite == HIGH) {    
      }

L’accolade fermante doit se trouver après les lignes

  matrix.show();
  delay(30);
 }

Dans l’IDE, tu as une fonction pour corriger l’indentation des lignes (CTRL T) de manière automatique : ça permet de voir plus facilement les problèmes liés notamment aux paires d’accolades.

Je te l’ai corrigé :

// Déclencher l'allumage du panneau de LED à l'aide de 4 interrupteurs

#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#define PIN 8

// Initialisation des constantes :
const int gauche = 3;     // Numéro de la broche à laquelle est connecté le bouton poussoir gauche
const int droite = 2;     // Numéro de la broche à laquelle est connecté le bouton poussoir droite
const int arret = 4;     // Numéro de la broche à laquelle est connecté le bouton poussoir arret

// Déclaration des variables :
int etatgauche = 0;         // variable qui sera utilisée pour stocker l'état du bouton gauche
int etatdroite = 0;         // variable qui sera utilisée pour stocker l'état du bouton droite
int etatarret = 0;         // variable qui sera utilisée pour stocker l'état du bouton arret

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(16, 16, PIN,
                              NEO_MATRIX_BOTTOM    + NEO_MATRIX_RIGHT +
                              NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG,
                              NEO_GRB            + NEO_KHZ800);

// le code dans cette fonction est exécuté une fois au début

void setup() {
  // indique que la broche bouton est une entrée :
  pinMode(gauche, INPUT);
  pinMode(droite, INPUT);
  pinMode(arret, INPUT);
}

// le code dans cette fonction est exécuté en boucle
void loop() {
  // lit l'état du bouton et stocke le résultat dans etatBouton
  etatgauche = digitalRead(gauche);
  etatdroite = digitalRead(droite);
  etatarret = digitalRead(arret);

  // Si etatBouton1 est à 5V (HIGH) c'est que le bouton est appuyé
  // ***** gauche
  if (etatgauche == HIGH) {

    const uint16_t colors[] = { matrix.Color(0, 255, 0) };
    matrix.begin();
    matrix.setTextWrap(false);
    matrix.setBrightness(5);
    matrix.setTextColor(colors[0]);

    int a    = matrix.width();
    int pass = 0;

    matrix.fillScreen(0);
    matrix.setCursor(a, 4);
    matrix.print(F("<<<<<"));
    if (--a < -30) {
      a = matrix.width();
      matrix.show();
      delay(50);
    }
  }

  //***** droite
  else if (etatdroite == HIGH) {

    const uint16_t colors[] = { matrix.Color(0, 255, 0)};

    matrix.fillScreen(0);
    matrix.setCursor(x, 4);
    matrix.print(F(">>>>>"));

    int b    = matrix.width();
    int pass = 0;

    if (--b < -30) {
      b = matrix.width();
      matrix.show();
      delay(30);
    }
  }

  //***** arret
  else if (etatarret == HIGH) {
    digitalWrite(ledRouge, HIGH);  // on allume la LED jaune
    delay(500);                   // on laisse allumée la led jaune 1/2 seconde
  }

  // ***** avance
  else
  {
    // sinon on allume avance

    // ***** avance
    const uint16_t colors[] = { matrix.Color(0, 255, 0) };

    matrix.begin();
    matrix.setTextWrap(false);
    matrix.setBrightness(5);
    matrix.setTextColor(colors[0]);

    int d    = matrix.width();
    int pass = 0;
    matrix.fillScreen(0);
    matrix.setCursor(x, 4);
    matrix.print(F("llllll"));

    if (--d < -30) {
      d = matrix.width();
      matrix.show();
      delay(30);
    }
  }
}

Je ne sais pas si ça fonctionnera comme tu veux, mais ça ira mieux. Il faut cependant définir la variable ‘x’ qui apparait 2 fois et aussi ledRouge

Merci beaucoup, cela ma aider pour la compréhension du code et de mes erreurs mais j'ai du rajouter le code suivant:

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(16, 16, PIN, NEO_MATRIX_BOTTOM + NEO_MATRIX_RIGHT + NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG, NEO_GRB + NEO_KHZ800);

Car le curseur et le défilement ne sont pas pareil.

Maintenant pour ce qui est de l’arrêt, j'aimerais écrire sur ma matrice, stop sur la ligne du haut et arrêt sur la ligne du bas, sans le défilement.

matrix.fillScreen(0); matrix.setCursor(x, 0); matrix.print(F("STOP")); matrix.setCursor(x, 9); matrix.print(F("ARRET"));

Le problème est que le mot arrêt est trop long pour la matrice, y a t-il moyen de mettre les lettres moins grosse, pour que le mot puisse entrer en entier.

Je ne connais pas les bibliothèques mais je pense qu'elles ne permettent pas de choisir la taille des caractères. Par contre tu peux dessiner ton texte pixel par pixel...

J’ai téléverser le code dans mon sunfounder et rien se passe, aucune led allume, j’ai refait le code au plus simple, juste avec if et else et cela ne marche pas les leds reste éteint.
Voici le code simplifier:

#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#define PIN 8

// Initialisation des constantes :
const int gauche = 4;     // Numéro de la broche à laquelle est connecté le bouton poussoir gauche

// Déclaration des variables :
int etatgauche = 0;         // variable qui sera utilisée pour stocker l'état du bouton gauche

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(16, 16, PIN,
                            NEO_MATRIX_BOTTOM    + NEO_MATRIX_RIGHT +
                            NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG,
                            NEO_GRB            + NEO_KHZ800);

// le code dans cette fonction est exécuté une fois au début
const uint16_t colors[] = {
  matrix.Color(0, 255, 0)
};

void setup() {
  // indique que la broche bouton est une entrée :
  pinMode(gauche, INPUT);
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(5);
  matrix.setTextColor(colors[0]);
}

// le code dans cette fonction est exécuté en boucle
void loop() {
  // lit l'état du bouton et stocke le résultat dans etatBouton
  etatgauche = digitalRead(gauche);

  // Si etatBouton1 est à 5V (HIGH) c'est que le bouton est appuyé
  // ***** gauche
  if (etatgauche == HIGH) {

    int a    = matrix.width();
    int pass = 0;

    matrix.fillScreen(0);
    matrix.setCursor(a, 4);
    matrix.print(F("<<<<<"));
    if (--a < -30) {
      a = matrix.width();
      matrix.setTextColor(colors[pass]);
    }
    matrix.show();
    delay(50);
  }
  else {
    // ***** avance
    const uint16_t colors[] = { matrix.Color(0, 255, 0) };

    int b    = matrix.width();
    int pass = 0;

    matrix.fillScreen(0);
    matrix.setCursor(b, 4);
    matrix.print(F("LLLLL"));
    if (--b < -30) {
      b = matrix.width();
      matrix.setTextColor(colors[pass]);
    }
    matrix.show();
    delay(50);

  }
}

Et voici les deux codes original, le premier est celui du scrolling texte et l’autre celui des bouton:

#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
 
#define PIN 3
 
// MATRIX DECLARATION:
// Parameter 1 = width of NeoPixel matrix
// Parameter 2 = height of matrix
// Parameter 3 = pin number (most are valid)
// Parameter 4 = matrix layout flags, add together as needed:
//   NEO_MATRIX_TOP, NEO_MATRIX_BOTTOM, NEO_MATRIX_LEFT, NEO_MATRIX_RIGHT:
//     Position of the FIRST LED in the matrix; pick two, e.g.
//     NEO_MATRIX_TOP + NEO_MATRIX_LEFT for the top-left corner.
//   NEO_MATRIX_ROWS, NEO_MATRIX_COLUMNS: LEDs are arranged in horizontal
//     rows or in vertical columns, respectively; pick one or the other.
//   NEO_MATRIX_PROGRESSIVE, NEO_MATRIX_ZIGZAG: all rows/columns proceed
//     in the same order, or alternate lines reverse direction; pick one.
//   See example below for these values in action.
// Parameter 5 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
 
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(32, 8, PIN,
  NEO_MATRIX_BOTTOM    + NEO_MATRIX_RIGHT +
  NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
  NEO_GRB            + NEO_KHZ800);
 
const uint16_t colors[] = {
  matrix.Color(255, 0, 0), matrix.Color(0, 255, 0), matrix.Color(255, 255, 0),matrix.Color(0, 0, 255), matrix.Color(255, 0, 255), matrix.Color(0, 255, 255), matrix.Color(255, 255, 255)};
 
void setup() {
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(5);
  matrix.setTextColor(colors[0]);
}
 
int x    = matrix.width();
int pass = 0;
 
void loop() {
  matrix.fillScreen(0);
  matrix.setCursor(x, 0);
  matrix.print(F("Test"));
 
  if(--x < -30
  ) {
    x = matrix.width();
 
    if(++pass >= 8) pass = 0;
    matrix.setTextColor(colors[pass]);
  }
  matrix.show();
  delay(30);
}
++++++++++++++++++++++++++
++++++++++++++++++++++++++

/*

 Déclencher l'allumage de 3 LED à l'aide de 3 interrupteurs
 Apprentissage du binaire en observant le nombre de combinaisons possibles
 
 */

// Initialisation des constantes :
const int bouton1 = 4;     // Numéro de la broche à laquelle est connecté le bouton poussoir 1
const int bouton2 = 3;     // Numéro de la broche à laquelle est connecté le bouton poussoir 2
const int bouton3 = 2;     // Numéro de la broche à laquelle est connecté le bouton poussoir 3

const int ledVerte =  13;      // Numéro de la broche à laquelle est connectée la LED verte
const int ledJaune =  12;      // Numéro de la broche à laquelle est connectée la LED jaune
const int ledRouge =  11;      // Numéro de la broche à laquelle est connectée la LED rouge

// Déclaration des variables :
int etatBouton1 = 0;         // variable qui sera utilisée pour stocker l'état du bouton 1
int etatBouton2 = 0;         // variable qui sera utilisée pour stocker l'état du bouton 2
int etatBouton3 = 0;         // variable qui sera utilisée pour stocker l'état du bouton 3

// le code dans cette fonction est exécuté une fois au début
void setup() {
  // indique que la broche ledVerte, ledJaune et ledRouge sont des sorties :
  pinMode(ledVerte, OUTPUT);
  pinMode(ledJaune, OUTPUT);      
  pinMode(ledRouge, OUTPUT);        
  // indique que la broche bouton est une entrée :
  pinMode(bouton1, INPUT);     
  pinMode(bouton2, INPUT);     
  pinMode(bouton3, INPUT);     
}

// le code dans cette fonction est exécuté en boucle
void loop(){
  // lit l'état du bouton et stocke le résultat dans etatBouton
  etatBouton1 = digitalRead(bouton1);
  etatBouton2 = digitalRead(bouton2);
  etatBouton3 = digitalRead(bouton3);
  // Si etatBouton1 est à 5V (HIGH) c'est que le bouton est appuyé
  if (etatBouton1 == HIGH) {     
    digitalWrite(ledVerte, HIGH);   // on éteind la LED verte
    delay(500);                   // on laisse allumée la led jaune 1/2 seconde
  }
  else if (etatBouton2 == HIGH) {     
    digitalWrite(ledJaune, HIGH);  // on allume la LED jaune
    delay(500);                   // on laisse allumée la led jaune 1/2 seconde 
  }
  else if (etatBouton3 == HIGH) {     
    digitalWrite(ledRouge, HIGH);  // on allume la LED jaune
    delay(500);                   // on laisse allumée la led jaune 1/2 seconde 
  }
  else {
    // sinon on éteind les LED
    digitalWrite(ledVerte, LOW); 
    digitalWrite(ledJaune, LOW);
    digitalWrite(ledRouge, LOW);
  }
}

J’ai vérifier si les boutons marchais, j’ai connecter une led sur le fil qui va sur l’entrer pin 4 de l’arduino et quand j’appuie dessus la led allume.
Serait-il possible que mon boad (sunfounder), ne soit pas compatible.
Voici un lien vers des photos de mon montage et ma matrice.
https://www.flickr.com/gp/143797186@N04/7fKh3h

pierot: Serait-il possible que mon boad (sunfounder), ne soit pas compatible

Ça, c'est la question qu'on se pose avant de coder ça peut éviter de flinguer un équipement. Sunfounder c'est un site de vente en ligne il y a beaucoup de produits. Peut-être qu'un lien vers le produit serait plus pratique pour nous.

pierot: Voici un lien vers des photos de mon montage et ma matrice. https://www.flickr.com/gp/143797186@N04/7fKh3h

Ton flicker n'est pas public donc on ne voit rien.

Voici le liens mais la version que j'ai est antérieur, version 1.0, elle ne comprend pas la nouvelle configuration de broches (SCL, SDA, IOREF), un petit kit de débutant.

Dison 95% des codes que j'ai pris sur internet fonctionne bien avec. https://www.robotshop.com/ca/fr/microcontroleur-sunfounder-uno-usb-r3.html

Voici le liens pour les tutoriau. From Knowing To Utilizing V1.0 for Arduino

Tu dois commencer par faire un code le plus simple possible afin de vérifier que tu peux afficher un texte sur ta matrice. En effet, peut-être que les paramètres de ton constructeur ne sont pas bons.

Essaye avec :

#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#define PIN 8

// Initialisation des constantes :
const byte gauche = 4;     // Numéro de la broche à laquelle est connecté le bouton poussoir gauche

// Déclaration des variables :
byte etatgauche = 0;         // variable qui sera utilisée pour stocker l'état du bouton gauche

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(16, 16, PIN,
                            NEO_MATRIX_BOTTOM    + NEO_MATRIX_RIGHT +
                            NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG,
                            NEO_GRB            + NEO_KHZ800);

// le code dans cette fonction est exécuté une fois au début
const uint16_t colors[] = {
  matrix.Color(0, 255, 0)
};

void setup() {
  // indique que la broche bouton est une entrée :
  pinMode(gauche, INPUT);
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(5);
  matrix.setTextColor(colors[0]);

  matrix.fillScreen(0);
  matrix.setCursor(0, 4);
  matrix.print(F("<<<<<"));
  matrix.show();
}

// le code dans cette fonction est exécuté en boucle
void loop() {}

Quand tu auras réussi à afficher quelque chose, on passera au reste du code (il est … perfectible :)) )

Je peux afficher du texte, le faire défiler de gauche a droite ou le contraire, de bas en haut ou de haut en bas et positionner le curseur ou je le veux et le code des bouton fonctionne bien.

Je peux faire des animations, voici le liens et cela fonctionne aussi: https://www.brainy-bits.com/arduino-16x16-matrix-frame/

Je peux allumer une ou plusieurs leds la ou je veux, les couleurs sont correct, j'ai un cube de 4x4x4 et cela marche bien ainsi qu'un chenillard de 24 leds qui fonctionne.

Après plusieurs tentative j'ai décider de repartir a zéro et maintenant tout fonctionne. J'aimerais poser une dernière question avant de clore ce post.

J'ai vue sur le net comment allumer une led sur une matrice, (exemple, led numéro 55), mais je me souviens plus ou, la seul chose que je me rappel, c'est que sa ressemblais a ceci: bla, bla (45, 44,26), position, x,y,couleur mais de cette manière cela risque d’être long comme code pour écrire ou dessiner, si vous connaissez un site que donne des exemples cela m'aiderais beaucoup.