Multiple afficheurs LCD I2C sur arduino UNO

Slt,

Je cherche à connecter plusieurs afficheurs (4 maxi ) LCD via un port I2C sur une carte UNO.

Je ne trouve pas de schéma de branchement ( il me semble qu'ils sont raccordés en // ) mais je ne trouve pas également de code pour l'adressage des afficheurs.

Si l'un d'entre vous peut m'aider.

Merci. :wink:

Bonsoir,
Il faut des afficheurs avec adresses configurables.
Ils seront connectés en parallèle sur A4 A5.
Quels sont leurs références?

Exemple:

#include <Wire.h>
#include "CLCD.h"
//remarque: l'adresse 00 pose problème avec une horloge DS1307
CLCD lcd1(0x01,20,4);     //si lcd 4 lignes de 20 colonnes à l'adresse 01
CLCD lcd2(0x02,20,4);     
CLCD lcd3(0x03,20,4); etc..    

void setup()
{ lcd1.init();
lcd2.init;
lcd3.init;
etc..
}
 void loop()
{ 
  
  lcd1.backlight();
  lcd1.print("Bonjour,");
etc...

Afficheur réf : 1602 ZFA

Je ne vois rien d'autre...

Merci.

Les contrôleurs : PCF 8574t
:wink:

Les broches 1, 2 et 3 du PCF8574 permettent de fixer le poids faible de l'adresse I2C. C'est soudé ou il y a des strass ?

Slt,

J'essaie avec les deux codes proposés dans les exemples de la version 1.0.6 (arduino). Raccordement des afficheurs avec des cables connecteurs (pas de soudure) . Je pense pas que le problème vienne de là, ils fonctionnent tout les deux indépendamment avec d'autres codes

/*
Programme : Affichage CLCD via I2C
création : 04/05/2012 - mise à jour : 10/05/2012
version  : 1.0 - Utilisation via I2C
           1.1 - Création bibliothèque clcd
auteur   : Patrice Seibel
support  : Arduino Duemilanove
*/
/*
Le programme exploite l'afficheur CLCD204 de la société Comfile qui est destiné à être
utilisé avec les micro-contrôleurs de la gamme Cobloc via le bus Cunet.
Les fonctions implantées sont :
  - Locate                                  X      ESC 'L' x y + 100 microe sec
  - Print                                   X      texte à afficher
  - CsrOn (Curseur On)                      X      ESC 'S'
  - CsrOff (Curseur Off)                    X      ESC 's'
  - Backlight On                            X      ESC 'B'
  - Backlight Off                           X      ESC 'b'
  - Cls (Efface écran)                      X      ESC 'C' + 15 ms
  - Home (équivalent à Locate 0,0)          X      ESC 'H'
  - Print 1 (Début première ligne)          X      01
  - Print 2 (Début deuxième ligne)          X      02
  - Print 3 (Début troisième ligne)         X      03
  - Print 4 (Début quatrième ligne)         X      04
  - Création caractère                      X      ESC 'D' x1 x2  x3 x4 x5 x6 x7 x8
  autres
  - SuperPrint (équivalent Locate + Print)  X
*/
//*************************************************************************************
//Directives
//*************************************************************************************

#include "Wire.h"
#include "CLCD.h"

#define LED 9                    //Pin 9 pour la led

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

CLCD lcd;

int i = 0;                       //Variable de comptage et décomptage
float TEMPS = 500;               //Pause 
float ATTENTE = 1000;            //Attente
char Dummy[21] = "Hello world";
char test[] = "";

//*************************************************************************************
//Initialisation
//*************************************************************************************
void setup() 
{
 pinMode(LED, OUTPUT);          //Met la pin en sortie

 lcd.backLight_on();                //Eteint backlight
 delay(ATTENTE);                //Attente
 lcd.cls();                         //Efface l'écran
 delay(ATTENTE);                //Attente
 lcd.backLight_off();               //Eteint backlight
 delay(ATTENTE);                //Attente
 lcd.backLight_on();                //Allume backlight
 lcd.locate(19,0);                  //Positionne le curseur en 19,0
 delay(ATTENTE);                //Attente
 lcd.locate(5,2);                   //Positionne le curseur en 5,2
 lcd.print("Coucou");               //Affiche le texte à la position courante du curseur
 delay(ATTENTE);                //Attente
 lcd.locate(2,0);                   //Positionne le curseur en 5,2
 lcd.print (Dummy);                 //Affiche le message de la variable Dummy
 lcd.curseurOff();                  //Efface le curseur
 delay(ATTENTE);                //Attente
 delay(ATTENTE);                //Attente
 lcd.locate(0,1);                   //Positionne le curseur
 lcd.curseurOn();                   //Affiche le curseur
 delay(ATTENTE);                //Attente
 lcd.hline0();                      //Curseur en début ligne 0
 delay(ATTENTE);                //Attente
 lcd.hline1();                      //Curseur en début ligne 1
 delay(ATTENTE);                //Attente
 lcd.hline2();                      //Curseur en début ligne 2
 delay(ATTENTE);                //Attente
 lcd.hline3();                      //Curseur en début ligne 3
 lcd.print("Fin");                  //Affiche le message
 delay(ATTENTE);                //Attente
 lcd.superPrint(16,1,"ips");        //Positionne le curseur et affiche le texte
 delay(ATTENTE);
 lcd.print(">");
 //Création caractère personnalisé oméga
 lcd.carac(0x08,0x04,0x0A,0x11,0x11,0x0A,0x0A,0x1B,0x00);
 lcd.locate(10,3);                  //Positionne le curseur
 lcd.cls();
 lcd.locate(19,3);
 lcd.print("\x08");                 //Affiche le caractère perso oméga
 lcd.print("\x08");                 //Affiche le caractère perso oméga
 delay(ATTENTE);                //Attente
 lcd.curseurOff();                  //Eteint le curseur
}

//*************************************************************************************
//Boucle d'exploitation (sans fin)
//*************************************************************************************
void loop() 
{
 for(i = 0; i <= 255; i++) {     //Boucle de 0 à 254 (allumage)
   analogWrite(LED, i);          //Fixe la luminosité
   delay(10);                    //Pause de 10 ms pour laisser le temps de
                                 //Stabilisation à analogWrite
 } 
 delay(TEMPS);                   //Attente TEMPS ms

 for(i = 255; i >= 0; i--) {     //Boucle de 255 à 1 (extinction)
   analogWrite(LED, i);          //Règle la luminosité
  delay(10);                     //Pause 10 ms
 }
 delay(TEMPS);                   //Attente TEMPS ms
}

Je peux téléverser mais pas d'affichage, j'ai un doute sur le fait que ce code soit compatible avec mes afficheurs "l'afficheur CLCD204 "

Avec le deuxième code "Multiple LCD", là c'est mieux mais problème également

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
 
LiquidCrystal_I2C lcd1(0x26,16,2);  // set the LCD address of the first lcd to 0x26 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd2(0x27,16,2);  // set the LCD address of the second lcd to 0x27 for a 16 chars and 2 line display
 
void setup()
{
  lcd1.init();                      // initialize the first lcd 
  lcd2.init();                      // initialize the second lcd 
 
  // Print a message on the first LCD.
  lcd1.backlight();
  lcd1.print("Hello, #1 world!");
 
  // Print a message on the second LCD.
  lcd2.backlight();
  lcd2.print("Hello, #2 world!");
 
}
 
void loop()
{
}

Les deux afficheurs fonctionnent mais affichent la même valeur (" Hello, #2 world!")

Un problème de librairie ?

Si l'un d'entre vous peut déjà m'indiquer la librairie correspondante à mon matériel, cela me permettrai déjà d'éliminer peut être la source du problème.

Afficheur LCD 1602 avec contrôleur I2C PCF8574T

merci

Bonjour,
i2cKeypad

icare:
Bonjour,
i2cKeypad

Merci, mais cela ne fonctionne pas. En fait la librairie contient un fichier en .pde , là j'avoue être un peu perdu.

Mon branchement , mais avec deux afficheurs en //

Bonjour,

Les 2 afficheurs sont à la même adresse (0x27 ) par construction, suivant le cablage des broches A0 A1 A2 du PCF8574, ces pattes, en l'occurence, elles sont à 5V. Donc si tu déclares un afficheur à 0x26 le protocole I2C ne trouve rien à cette adresse "lcd1".
En revanche à 0x27 il en trouve 2 et affiche donc la même chose sur les 2. (je découvre que 2 circuits cablés à la même adresse ça peut marcher, sans planter le protocole!)
La solution c'est de modifier ce cablage d'une de ces 3 pattes, mais là il faut une bonne vue et des doigts agiles!

doc
L' option multiple adresse a été retenue sur un modèle voisin (version3) , toi tu aurais la version1?

Re,

fredebutant:
Merci, mais cela ne fonctionne pas. En fait la librairie contient un fichier en .pde , là j'avoue être un peu perdu.
Mon branchement , mais avec deux afficheurs en //
http://1.bp.blogspot.com/-At3a7yignb0/U7A0qSqwMWI/AAAAAAAABYk/XDj9GOsNWzY/s1600/i2c_03.jpg

La librairie fonctionne très bien mais elle a été développé dans une ancienne version. Les .pde sont devenus des .ino
Essaye les exemples de la lib pour voir les erreurs et de faire les corrections nécessaires.

Pour que la liaison I2C fonctionne, il faut deux résistances (4.7k) de rappel au +5V que je ne vois pas sur ton schéma de câblage.
@+

papybricol:
Bonjour,

La solution c'est de modifier ce cablage d'une de ces 3 pattes, mais là il faut une bonne vue et des doigts agiles!

doc
L' option multiple adresse a été retenue sur un modèle voisin (version3) , toi tu aurais la version1?

Merci pour la réponse, par rapport à la doc j'ai la version 3 mais par contre les ponts A0,A1,A2 ne sont pas soudés (je vais essayer de mettre une photo)

icare:
Re,La librairie fonctionne très bien mais elle a été développé dans une ancienne version. Les .pde sont devenus des .ino
Essaye les exemples de la lib pour voir les erreurs et de faire les corrections nécessaires.

Pour que la liaison I2C fonctionne, il faut deux résistances (4.7k) de rappel au +5V que je ne vois pas sur ton schéma de câblage.
@+

J'ai respecté ce schéma , par contre je n'ai que des résistances de 6.8k (kilohms)

Photos :wink:

Re,

fredebutant:
J'ai respecté ce schéma , par contre je n'ai que des résistances de 6.8k (kilohms)

Pas de pb 6.8k fera l'affaire
[edit]
Dans ce cas les 2 afficheurs ont la même adresse.
Il faut modifier l'adresse d'un des LCD en mettant un pont sur A0 par exemple

icare:
Re,Pas de pb 6.8k fera l'affaire
[edit]
Dans ce cas les 2 afficheurs ont la même adresse.
Il faut modifier l'adresse d'un des LCD en mettant un pont sur A0 par exemple

Si je suis bien, je dois faire un point de soudure sur A0 mais dans ce cas cela signifie que je suis limité à 3 afficheurs ou 4 max ?

adresse 1 : (0X27)
adresse 2 : seul AO est soudé (ponté)
adresse 3 : seul A1
adresse 4 : seul A2

Re,

fredebutant:
Slt,

J'essaie avec les deux codes proposés dans les exemples de la version 1.0.6 (arduino). Raccordement des afficheurs avec des cables connecteurs (pas de soudure) . Je pense pas que le problème vienne de là, ils fonctionnent tout les deux indépendamment avec d'autres codes

/*

Programme : Affichage CLCD via I2C
création : 04/05/2012 - mise à jour : 10/05/2012
version  : 1.0 - Utilisation via I2C
          1.1 - Création bibliothèque clcd
auteur   : Patrice Seibel
support  : Arduino Duemilanove
/
/

Le programme exploite l'afficheur CLCD204 de la société Comfile qui est destiné à être
utilisé avec les micro-contrôleurs de la gamme Cobloc via le bus Cunet.
Les fonctions implantées sont :
 - Locate                                  X      ESC 'L' x y + 100 microe sec
 - Print                                   X      texte à afficher
 - CsrOn (Curseur On)                      X      ESC 'S'
 - CsrOff (Curseur Off)                    X      ESC 's'
 - Backlight On                            X      ESC 'B'
 - Backlight Off                           X      ESC 'b'
 - Cls (Efface écran)                      X      ESC 'C' + 15 ms
 - Home (équivalent à Locate 0,0)          X      ESC 'H'
 - Print 1 (Début première ligne)          X      01
 - Print 2 (Début deuxième ligne)          X      02
 - Print 3 (Début troisième ligne)         X      03
 - Print 4 (Début quatrième ligne)         X      04
 - Création caractère                      X      ESC 'D' x1 x2  x3 x4 x5 x6 x7 x8
 autres
 - SuperPrint (équivalent Locate + Print)  X
/
//
************************************************************************************
//Directives
//*************************************************************************************

#include "Wire.h"
#include "CLCD.h"

#define LED 9                    //Pin 9 pour la led

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

CLCD lcd;

int i = 0;                       //Variable de comptage et décomptage
float TEMPS = 500;               //Pause
float ATTENTE = 1000;            //Attente
char Dummy[21] = "Hello world";
char test[] = "";

//*************************************************************************************
//Initialisation
//*************************************************************************************
void setup()
{
pinMode(LED, OUTPUT);          //Met la pin en sortie

lcd.backLight_on();                //Eteint backlight
delay(ATTENTE);                //Attente
lcd.cls();                         //Efface l'écran
delay(ATTENTE);                //Attente
lcd.backLight_off();               //Eteint backlight
delay(ATTENTE);                //Attente
lcd.backLight_on();                //Allume backlight
lcd.locate(19,0);                  //Positionne le curseur en 19,0
delay(ATTENTE);                //Attente
lcd.locate(5,2);                   //Positionne le curseur en 5,2
lcd.print("Coucou");               //Affiche le texte à la position courante du curseur
delay(ATTENTE);                //Attente
lcd.locate(2,0);                   //Positionne le curseur en 5,2
lcd.print (Dummy);                 //Affiche le message de la variable Dummy
lcd.curseurOff();                  //Efface le curseur
delay(ATTENTE);                //Attente
delay(ATTENTE);                //Attente
lcd.locate(0,1);                   //Positionne le curseur
lcd.curseurOn();                   //Affiche le curseur
delay(ATTENTE);                //Attente
lcd.hline0();                      //Curseur en début ligne 0
delay(ATTENTE);                //Attente
lcd.hline1();                      //Curseur en début ligne 1
delay(ATTENTE);                //Attente
lcd.hline2();                      //Curseur en début ligne 2
delay(ATTENTE);                //Attente
lcd.hline3();                      //Curseur en début ligne 3
lcd.print("Fin");                  //Affiche le message
delay(ATTENTE);                //Attente
lcd.superPrint(16,1,"ips");        //Positionne le curseur et affiche le texte
delay(ATTENTE);
lcd.print(">");
//Création caractère personnalisé oméga
lcd.carac(0x08,0x04,0x0A,0x11,0x11,0x0A,0x0A,0x1B,0x00);
lcd.locate(10,3);                  //Positionne le curseur
lcd.cls();
lcd.locate(19,3);
lcd.print("\x08");                 //Affiche le caractère perso oméga
lcd.print("\x08");                 //Affiche le caractère perso oméga
delay(ATTENTE);                //Attente
lcd.curseurOff();                  //Eteint le curseur
}

//*************************************************************************************
//Boucle d'exploitation (sans fin)
//*************************************************************************************
void loop()
{
for(i = 0; i <= 255; i++) {     //Boucle de 0 à 254 (allumage)
  analogWrite(LED, i);          //Fixe la luminosité
  delay(10);                    //Pause de 10 ms pour laisser le temps de
                                //Stabilisation à analogWrite
}
delay(TEMPS);                   //Attente TEMPS ms

for(i = 255; i >= 0; i--) {     //Boucle de 255 à 1 (extinction)
  analogWrite(LED, i);          //Règle la luminosité
 delay(10);                     //Pause 10 ms
}
delay(TEMPS);                   //Attente TEMPS ms
}




Je peux téléverser mais pas d'affichage, j'ai un doute sur le fait que ce code soit compatible avec mes afficheurs [u]"l'afficheur CLCD204[/u] "

Il faudrait regarder l'adresse I2C de l'afficheur dans CLCD.h ou .cpp, en général il y a peu de différence sur ce type de LCD

fredebutant:
Avec le deuxième code "Multiple LCD", là c'est mieux mais problème également

#include <Wire.h> 

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd1(0x26,16,2);  // set the LCD address of the first lcd to 0x26 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd2(0x27,16,2);  // set the LCD address of the second lcd to 0x27 for a 16 chars and 2 line display

void setup()
{
 lcd1.init();                      // initialize the first lcd
 lcd2.init();                      // initialize the second lcd

// Print a message on the first LCD.
 lcd1.backlight();
 lcd1.print("Hello, #1 world!");

// Print a message on the second LCD.
 lcd2.backlight();
 lcd2.print("Hello, #2 world!");

}

void loop()
{
}




Les deux afficheurs fonctionnent mais affichent la même valeur (" Hello, #2 world!")

Un problème de librairie ?

Non un problème d'adresse I2C, ils sont tous les deux en 0x20 (au sens Arduino puisqu'on tient pas compte du bit R/W)
Si tu faits un pont sur A0 tu auras l'adresse 0x21 pour le second LCD.

Re,

fredebutant:
Si je suis bien, je dois faire un point de soudure sur A0 mais dans ce cas cela signifie que je suis limité à 3 afficheurs ou 4 max ?

adresse 1 : (0X27)
adresse 2 : seul AO est soudé (ponté)
adresse 3 : seul A1
adresse 4 : seul A2

Non, il faut revenir aux bases 2^3 = 8 adresses différentes.

A0 A1 A2

      • adresse 0x20
        P - - adresse 0x21
        .
        .
        .
        P P P adresse 0x27

Je viens de ponter sur A0 et.........ça fonctionne !!! :smiley: :smiley:

Un GRAND MERCI à vous tous pour votre précieuse aide et patience.

@+

:sunglasses: