[Résolu] Rétro éclairage d'un LCD 20x04

Bonjour à tous !

Je m’appelle Yonnel et je commence mon aventure Arduino. :slight_smile:
Je suis content de découvrir qu’il y a une communauté francophone :slight_smile: Merci d’avance pour le temps que vous y consacrez !

Je m’initie à l’affichage sur écran LCD simple.
J’en suis à mon second essai : un LCD 20x04 connecté par i2C sur un Arduino Mega.
Très probablement celui-ci :

pobot.org/LCD-sur-I2C-simplement.html?lang=fr

J’ai lu pas mal de documents et j’ai fini par écrire mon propre (modeste) code. (Voir ci-dessous…)

Mon problème (assez simple j’espère…) est que le rétro-éclairage ne fonctionne pas. :o
Où plus précisément, il clignote un peu ou reste un peu allumé au démarrage du programme, puis il s’éteint quand commence l’affichage du texte voulu. (Qui, en conséquence, est peu lisible… Mais bien là !!!)

Le petit cavalier à l’arrière de l’interface i2C est bien connecté…

Y aurait-il un problème dans mon code ?
Est-ce que ce serait l’afficheur qui serait défectueux ?

Merci par avance pour votre aide. :slight_smile:

Yonnel

/**
 * Code pour tester un afficher 2004A --> 20x04
 * --> 4 lignes de 20 colonnes 
 * Il est inspiré de ces pages :
 * https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home &
 * http://www.pobot.org/LCD-sur-I2C-simplement.html?lang=fr 
 *  
 */


/**
 *  Inclure la Library "wire.h" (présente par défaut).
 *  Sert à la communicarion avec les composants utilisant le protocol I2C
 *  http://www.mon-club-elec.fr/pmwiki_reference_arduino/pmwiki.php?n=Main.LibrairieWire
 **/

#include <Wire.h>

/**
 *  Inclure la bibliothèque. 
 *  Je l'ai fait depuis la liste proposée depuis le menu :
 *  Croquis > Inclure une bibliothèque > Gérer les bibliothèue
 *  Choisir la librairie dans la liste...                
 **/
#include <LiquidCrystal_I2C.h>


/**
 * Définir l'adresse du LCD I2C, mais je ne sais pas trop en quoi ça consiste ce (0x38)...
 * D'ailleurs, il ne fonctionne pas tout seul... J'ai du rectifier grâce au code donné ici :
 * http://www.pobot.org/LCD-sur-I2C-simplement.html?lang=fr
 * L’adresse I2C du module est 0x27 (norme 7 bits) en fait...
 */
 
// LiquidCrystal_I2C lcd(0x38);
LiquidCrystal_I2C lcd(0x27,20,4);



#define BACKLIGHT_PIN 13     // Choisir la pin 13 pour le rétro-éclairage
                             // Sauf que moi, je n'utilise que les PINs GND/5V & SCL/SDA alors est-ce utile ?
                             // Mettre la broche 5V en PIN 13 pour avoir le contrôle ?

void setup() {
  pinMode (BACKLIGHT_PIN , OUTPUT);    // Configure la PIN BACKLIGHT en sortie
  digitalWrite (BACKLIGHT_PIN , HIGH); // Envoie 5V sur la PIN BACKLIGHT (=13) --> Allume l'arrière plan de l'écran.

  //lcd.begin(16,4);                   // Initialise le LCD, indique à l'Arduino que ce sera un 16x04. Ne fonctionne pas pour moi... mieux vaut :
  lcd.init();

  lcd.home ();                         // Égale à  " lcd.setCursor (0,0); " je suppose...

  lcd.print ("Boujour a tous !");      // Écris le texte

  delay (1000);                        // Attend 1s

  lcd.setCursor (0,1);                 // Place le curseur à la colonne 0 (1ére colone) et la ligne 1 (2nde ligne...)

  lcd.print ("Ca va ?");               // Écris le texte

  delay (1000);                        // Attend 1s

  lcd.setCursor (0,2);                 // Place le curseur à la colonne 0 (1ére colone) et la ligne 2 (3ème ligne...)

  lcd.print ("C'est Cool !");          // Écris le texte

  delay (1000);                        // Attend 1s

  lcd.setCursor (0,3);                 // Place le curseur à la colonne 0 (1ére colone) et la ligne 3 (4ème ligne...)

  lcd.print ("J'ai 4 lignes !!!");     // Écris le texte

}

void loop() {

  
// Pas besoin pour le test...


}

Bonjour,
Qu'as tu comme connexion et commande sur la pin 13 (censé commander le backligh) ?

J'ai branché un petit câble mâle/femelle de la PIN 13 du Mega à la broche VCC de l'interface i2C.

Je n'ai pas mis de résistance parce que j'ai cru comprendre que ce n'était pas nécessaire avec la PIN 13...

Si je branche ce câble à la PIN 5V avec une résistance de 330 Ohm, le rétro-éclairage reste allumé, mais le programme ne se lance pas, et tout s'éteint quand j'appuie sur le bouton reset du Mega.

Comme commande pour la PIN 13,

J'ai, au début :

#define BACKLIGHT_PIN 13

Puis, dans le "void setup()" :

pinMode (BACKLIGHT_PIN , OUTPUT);    // Configure la PIN BACKLIGHT en sortie
digitalWrite (BACKLIGHT_PIN , HIGH); // Envoie 5V sur la PIN BACKLIGHT (=13) --> Allume l'arrière plan de l'écran.

Merci pour votre aide !

hello

tu vas dans le répertoire librairies de ton IDE arduino
tu renommes ta librairie liquidCrystalI2c actuelle==>old_liquidCrystalI2c

tu dézippes le fichier joint et tu le places dans le répertoire librairies de ton IDE arduino.

en fait tu viens de remplacer ta librairie liquidCrystalI2c par une nouvelle.

puis tu testes ce programme

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd1(0x27, 20, 4);
void setup() {
Wire.begin();
  lcd1.begin();                                     //lcd1.print("1_pret");
  lcd1.clear();
lcd1.noBacklight();
lcd1.setCursor(0, 0);lcd1.print("test du backlight "); //affichage sur le LCD dans l'habitacle 
}

void loop() {
lcd1.backlight();
delay(1000);
lcd1.noBacklight();  // put your main code here, to run repeatedly:
delay(1000);
}

LiquidCrystal_I2C.zip (7.95 KB)

Salut

J'ai fait comme tu m'as indiqué dfgh :

  • J'ai placé ton dossier "LiquidCrystal_I2C" dans mon dossier "libraries".
  • J'ai copié/collé ton code dans l'IDE.
  • La vérification s'est passée sans erreurs.
  • L'arrière-plan a clignoté rapidement au téléversement. (Sûrement dû au fait qu'il est sur la PIN 13)

Mais après, tout reste noir... Je ne distingue pas de texte à l'écran...

En appuyant sur "reset" du Mega, je n'obtiens que 2 clignotements rapides de l'écran sans texte visible...

Je viens de changer de carte Arduino. C'était une carte Mega neuve, alors elle pouvait être facteur de risques. (Quoi qu'originale...)
J'ai téléversé ton programme sur un UNO et j'obtiens exactement la même chose... Clignotement rapide au démarrage puis noir total...

:frowning:

tu vires le fil de la patte 13

tu n'as besoin que des 4 fils qui sont en bout de ta platine I2C

yobeco:
J'ai branché un petit câble mâle/femelle de la PIN 13 du Mega à la broche VCC de l'interface i2C.

la broche vcc doit etre reliée au 5 volts de l'arduino en permanence : c'est l'alim du circuit qui fait la conversion I2C parallèle
si on veut une commande backlight il doit y avoir des exemples dans la biblio utilsée ?
fonction backlight/ nobacklight ?

Merci pour votre aide !

Maintenant, ça fonctionne !!!

Pour résumer, c'était un triple problème :

  • Bibliothèque foireuse ou inadaptée... (La bonne que tu m'as donnée, dfgh, vient-elle d'ici ? http://playground.arduino.cc/Code/LCDi2c )
  • Utilisation d'un exemple de code (foireux ou inadapté ?) qui préconisait de brancher l'alimentation sur la PIN 13...
  • Puis branchement sur la broche VCC avec une résistance 330 ohms (je croyais protéger l'éclairage LED...), ce qui n'est pas utile vu que ça doit être le contrôleur i2C qui s'en charge...

Mais cela soulève quand-même quelques questions :

  • Comment régler la luminosité ? Est-ce possible de donner un argument de luminosité à " lcd1.backlight(); " par exemple ?
  • Comment éteindre le LCD complètement, pour économiser de la batterie par exemple ? Y a-t-il un truc du genre " lcd1.stop(); "

En tous cas, merci beaucoup pour le temps consacré ! :slight_smile:

:slight_smile: un coup d'oeil sur cet extrait de liquidCrystal.h

void begin();

/**

  • Remove all the characters currently shown. Next print/write operation will start
  • from the first position on LCD display.
    */
    void clear();

/**

  • Next print/write operation will will start from the first position on the LCD display.
    */
    void home();

/**

  • Do not show any characters on the LCD display. Backlight state will remain unchanged.
  • Also all characters written on the display will return, when the display in enabled again.
    */
    void noDisplay();

/**

  • Show the characters on the LCD display, this is the normal behaviour. This method should
  • only be used after noDisplay() has been used.
    */
    void display();

/**

  • Do not blink the cursor indicator.
    */
    void noBlink();

/**

  • Start blinking the cursor indicator.
    */
    void blink();

/**

  • Do not show a cursor indicator.
    */
    void noCursor();

/**

  • Show a cursor indicator, cursor can blink on not blink. Use the
  • methods blink() and noBlink() for changing cursor blink.
    */
    void cursor();

void scrollDisplayLeft();
void scrollDisplayRight();
void printLeft();
void printRight();
void leftToRight();
void rightToLeft();
void shiftIncrement();
void shiftDecrement();
void noBacklight();
void backlight();
void autoscroll();
void noAutoscroll();
void createChar(uint8_t, uint8_t);
void setCursor(uint8_t, uint8_t);
virtual size_t write(uint8_t);
void command(uint8_t);

inline void blink_on() { blink(); }
inline void blink_off() { noBlink(); }
inline void cursor_on() { cursor(); }
inline void cursor_off() { noCursor(); }

Merci

J’ai également regardé le contenu de “LiquidCrystal_I2C.h”. (Je ne savais pas qu’il y avait de la doc dans ces fichiers…) Je croyais que c’étaient seulement des scripts “exécutables”…

Mais aucune information n’apparaît concernant la variation de luminosité du rétro éclairage ni sur l’extinction de l’afficheur (pour économies) à moins que noDisplay ajouté au “noBacklight” fasse l’affaire…

/**
	 * Set the LCD display in the correct begin state, must be called before anything else is done.
	 */
	void begin();
	
	 /**
	  * Remove all the characters currently shown. Next print/write operation will start
	  * from the first position on LCD display.
	  */
	void clear();
	  
	/**
	 * Next print/write operation will will start from the first position on the LCD display.
	 */
	void home();

	 /**
	  * Do not show any characters on the LCD display. Backlight state will remain unchanged.
	  * Also all characters written on the display will return, when the display in enabled again.
	  */
	void noDisplay();
	  
	/**
	 * Show the characters on the LCD display, this is the normal behaviour. This method should
	 * only be used after noDisplay() has been used.
	 */ 
	void display();

	/**
	 * Do not blink the cursor indicator.
	 */
	void noBlink();
	 
	/**
	 * Start blinking the cursor indicator.
	 */ 
	void blink();	 

	/**
	 * Do not show a cursor indicator.
	 */
	void noCursor();

	/**
 	 * Show a cursor indicator, cursor can blink on not blink. Use the
	 * methods blink() and noBlink() for changing cursor blink.
	 */ 
	void cursor();

	void scrollDisplayLeft();
	void scrollDisplayRight();
	void printLeft();
	void printRight();
	void leftToRight();
	void rightToLeft();
	void shiftIncrement();
	void shiftDecrement();
	void noBacklight();
	void backlight();
	void autoscroll();
	void noAutoscroll(); 
	void createChar(uint8_t, uint8_t[]);
	void setCursor(uint8_t, uint8_t); 
	virtual size_t write(uint8_t);
	void command(uint8_t);

	inline void blink_on() { blink(); }
	inline void blink_off() { noBlink(); }
	inline void cursor_on() { cursor(); }
	inline void cursor_off() { noCursor(); }

Comme ce n’était pas le sujet d’origine de mon post, je crois que je vais ouvrir un autre fil de discussion…

Merci à vous !

yobeco:
Comme ce n'était pas le sujet d'origine de mon post, je crois que je vais ouvrir un autre fil de discussion...

Salut, désolé de rouvrir ce sujet, mais je n'arrive pas à régler la luminosité, avec des valeurs entre 0 et 255 par exemple, as-tu réussi ?

Bonjour j'ai réussi a joué avec le rétroéclairage en faisant comme ceci:
1.enlevé le cavalier sur le circuit i2c
2.brancher un fil sur la broche du haut puis sur une sortie pwn ou annalogique de votre choix
3.dans le code mettre le nom de la pin utiliser puis la valeur pour le rétroéclairage en sachant qu'il ne faut pas dépasser la valeur de 255 pour le rétroéclairage.
J'espère que je me suis bien expliqué.

Par contre j'utilise du câble ftp et quand le signal passe dans l'une des paires avec l'alimentation et le bus i2c ça ne fonctionne pas ,ça bloque l'arduino et l'ecran n'affiche plus rien.

2 ans plus tard :
respect Jeremy qui a trouvé une solution "alternative", il faut un fil et une sortie arduino en plus de l'i2c.
bien que le la sortie P3 du 8574 soit reliée à un npn pour commander la Kathode de la led, le jumper met l'Anode de la led en permanence au V+
led + led - inversé sur le schema

pas inversé dans le brochage lcd mais le collecteur du npn doit aller à led - et le jumper doit aller a led +

pour utiliser la fonction on/off du backlight avec i2c, il faut que le jumper soit mis :

fonction mylcd.setBacklightPin(3, POSITIVE); // 3 est la pin P3 du 8574
mylcd.setBacklightPin(HIGH);

pas testé, tout dépend de la biblio, de la version de celle-ci, du backpac i2c utilisé
je ne sais pas si possible de faire du pwm par l'i2c du 8574 ?
non pas possible

bravo à Jeremy

Merci vaut mieux tard que jamais :slight_smile: moi aussi ça m'intriguer de ne pouvoir gérer ce rétroéclairage,et puis un soir une idée mais venu enfin plutôt une lumière :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: ,l'avantage c'est de pouvoir donner la luminosité que l'on veut quand on veut enfin content d'avoir pus aider.