Compilation error: expected unqualified-id before numeric constant

Bonjour à toutes et à tous,

Voilà, je débarque sur la planète Arduino avec mes gros sabots.

System:
Host: manjaro-201811 Kernel: 4.19.14-1-MANJARO x86_64 bits: 64
compiler: gcc v: 8.2.1 Desktop: Xfce 4.13.2git-UNKNOWN
Distro: Manjaro Linux

Arduino IDE (arduino) 1:1.8.8-1

Sur un Arduino Uno + 2 sondes + 1 relais opto 5V, j'ai réussi à faire fonctionner un programme pour piloter une pompe d'une installation solaire thermique.

Le programme était buggé, mais grâce à ce forum (merci encore à hbachetti), tout est rentré dans l'ordre :sunglasses:

Voir ci-joint le programme arduino-soleil.ino qui fonctionne :

Mais comme j'ai aussi un poêle à bois, j'ai pensé ajouter une troisième sonde "Bois" et un deuxième relais pour la pompe "Bois".

Alors, j'ai osé modifier le code pour dupliquer les lignes qui me semblaient utiles en ajoutant le suffixe "Bois", pensant qu'avec un peu de chance (celle du débutant), cela pouvait fonctionner.

Mais non, et j'en vois qui rigolent :slight_smile:

Et ci-joint également programme arduino-soleil-bois modifié :

Et voici les erreurs relevées par la fonction "Vérifier" :

sketch_jan19a:61:18: error: expected unqualified-id before numeric constant
 #define etatBois 2               // La pompe Bois fonctionne et le poêle chauffe
                  ^
/home/jp/Arduino/sketch_jan19a/sketch_jan19a.ino:88:5: note: in expansion of macro 'etatBois'
 int etatBois = etatInconnuBois;
     ^~~~~~~~
/home/jp/Arduino/sketch_jan19a/sketch_jan19a.ino: In function 'void setup()':
sketch_jan19a:60:25: error: lvalue required as left operand of assignment
 #define etatInconnuBois 1              // L'état est inconnu. C'est la valeur par défaut. C'est donc l'état au démarrage Bois
                         ^
/home/jp/Arduino/sketch_jan19a/sketch_jan19a.ino:179:14: note: in expansion of macro 'etatInconnuBois'
   etatBois = etatInconnuBois;
              ^~~~~~~~~~~~~~~
exit status 1
expected unqualified-id before numeric constant

Si une bonne âme pouvait m'aider à interpréter ce message d'erreur pour faire fonctionner ce programme, cela m'éviterait d'installer deux cartes Arduino Uno (une pour chaque pompe)

D'avance merci pour votre éventuelle aide, et désolé pour ce "topic" long :confused:

jp willm
http://willms.pagesperso-orange.fr/

arduino-soleil.ino (10.8 KB)

arduino-soleil-bois.ino (14.5 KB)

vous avez un

#define etatBois 2

et ensuite une variable qui s'appelle pareil dans

int etatBois = etatInconnuBois;

les #define sont syntaxiquement remplacés avant la compilation par le pré-processeur donc le compilateur quand il arrive au lieu de voirint etatBois = etatInconnuBois;il trouveint 2 = etatInconnuBois;puisque etatBois a été remplacé par sa définition

comme ont ne peut pas affecter à un entier (2 en l'occurence) le contenu d'une variable, le compilateur n'est pas content est vous dit[color=orange] error: lvalue required as left operand of assignment[/color] ce qui se traduit par (en gros) la partie gauche d'une affectation doit être une variable.

Donc pour corriger il faut que le #define ne s'appelle pas comme la variable et bien sûr utiliser le bon élément aux bons endroits

Bonjour J-M-L link,

Je vois en gros ce qui cloche et ai donc renommé

#define etatBois 2 en #define etatPoeleBois 2;

Le compilateur me répond à present :

/tmp/mozilla_jp0/arduino-soleil-bois-2/arduino-soleil-bois-2.ino: In function 'void loop()':
arduino-soleil-bois-2:259:10: error: the value of 'etatBois' is not usable in a constant expression
     case etatBois:         // ==> La pompe de circulation Bois est en route de façon NON prolongée
          ^~~~~~~~
/tmp/mozilla_jp0/arduino-soleil-bois-2/arduino-soleil-bois-2.ino:88:5: note: 'int etatBois' is not const
 int etatBois = etatInconnuBois;
     ^~~~~~~~
arduino-soleil-bois-2:259:10: error: the value of 'etatBois' is not usable in a constant expression
     case etatBois:         // ==> La pompe de circulation Bois est en route de façon NON prolongée
          ^~~~~~~~
/tmp/mozilla_jp0/arduino-soleil-bois-2/arduino-soleil-bois-2.ino:88:5: note: 'int etatBois' is not const
 int etatBois = etatInconnuBois;
     ^~~~~~~~
exit status 1
the value of 'etatBois' is not usable in a constant expression

Plus j'essaie de corriger et plus j'ai d'erreurs :confused:

C'est peut-être trop compliqué pour un débutant comme moi...

Merci en tout cas !

jp willm
http://willms.pagesperso-orange.fr/

Pour les erreurs sur les 'case', il te suffit de lire la doc du switch /case. Switch te permet de définir une variable que tu vas comparer à une suite de nombres chacun avec un case. Donc après 'case ' il faut un nombre ou une constante mais pas une variable. D'où l'erreur.

Pour les autres erreurs il faudrait connaître le reste du code...

comme je le disais plus haut

Donc pour corriger il faut que le #define ne s'appelle pas comme la variable et bien sûr utiliser le bon élément aux bons endroits

donc dans le switch, si vous avez changé le nom de la constante au lieu decase etatBois:il faudra sans doute mettrecase etatPoeleBois:

J-M-L:
comme je le disais plus haut
donc dans le switch, si vous avez changé le nom de la constante au lieu de

case etatBois:

il faudra sans doute mettre

case etatPoeleBois:

Je sentais bien que je nageais dans le switch (pas assez lu le p'tit gars) :confused:

Avec

case etatPoeleBois:

Ça va déjà beaucoup mieux et je n'ai plus de message d'erreur :sunglasses:

Bon, le moniteur série m'affiche bien les températures des trois capteurs (panneau solaire, ballon et poêle à bois). Toutefois, le relais de la pompeBois ne s'active pas.

J'ai déclaré ce relais

const int pinRelayPumpBois = A5;       // Commande du relais de pompe de circulation bois

Mais quelque chose me dit que cela ne suffit pas...

Ci-joint mon programme actuel :

jp willm

arduino-soleil-bois-1.ino (14.5 KB)

Bonjour,

Merci à J-M-L et à lesept sans lesquels je n'aurais pas pu progresser dans la résolution de mon problème !

En effet comme me l'a indiqué J-M-L :

"Donc pour corriger il faut que le #define ne s'appelle pas comme la variable et bien sûr utiliser le bon élément aux bons endroits"

Et ensuite lesept a eu raison de me suggérer de relire la doc sur les "switch", bien que je doive encore potasser ce sujet.

Les choses sont un peu plus claires dans ma tête et donc dans mon programme ci-joint :slight_smile:

Par contre, le relais du poêle à bois reste toujours inopérant.

Avez-vous une idée pourquoi ?

Non informaticien, je découvre seulement l'Arduino ; je me rends compte de la souplesse de sa programmation et des possibilités.

C'est comme il y a 15 ans quand j'ai essayé ma première distribution GNU/Linux, j'ai vu que c'est bien fait et cela m'a encouragé à persévérer.

jp willm
http://willms.pagesperso-orange.fr/

arduino-soleil-bois-1.ino (14.9 KB)

Salut

Un analogWrite sur A4 ou A5 génère un signal PWM, mais normalement avec 255, ça devrait coller.

Tu peux parfaitement utiliser la pin A4 & A5 en tant que pin digitale :

const int pinRelayPump = A4;       // Commande du relai de pompe de circulation
const int pinRelayPumpBois = A5;       // Commande du relai de pompe de circulation bois

  // Initialiser les autres broches comme broche de commande
  pinMode(pinRelayPump, OUTPUT);

  // Initialiser les autres broches comme broche de commande
  pinMode(pinRelayPumpBois, OUTPUT);

  digitalWrite(pinRelayPumpBois, LOW);
  digitalWrite(pinRelayPump, LOW);
  // etc.

Il y a bien une lecture de l'état :

  switch(etat) {

Mais pas de etatBois ?

@+

hbachetti:
Un analogWrite sur A4 ou A5 génère un signal PWM, mais normalement avec 255, ça devrait coller.

Tu peux parfaitement utiliser la pin A4 & A5 en tant que pin digitale :

const int pinRelayPump = A4;       // Commande du relai de pompe de circulation

const int pinRelayPumpBois = A5;       // Commande du relai de pompe de circulation bois

// Initialiser les autres broches comme broche de commande
 pinMode(pinRelayPump, OUTPUT);

// Initialiser les autres broches comme broche de commande
 pinMode(pinRelayPumpBois, OUTPUT);

digitalWrite(pinRelayPumpBois, LOW);
 digitalWrite(pinRelayPump, LOW);
 // etc.

Ok, mais le //etc. à la fin m'intrigue, et je ne vois pas encore par quoi continuer dans ce cas...

hbachetti:
Il y a bien une lecture de l'état :

  switch(etat) {

Mais pas de etatBois ?

Ah c'est vrai !

J'ai essayé d'en créer un :

  switch(etatBois) {

Et les deux relais fonctionnent à présent !

Cela faisait un moment que je cherchais pourquoi la pompe soleil était prise en compte mais pas l'autre.
Cela me paraît évident maintenant.

Voir fichier ci-joint

Voilà, il ne me reste qu'à trouver comment arrêter les deux pompes dès lors que la température du ballon => 65°C

Mais quelque chose me dit que c'est dans le void loop() que je dois créer une condition, ou alors ajouter un #define surchauffe ?

Merci beaucoup en attendant, car je sais à présent que je pourrai faire fonctionner ma petite installation à l'aide d'une seule carte Arduino :sunglasses:

jp willm
http://willms.pagesperso-orange.fr/

arduino-soleil-bois-2.ino (15.3 KB)

Oui, dans ta loop, tu mesures la température du ballon et tu la compares (if) avec ton seuil (65). Le seuil tu peux le déclarer avec un #define dans l'entête du programme, ça aidera à le retrouver plus facilement plus tard si tu veux faire des modifications du code, ou si tu veux le mettre à plusieurs endroits.

Hello,

lesept:
Oui, dans ta loop, tu mesures la température du ballon et tu la compares (if) avec ton seuil (65). Le seuil tu peux le déclarer avec un #define dans l'entête du programme, ça aidera à le retrouver plus facilement plus tard si tu veux faire des modifications du code, ou si tu veux le mettre à plusieurs endroits.

Ok, je vais essayer, ce sera un bon exercice.

Merci beaucoup,

jp willm
http://willms.pagesperso-orange.fr/

lesept:
Oui, dans ta loop, tu mesures la température du ballon et tu la compares (if) avec ton seuil (65). Le seuil tu peux le déclarer avec un #define dans l'entête du programme, ça aidera à le retrouver plus facilement plus tard si tu veux faire des modifications du code, ou si tu veux le mettre à plusieurs endroits.

Bon, j'ai réussi et j'en reviens pas !

Comme je suis un gros fainéant, je me suis inspiré de ce qui existait.

J'ai préféré ajouter un #define, je trouve cela plus élégant.

Et au culot, j'ai commandé l'arrêt des deux pompes par un même "case"

     switch(tempMaxBallon) {
      
      case etatArretSurchauffe:         // ==> La température dans le ballon est trop élevée
      // Vérifier si la pompe Bois doit être arrêtée
      if (tempBottom >= paramTempMax) {
        stopPump (); stopPumpBois(); 
        etat = etatArret;
        etatBois = etatArretBois;
     }
      break;

Je suis super content, car il y a trois jours je n'avais jamais parlé la langue Arduino :sunglasses:
Merci pour votre aide, sans laquelle je n'y serais jamais arrivé !

Ci-joint le fichier.ino

jp willm
http://willms.pagesperso-orange.fr/

arduino-soleil-bois-3.ino (16 KB)

Bravo !

Hello,

Comme je comprends un peu mieux, j'ai vu des tas de choses inutiles et incongrues dans le programme.

Alors j'ai fait un peu de ménage :slight_smile:

Voir fichier ci-joint.

jp willm
http://willms.pagesperso-orange.fr/

arduino-soleil-bois-13.ino (11.1 KB)