[Résolu] Problème afficheur LCD I2C

Bonjour,
J’ai acheté chez ali… un afficheur LCD 20x4 avec interface I2C. Impossible de lui faire afficher quoi que ce soit. Il est connecté sur une Duemilanove AT328

Mon afficheur est bien branché sur A4 SDA/A5 SDL, pendu avec des 10ko sur le +5V

Voilà le code de test :

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F,20,4); 

void setup()
{
lcd.init();
lcd.clear();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.display();
lcd.print("test");

}
void loop()
{

}

Je lui passe un coup de scanner I2C de l’ami fdufnews, pas de problème, il est bien vu en 0x3F.

J’arrive à jouer avec certaines commandes, pas exemple dans le loop un backlight et un noBacklight avec un delay(1000), le rétro éclairage clignote bien toutes les secondes, c’est donc que l’arduino dialogue bien avec l’afficheur.

Donc à priori le bus I2C est hors cause.

Mais il n’affiche jamais rien, et là je sèche.
Merci de votre aide !

Commence déjà par vérifier que ce n'est pas tout bêtement un problème de réglage de contraste (il doit y avoir un potar derrière l'écran)

Après, tu peux soulever le capot et mettre les mains dans le cambouis pour vérifier que ta librairie est bien compatible avec ton écran.
Ce n'est pas très compliqué, et même assez instructif.

Ton arduino dialogue en I2C avec un simple PCF8574 dont les sorties sont reliées aux entrées du contrôleur HD44780 du LCD.

La commande d'un LCD via un HD44780 est très bien décrite ici : HD44780 — Wikipédia

En principe, tu n'utilises que 6 broches data (+ 1 pour le rétroéclairage) : RS, E, D4, D5, D6, D7. Leur nom est imprimé sur le circuit du LCD.

A l'aide du datasheet du PCF8574 et d'un ohmètre, tu peux établir la correspondance entre les sorties du PCF8574 et les entrées du HD44780. puis vérifier que c'est bien conforme à ce qui est supposé dans la librairie LiquidCrystal.

hello
je ne connais pas les lcd i2c
mais avec un simple la cde d'init est: lcd.init(20,4); et dans ton code tu as lcd.init();

fais un test en changeant par lcd.init(20,4);

Les caractéristiques de l'écran sont visiblement données dans le constructeur.
Plusieurs versions de cette librairie circulent sur le net.
Je pense qu'il vaut mieux aller zieuter les .h et .cpp de celle utilisée, et vérifier que c'est cohérent avec le hardware.

fking:
Bonjour,
J'ai acheté chez ali... un afficheur LCD 20x4 avec interface I2C. Impossible de lui faire afficher quoi que ce soit. Il est connecté sur une Duemilanove AT328

Mon afficheur est bien branché sur A4 SDA/A5 SDL, pendu avec des 10ko sur le +5V

bonjour
il y a plusieurs types d'interface faisant du I²C LCD (compos differents)
quelle est la reference du composant d'interface ?

Merci pour vos éléments de réponse...

J'ai bien sûr vérifié le potar de contraste, ça ne vient pas de là.

La commande lcd.init(20,4) est refusée à la compilation.

Le circuit de contrôle I2C est un PFC8574AT

Il n'y a rien de marque sur le CI de l'afficheur, le module I2C est soudé dessus.

J'ai regardé dans le .h et dans le .cpp, je ne vois nulle part où est établi une correspondance des broches.

Le PCF8574 est juste un io expander I2C

Il a des broches de sorties P0, P1, ... P7

Ton arduino lui envoie un octet via le bus I2C, et chaque bit de cet octet correspond à une des sorties du PCF8574 (et donc à une entrée du LCD)

Quelle librairie LiquidCrystal_I2C utilises-tu exactement?

Oui, j’ai bien compris que le PFC transforme l’octet I2C vers les entrées parallèles du LCD.

J’ai essayé les 2 génériques du playground :

http://playground.arduino.cc/Code/LCDi2c

j’utilise aussi des I²C/LCD basé sur ce compo
j’utilise cette lib LiquidCrystal_I2C

un prog de test qui fonctionne avec les miens (attention je suis en adresse 0x27 )

/* YourDuino.com Example Software Sketch
 20 character 4 line I2C Display
 Backpack Interface labelled "LCM1602 IIC  A0 A1 A2"
 terry@yourduino.com */

/*-----( Import needed libraries )-----*/
#include <Wire.h>  // Comes with Arduino IDE
// Get the LCD I2C Library here: 
// https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads
// Move any other LCD libraries to another folder or delete them
// See Library "Docs" folder for possible commands etc.
#include <LiquidCrystal_I2C.h>

/*-----( Declare Constants )-----*/
//none
/*-----( Declare objects )-----*/
// set the LCD address to 0x20 for a 20 chars 4 line display
// Set the pins on the I2C chip used for LCD connections:
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address
long sec=0;
  long pm=0;
byte ad;
/*-----( Declare Variables )-----*/
byte c0[8] = {17,10,17,21,21,17,10,17};
byte c1[8] = {31,17,17,17,17,17,17,31};
byte c2[8] = {25,21,19,17,19,21,25,0};
byte c3[8] = {3,3,4,9,18,4,24,24};
byte c4[8] = {24,24,4,18,9,4,3,3};
;
//none

void setup()   /*----( SETUP: RUNS ONCE )----*/
{
  Serial.begin(9600);  // Used to type in characters

  lcd.begin(20,4);         // initialize the lcd for 16 chars 2 lines and turn on backlight
  lcd.createChar(0, c0);
  lcd.createChar(1, c1);
  lcd.createChar(2, c2);
  lcd.createChar(3, c3);
  lcd.createChar(4, c4);
 

// ------- Quick 3 blinks of backlight  -------------
  for(int i = 0; i< 3; i++)
  {
    lcd.backlight();
    delay(250);
    lcd.noBacklight();
    delay(250);
  }
  lcd.backlight(); // finish with backlight on  
  
//-------- Write characters on the display ----------------
// NOTE: Cursor Position: CHAR, LINE) start at 0  
lcd.home ();
  lcd.setCursor(3,0); //Start at character 4 on line 0
  lcd.print("Hello, world!");
  delay(1000);
  
  lcd.setCursor(0,2);
  lcd.print("20 by 4 Line Display");
  
  delay(2000);
  lcd.clear();
// Wait and then tell user they can start the Serial Monitor and type in characters to
// Display. (Set Serial Monitor option to "No Line Ending")
  lcd.setCursor(0,0); //Start at character 0 on line 0
  lcd.print("TOP Afficheur LCD");
  lcd.setCursor(0,3);
  lcd.print("COMPTEUR TEST");   
  lcd.setCursor(2,1); 
  lcd.print("Ligne 2 ");
  lcd.write(byte(0));
  lcd.write(byte(1));
  lcd.write(byte(2));
  lcd.write(byte(3));
  lcd.write(byte(4));
  lcd.write(byte(3));
  lcd.write(byte(4));
  lcd.write(byte(3));
  lcd.write(byte(4));
  lcd.setCursor(0,2);
  lcd.print("        Ligne 3 ");   
  


}/*--(end setup )---*/


void loop()   /*----( LOOP: RUNS CONSTANTLY )----*/
{
  {
    // when characters arrive over the serial port...
    if (Serial.available()) {
      // wait a bit for the entire message to arrive
      delay(100);
      // clear the screen
      lcd.clear();
      // read all the available characters
      while (Serial.available() > 0) {
        // display each character to the LCD
        lcd.write(Serial.read());
      }
    }
    if (pm<= millis()-100) {
    sec=sec + 1;
    lcd.setCursor(14,3);
   
  lcd.print(sec);
  ad=sec % 20;
  lcd.setCursor(ad,2);
  lcd.print(" >");
  pm=millis();  
    }
  }

}/* --(end main loop )-- */

Un peu de mieux avec ta librairie, Artouste !!!

Le code tourne, je vois bien le backlight clignoter 3x, mais après, en 0,0, ca clignote entre une matrice pleine et le curseur. Mais toujours pas de texte, même quand j'envoie par le serial. Et l'arduino finit par rebooter !!!

