Erreur compilation LCD [RESOLU]

Bonjour,
J'ai un petit souci de compilation concernant ma déclaration d'écran lcd 20,4

Voici mon code:

#include <FastIO.h>
#include <I2CIO.h>
#include <LCD.h>
#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal_I2C_ByVac.h>
#include <LiquidCrystal_SI2C.h>         // permet d'utiliser le module I2C afin de n'utiliser que 4 fils 
#include <LiquidCrystal_SR.h>
#include <LiquidCrystal_SR1W.h>
#include <LiquidCrystal_SR2W.h>
#include <LiquidCrystal_SR3W.h>
#include <SI2CIO.h>
#include <SoftI2CMaster.h>

#include <Wire.h>                     // permet de communiquer avec les composants utilisant le protocole I2C / TWI 

//      Déclaration des variables   ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int  etat_boutonB, etat_boutonR;
const int pinBoutonB =2;
const int pinBoutonR = 3;
const int pinLed = 4;
int jeu = 0;

//      Déclaration des pins        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

LiquidCrystal_I2C lcd(0x27, 20, 4);


//      Void Menu                   ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void menu() {
    // CHOIX JEU
    Serial.begin(9600); 
    pinMode(pinBoutonB, INPUT); //On indique à l’Arduino le mode du pin (entrée)
    pinMode(pinBoutonR, INPUT); //On indique à l’Arduino le mode du pin (entrée)
    lcd.clear();
    lcd.setCursor(6, 0 );
    lcd.print("MENU");
    delay (1500);
    lcd.clear(); 
    //Serial.println("menu");
    while (1) 
    { 
        lcd.setCursor(0, 0 );lcd.print("(B)-Parcours");
        lcd.setCursor(0, 1 );lcd.print("(R)-Distance");
        etat_boutonB = digitalRead(pinBoutonB);
        etat_boutonR = digitalRead(pinBoutonR);
        
        if (etat_boutonB == HIGH ) 
        {
            //Serial.print("BP_B = ");Serial.print(etat_boutonB);Serial.print(" pour choix checkpoint ");Serial.print("x = ");Serial.println(x);
            etat_boutonB=LOW;
            delay(300);
            jeu = 1;
        }
        if (etat_boutonR == HIGH ) 
        {
            //Serial.print("BP_R = ");Serial.print(etat_boutonR);Serial.print("  pour choix Bombe ");Serial.print("x = ");Serial.println(x);
            etat_boutonR=LOW;
            delay(300);
            jeu = 2;
        }    
        if (jeu > 0){break;}
    }
    lcd.clear();
}

et voici l'erreur affichée:

C:\Users\Jean-Christophe\Documents\Arduino\libraries\Newliquidcrystal_1.3.5/LiquidCrystal_I2C.h:53:4: note: initializing argument 3 of 'LiquidCrystal_I2C::LiquidCrystal_I2C(uint8_t, uint8_t, t_backlighPol)'

    LiquidCrystal_I2C (uint8_t lcd_Addr, uint8_t backlighPin, t_backlighPol pol);

    ^

exit status 1
Erreur de compilation pour la carte Arduino Nano

Je n'arrive pas à comprendre l'erreur.
Merci pour votre aide.

Selon le fichier LiquidCrystal_I2C.h

	 /**
	 * Constructor
	 *
	 * @param lcd_addr	I2C slave address of the LCD display. Most likely printed on the
	 *					LCD circuit board, or look in the supplied LCD documentation.
	 * @param lcd_cols	Number of columns your LCD display has.
	 * @param lcd_rows	Number of rows your LCD display has.
	 * @param charsize	The size in dots that the display has, use LCD_5x10DOTS or LCD_5x8DOTS.
	 */
	LiquidCrystal_I2C(uint8_t lcd_addr, uint8_t lcd_cols, uint8_t lcd_rows, uint8_t charsize = LCD_5x8DOTS);

Il y a 4 arguments et tu en mets 3 :
LiquidCrystal_I2C lcd(0x27, 20, 4);ce qui ne pose normalement pas de problème. Je te conseille d'effacer la ligne et de la retaper à la main. Tu as peut-être un ou des caractères cachés (genre doigt qui dérape sur le clavier) qui créent cette erreur.

Salut

Il existe plusieurs librairies LiquidCrystal_I2C, pas forcément compatibles.
Dans ton exemple :

LiquidCrystal_I2C lcd(0x27, 20, 4);

