problème : Erreur de compilation pour la carte Arduino/Genuino Uno

bonjour à tous,
Comme indiqué dans le titre, j'ai un probleme avec l'arduino. Pour info, je l'utilise dans le cadre d'un projet scolaire (élévateur à sustentation magnétique), et je suis débutant dans la programmation.

Voici le code :

 int B1 = 0; // bouton 1
 int B2 = 1; // bouton 2
 int B3 = 2; // bouton 3

 int D1 = 3; // diode 1
 int D2 = 4; // diode 2
 int D3 = 5; // diode 3

 int R1 = A0; // recepteur 1
 int R2 = A1; // recepteur 2
 int R3 = A2; // recepteur 3

 int L1 = 6; // étage 1
 int L2 = 7; // étage 2
 int L3 = 8; // étage 3

void setup() {

 pinMode(B1,INPUT); // bouton 1 entrée
 pinMode(B2,INPUT); // bouton 2 entrée
 pinMode(B3,INPUT); // bouton 3 entrée
  
 pinMode(D1,OUTPUT); // générateur diode 1
 pinMode(D2,OUTPUT); // générateur diode 2
 pinMode(D3,OUTPUT); // générateur diode 3
 
 pinMode(R1,INPUT); // récépteur 1 entrée
 pinMode(R2,INPUT); // récépteur 2 entrée
 pinMode(R3,INPUT); // récépteur 3 entrée

 pinMode(L1,OUTPUT); // générateur étage 1
 pinMode(L2,OUTPUT); // générateur étage 2
 pinMode(L3,OUTPUT); // générateur étage 3

 Serial.begin(9600);
}

void loop() {
  digitalRead(B1);            // lecture B1 ouvert/fermé
  if (B1 == HIGH)             //si B1 fermé
  {
    while (B2 && B3 == LOW)   // tant que B2 et B3 sont ouvert
    {
      digitalWrite(D1,HIGH);  // D1 allumée
      analogRead(R1);         //lecture R1
      Serial.println(R1);
      if (R1 > 16)                //si R1 reçoit D1
      {
        digitalWrite(L1,HIGH); // L1 alimenté
      } 
    }
  }
}

et pour conclure, voici le message d'erreur :

In file included from C:\Users\robin\Downloads\arduino-1.8.5-windows\arduino-1.8.5\hardware\arduino\avr\cores\arduino/Arduino.h:32:0,
** from sketch\projet.ino.cpp:1:**
C:\Users\robin\Downloads\arduino-1.8.5-windows\arduino-1.8.5\hardware\arduino\avr\cores\arduino/binary.h:31:12: error: expected unqualified-id before numeric constant
#define B1 1
** ^**
G:\Projet\projet\projet.ino:1:6: note: in expansion of macro 'B1'
** int B1 = 0; // bouton 1**
** ^**
exit status 1
Erreur de compilation pour la carte Arduino/Genuino Uno

Si quelqu'un pouvait m'aider en me disant ou est mon erreur, je lui en serait très reconnaissant.

Merci d'avance pour le temps que vous pourrez consacrer à mon poste ! :smiley:

 digitalRead(B1);            // lecture B1 ouvert/fermé
  if (B1 == HIGH)             //si B1 fermé
 while (B2 && B3 == LOW)

aucune lecture du bouton
de plus tu mets le bouton B1 sur la pin 0
B1 doit être réservé pour une instruction que je ne connais pas
si tu mets BB1 ca passe

Bonsoir,

Indépendamment de possibles autres erreurs, "B1" est effectivement une macro réservée dans l'environnement Arduino. Evidemment ce n'est pas documenté...
C'est caché dans un fichier
C:\Programme\Arduino\hardware\arduino\avr\cores\arduino\binary.h
qui contient toute une série de macros commençant par "B"

#define B0 0
#define B00 0
...
#define B11111111 255

Qu'en font-ils ? Une conversion binaire sur 8 bits, à la mimime ?
Mystère et boule de gomme...

Un moyen relativement simple et efficace pour ne pas se faire piéger : évitez les variables entièrement en majuscules. Dans les canons du C, les macros sont entièrement en majuscules. Si vous mettez "b1" ça va passer.

Bonne bidouille

MicroQuettas

PS : plus utile, il y a aussi tous les registres, ports et bits des micros AVR... Pour la liste complète, voir la datasheet du micro, par ex. AVRMega 328P pour le Uno.

Un grand merci pour vos réponses !

Effectivement, en remplaçant "B1" par "b1", tout fonctionne (même si il reste à voir si le programme répond à nos attentes).

En revanche, infobarquee, je ne comprend pas lorsque tu dis "aucune lecture du bouton". Pourrais-tu m'expliquer si possible ? :confused:

ZzSigma:
En revanche, infobarquee, je ne comprend pas lorsque tu dis "aucune lecture du bouton". Pourrais-tu m'expliquer si possible ? :confused:

tu comprendras en faisant le montage et les tests :wink:

Sans reparler de la codification binaire qui a déjà été traitée dans les réponses précédentes
Il y a plusieurs confusions dans ton code

Quand tu définis

int B1 = 0; // bouton 1
 int B2 = 1; // bouton 2
 int B3 = 2; // bouton 3

Je suppose que B1 est le n° de pin à laquelle est relié le bouton 1
Idem pour B2 et B3
Les broches 0(Rx) et 1(Tx) sont utilisées pour la communication avec le moniteur série via l'instruction Serial.print()
Soit tu utilises d'autres broches, soit tu n'utilise pas la fonction Serial.print(), mais il serait dommage de se passer du moniteur série.

En passant et c'est juste une remarque personnelle, il vaut mieux utiliser des noms de variables plus explicites
par exemple

int PinBouton1 = 9; // bouton 1
 int PinBouton2 = 10; // bouton 2
 int PinBouton3 = 11; // bouton 3

Note : dans cet exemple il faut modifier le cablage

Mais les plus gros soucis sont ici

void loop() {
  digitalRead(B1);            // lecture B1 ouvert/fermé
  if (B1 == HIGH)             //si B1 fermé
  {
    while (B2 && B3 == LOW)   // tant que B2 et B3 sont ouvert

Tu fais une confusion entre l'identification d'une pin et son état

int PinBouton1 = 9

est l'identification de la pin reliée au bouton 1
digitalRead(PinBouton1) est l'état de la pin

ensuite

digitalRead(B1);            // lecture B1 ouvert/fermé

La fonction digitalRead() renvoi l'état d'une pin (LOW ou HIGH)
tu lis l'état de la pin reliée au bouton 1, mais tu ne récupère pas l'état du bouton
en général on écrirait plutôt

int etat_bouton1=digitalRead(PinBouton1)

ensuite si tu veut tester cet état

if(etat_bouton1==HIGH)

on teste l'état de la pin et pas son identification

Pour

while (B2 && B3 == LOW)

Tu as compris que l'on ne teste pas l'identification de la pin, mais son état
Pour connaitre l'état d'une pin, il faut le lire avec digitalRead()
De plus il faut tester indépendamment l'état de chaque pin

while((digitalRead(PinBouton2)==LOW) && (digitalRead(PinBouton3)==LOW))