J'en reste à ma proposition de départ : commence par vérifier les correspondances entre les sorties du PCF8574 et les entrées du LCD.
Cela te permettra d'établir quelle librairie utiliser, ou comment paramétrer le constructeur si la lib le permet.

fking:
Un peu de mieux avec ta librairie, Artouste !!!

Le code tourne, je vois bien le backlight clignoter 3x, mais après, en 0,0, ca clignote entre une matrice pleine et le curseur. Mais toujours pas de texte, même quand j'envoie par le serial. Et l'arduino finit par rebooter !!!

tu a tenter de regler le potentiometre de contraste ?
pour le reboot, a part un lcd+interface qui tire trop sur le 5v je ne vois pas

@bricoleau : je veux bien, mais je fais ça comment ??? Je n'ai rien de marqué sur le CI du LCD, juste 16 broches de 1 à 16. Le convertisseur I2C est soudé dessus.

@artouste : oui, le potar ne change rien. Le reboot n'est pas systématique.

Montage éteint, tu prends un petit testeur en mode ohm mètre, et tu mesures la résistance entre les bornes du pcf8574 et celles du lcd.
Resistance nulle = bornes reliées

fking:
@bricoleau : je veux bien, mais je fais ça comment ??? Je n'ai rien de marqué sur le CI du LCD, juste 16 broches de 1 à 16. Le convertisseur I2C est soudé dessus.

@artouste : oui, le potar ne change rien. Le reboot n'est pas systématique.

il fait quand meme varier le contraste global de la matrice ton potard ?
il faut regarder comment sont reparties les sorties du PCF sur le connecteur LCD.
si le backlight reagit c'est déjà que l'adresse I²C et les instructions sont reconnues par l'adaptateur.

les miens c'est ça

Bon, je pense avoir trouvé le brochage du LCD, c'est un 2004A, ça a l'air assez connu.
J'ai
3 : Vee for LCD Drive
4 : RS Function Select
5 : R/W
6 : ENable
7 : DB0
...
14 : DB7

Si je me réfère au code donné ci-dessus par Artouste :
// Set the pins on the I2C chip used for LCD connections:
// addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

Je devrais donc modifier la ligne par (0x3F,6,5,4,11,12,13,14,3,POSITIVE)

Correct ? Je risque pas de faire fumer quelque chose si je me plante ?

@artouste : oui, le potar marche. Le module I2C ressemble fort au tien.

fking:
Bon, je pense avoir trouvé le brochage du LCD, c'est un 2004A, ça a l'air assez connu.

Correct ? Je risque pas de faire fumer quelque chose si je me plante ?

Non ça ne risque rien

Les tests ne donnent rien de cohérent : par exemple j'ai la 4 et la 5 du LCD qui sont reliées à la 4 du PFC ????

Sans compter que je ne vois pas la correspondance entre les broches du PFC et celle du LCD... Sur la datasheet du PFC, il y a huit broches P0 à P7 : quasi bidirectionnal IO.
J'ai P4 à P7 connectées à DB4-DB7. Mais pour P0 à P3, je ne trouve rien de cohérent.

J'ai modifié la ligne de code, pas mieux

bonjour

j’ai eu le meme probleme avec mon lcd I2c , meme erreur que toi

apres je ne sais pas si c’est la cause je faisait tourner avec windows 8 et impossible donc je passe sur un autre pc sous xp et la par magie j’affiche bien sur mon lcd

si tu est sous wins 8 ou 7 essaye de passer sur un xp , j’ai installer Oracle VM VirtualBox sur mon windows 8 pour travailler sous XP avec mon LCD

fking:
Les tests ne donnent rien de cohérent : par exemple j'ai la 4 et la 5 du LCD qui sont reliées à la 4 du PFC ????

J'ai modifié la ligne de code, pas mieux

Normalement les afficheurs basés sur le HD44780 (ou compatibles) respectent le meme pinout au moins en ce qui concerne les pins 1 à 14.
Je dois en avoir quelques dizaines de provenance differentes , je n'ai jamais vu de connection "exotiques"
pour tous ceux que j'ai testé en I²C , je n'ai jamais eu à modifier le pinout dans la lib.
Déjà a tu tester ton LCD en direct ? cablage standard sans I²C comme expliqué ici