Les paramètres sont

  • 0x27 = adresse I2C
  • 20 = nombres de colonnes
  • 4 = nombre dde lignes

Or le constructeur de la classe LiquidCrystal_I2C de la librairie Newliquidcrystal_1.3.5 n'attend pas du tout ces paramètres.

  • adresse I2C
  • backlighPin
  • pol

Soit tu adoptes la librairie qui correspond à ton exemple, soit tu t'inspires d'un exemple de la librairie Newliquidcrystal_1.3.5.
On ne mélange pas.

Personnellement j'utilise celle-ci, qui fonctionnera probablement avec ton code.

Ensuite, si tu changes de librairie, tu vires la Newliquidcrystal_1.3.5, car ces messieurs les concepteurs ont eu la merveilleuse idée de nommer leurs fichiers de la même façon.

@+

hbachetti:
Salut

Il existe plusieurs librairies LiquidCrystal_I2C, pas forcément compatibles.
Dans ton exemple :

LiquidCrystal_I2C lcd(0x27, 20, 4);

Les paramètres sont

  • 0x27 = adresse I2C
  • 20 = nombres de colonnes
  • 4 = nombre dde lignes

Or le constructeur de la classe LiquidCrystal_I2C de la librairie Newliquidcrystal_1.3.5 n'attend pas du tout ces paramètres.

  • adresse I2C
  • backlighPin
  • pol

Soit tu adoptes la librairie qui correspond à ton exemple, soit tu t'inspires d'un exemple de la librairie Newliquidcrystal_1.3.5.
On ne mélange pas.

Personnellement j'utilise celle-ci, qui fonctionnera probablement avec ton code.

Ensuite, si tu changes de librairie, tu vires la Newliquidcrystal_1.3.5, car ces messieurs les concepteurs ont eu la merveilleuse idée de nommer leurs fichiers de la même façon.

@+

D'accord merci pour les informations.

J'ai essayé avec la tienne comme tu as dis mais j'ai un autre message d'erreur:

C:\Users\JEAN-C~1\AppData\Local\Temp\ccH7VHx0.ltrans0.ltrans.o: In function `main':

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/main.cpp:43: undefined reference to `setup'

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/main.cpp:46: undefined reference to `loop'

collect2.exe: error: ld returned 1 exit status

exit status 1

Il faut que tu postes ton code, il doit manquer un ; ou une accolade quelque part.

#include <LiquidCrystal_I2C.h>

#include <Wire.h>                     // permet de communiquer avec les composants utilisant le protocole I2C / TWI 

//      Déclaration des variables   ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int  etat_boutonB, etat_boutonR;
const int pinBoutonB =2;
const int pinBoutonR = 3;
const int pinLed = 4;
int jeu = 0;

//      Déclaration des pins        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

LiquidCrystal_I2C lcd(0x27, 20, 4);


//      Void Menu                   ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void menu() {
    // CHOIX JEU
    Serial.begin(9600); 
    pinMode(pinBoutonB, INPUT); //On indique à l’Arduino le mode du pin (entrée)
    pinMode(pinBoutonR, INPUT); //On indique à l’Arduino le mode du pin (entrée)
    lcd.clear();
    lcd.setCursor(6, 0 );
    lcd.print("MENU");
    delay (1500);
    lcd.clear(); 
    //Serial.println("menu");
    while (1) 
    { 
        lcd.setCursor(0, 0 );lcd.print("(B)-Parcours");
        lcd.setCursor(0, 1 );lcd.print("(R)-Distance");
        etat_boutonB = digitalRead(pinBoutonB);
        etat_boutonR = digitalRead(pinBoutonR);
        
        if (etat_boutonB == HIGH ) 
        {
            //Serial.print("BP_B = ");Serial.print(etat_boutonB);Serial.print(" pour choix checkpoint ");Serial.print("x = ");Serial.println(x);
            etat_boutonB=LOW;
            delay(300);
            jeu = 1;
        }
        if (etat_boutonR == HIGH ) 
        {
            //Serial.print("BP_R = ");Serial.print(etat_boutonR);Serial.print("  pour choix Bombe ");Serial.print("x = ");Serial.println(x);
            etat_boutonR=LOW;
            delay(300);
            jeu = 2;
        }    
        if (jeu > 0){break;}
    }
    lcd.clear();
}

Il manque plus qu'un point virgule : il manque le setup et la loop.

Un peu de lecture ici :

La fonction setup() , même vide, est obligatoire dans tout programme Arduino.

La fonction loop() est obligatoire, même vide, dans tout programme.

Pour comprendre : les habitués du C seront surpris de ne pas trouver la classique fonction main() obligatoire dans tout programme C. En fait, la fonction setup() et la fonction loop() sont implémentées au sein de la fonction main() (Voir dans le répertoire arduino le fichier \hardware\cores\arduino\main.cxx) qui est appelée en premier lors de l'exécution de tout programme en C, langage sur lequel est basé le langage Arduino.

Dans ton cas, le setup doit prendre ces 3 lignes de ta fonction :

void setup()
{
    Serial.begin(9600); 
    pinMode(pinBoutonB, INPUT); //On indique à l'Arduino le mode du pin (entrée)
    pinMode(pinBoutonR, INPUT); //On indique à l'Arduino le mode du pin (entrée)
}

et la loop est simplement :

void loop() 
{
  menu();
}

Ah ok merci beaucoup. Je ne me souvenais plus qu'elles étaient obligatoire.

Tu peux même mettre l'appel de la fonction menu dans le setup et laisser la loop vide, c'est selon ton besoin. Le setup est exécuté une seule fois, la loop est exécutée en boucle ensuite sans arrêt.

D'accord dans mon cas je ne sais pas trop si je dois le mettre dans le setup ou dans la loop!
PAr contre j'ai juste un soucis du fait que j'ai changé la librairie.
Voilà le message d'erreur:
menu:19: error: 'Serial' does not name a type

Serial.begin(9600);

^

menu:20: error: expected constructor, destructor, or type conversion before '(' token

pinMode(pinBoutonB, INPUT); //On indique à l’Arduino le mode du pin (entrée)

^

menu:21: error: expected constructor, destructor, or type conversion before '(' token

pinMode(pinBoutonR, INPUT); //On indique à l’Arduino le mode du pin (entrée)

^

menu:25: error: expected constructor, destructor, or type conversion before ';' token

menu();

^

exit status 1
'Serial' does not name a type

Serial je l'utilisais avec la librairie d'avant mais avec la tienne celà ne fonctionne pas. J'ai bien essayé d'ouvrir la librairie afin de trouver à l'intérieur la syntaxe exacte mais je n'ai pas trouvé.

Salut,

ajoute :

#include <SoftwareSerial.h>

en début de fichier.

C'est bon j'ai trouvé mon erreur. Encore merci beaucoup pour ton aide.
Peux tu juste m'expliquer à quoi sert le Serial et #include <SoftwareSerial.h> stp?

Serial (lis ce lien) sert à définir la communication série entre l'Arduino et (par exemple) le PC. SoftwareSerial est une bibliothèque qui permet de construire une telle liaison quand on en veut plusieurs (pour communication bluetooth par exemple).

Je pense que ton erreur n'avait rien à voir avec SoftwareSerial : si l'ajout de cette bibliothèque l'a corrigé, c'est un hasard, et il peut cacher un problème plus important plus tard.

C'est bon j'ai trouvé mon erreur. Encore merci beaucoup pour ton aide.
Peux tu juste m'expliquer à quoi sert le Serial et #include <SoftwareSerial.h> stp?

lesept:
Serial (lis ce lien) sert à définir la communication série entre l'Arduino et (par exemple) le PC. SoftwareSerial est une bibliothèque qui permet de construire une telle liaison quand on en veut plusieurs (pour communication bluetooth par exemple).

Je pense que ton erreur n'avait rien à voir avec SoftwareSerial : si l'ajout de cette bibliothèque l'a corrigé, c'est un hasard, et il peut cacher un problème plus important plus tard.

Non non ce n'est pas la bibliothèque qui a corrigé l'erreur jsute moi qui avait fait un oubli dans mon code. JE n'utilise pas cette bibliothèque, je t'ai jsute demandé car je ne l'ai jamais utilisé celle-ci c'est pour ça, afin de savoirà quoi elle sert.

Oui, j'ai vraiment dis n'importe quoi avec cette histoire de SoftwareSerial :o :o

Vire la ligne #include <SoftwareSerial.h> qui n'a rien a voir avec ton problème.

La bibliothèque SofwareSerial permet d'émuler un UART (L'UART est le composant permettant la communication série). On peut par exemple s'en servir pour communiquer avec l'UART d'un composant lorsqu'on n'a plus de port série disponible. Ce qui n'est pas ton cas :wink: