Caracteres etranges sur un lcd I2C

Bonjour à tous,
Je me bat avec mon Arduino depuis plus d’un mois, j’en peux plus, une petite aide serait appréciable…
j’ai connecté mon arduino nano à un lcd avec une interface I2C,a un module RTC DS1307,et a 2 PCA8574A…
mon problème est que j’obtiens des caractères bizarres sur mon lcd lorsque j’envoie des trames I2C à un autre composant ou module…
j’ai essayé plusieurs bibliothèques différentes et j’ai toujours le même problème…
voici mon code pour la gestion du lcd

#include <Wire.h>
#include <Arduino.h>
#include "LiquidCrystal_I2C_Spark.h"


LiquidCrystal_I2C *lcd;


void setup() {

  lcd = new LiquidCrystal_I2C(0x22, 16, 2);
  lcd->init();
  lcd->backlight();
  lcd->clear();
  lcd->print("***Spark Time***"); 
  
}

ou encore…

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

LiquidCrystal_I2C lcd(0x22,16,2);  


void setup() {

  lcd.init();                     
  delay(10);

  lcd.begin(16,2);
  lcd.backlight();
  lcd.clear();              // clear display, set cursor position to zero

}

et des que j’envoie une trame I2C pour interroger un esclave ou me déplacer dans un menu, j’obtiens ces fameux caractères étranges…

Est ce que cela est deja arrivé a quelqu’un ?
Merci d’avance pour votre aide

arnaudf09:
Bonjour à tous,
Je me bat avec mon Arduino depuis plus d'un mois, j'en peux plus, une petite aide serait appréciable...
j'ai connecté mon arduino nano à un lcd avec une interface I2C,a un module RTC DS1307,et a 2 PCA8574A...
mon problème est que j'obtiens des caractères bizarres sur mon lcd lorsque j’envoie des trames I2C à un autre composant ou module...

bonjour
ton module I²C/LCD est basé sur quel composant ? un PCA8574 aussi ?

bonjour,

Les bouts de codes que tu as donnés ne concerne que le LCD et ça, ça marche?
Donnes plutôt le code qui pose problème.
Définition des adresses des périphériques I2C etc..

Bonjour et merci pour votre aide...
Pour le module LCD, c'est un PCF8574T Avec comme adresse 0100+ A2à0 + A1à1 + A0à0 donc 0x22.
pour les autres se sont des PCA8574AD avec pour adresse 0x38 et 0x39 pour le suivant...
Pour ce problème, j'ai isolé chaque partie car j'avais en plus sur le même bus i2C, 2 autres carte mini et 2 LCD en i2c et des P82B715 qui sont des amplis de bus... et j'avais le même problème sur les lcd des autres cartes arduino
je suis donc revenu a la version la plus simple:
1 Horloge DS1307
1 LCD en I2C
2 PCA8574AD
1 Nano
le problème intervient tout seul, sans rien toucher a partir d'un certain moment ou lorsque je configure le ds1307 ou lorsque j’envoie une trame i2C demandant l’état logique de cette carte

voila le code qui fait afficher des caractères étranges

void requestEvent()
{
  
///////////////////////////////////////////////////////////////////////
  // Variables à envoyer lors d'une requete I2C recue par le Maitre
  Variable_Maitre_1[0] = Adresse_I2C_Centrale,HEX;  
  Variable_Maitre_1[1] = Etat_Centrale_Bureau_I2C,HEX;
  Variable_Maitre_1[2] = Etat_Alarme_I2C,HEX;
///////////////////////////////////////////////////////////////////////
    
  Wire.write(Variable_Maitre_1,Nombre_Octets_A_Recevoir); 
  delay(15); } // Fin du void requestEvent()

ou bien lorsque je navigue dans les menus

  MenuItem newMenuItem=changed.to; //get the destination menu
  
  lcd.setCursor(0,1);

  if(newMenuItem.getName()==menu.getRoot())
  {
    lcd.clear();
    delay(10); // pour laisser temps effacer écran
    lcd.setCursor(0,0);  
    lcd.print(" DOMOTIQUE AFA  ");
    lcd.setCursor(0,1);  
    lcd.print(" Menu Principal ");  
  }
  else if(newMenuItem.getName()=="1")
  {
    lcd.clear();
    delay(10); // pour laisser temps effacer écran
    lcd.setCursor(0,0);  
    lcd.print(" DOMOTIQUE AFA  ");
    lcd.setCursor(0,1);  
    lcd.print("1     Etats     ");
  }
  else if(newMenuItem.getName()=="1.1")
  {
    lcd.clear();
    delay(10); // pour laisser temps effacer écran
    lcd.setCursor(0,0);  
    lcd.print(" DOMOTIQUE AFA  ");
    lcd.setCursor(0,1);  
    lcd.print("1.1 Horloge     ");
  }
  else if(newMenuItem.getName()=="1.2")
  {
    lcd.clear();
    delay(10); // pour laisser temps effacer écran
    lcd.setCursor(0,0);  
    lcd.print(" DOMOTIQUE AFA  ");
    lcd.setCursor(0,1);  
    lcd.print("1.2 Alarme Int  ");
  }
  else if(newMenuItem.getName()=="1.3")
  {
    lcd.clear();
    delay(10); // pour laisser temps effacer écran
    lcd.setCursor(0,0);  
    lcd.print(" DOMOTIQUE AFA  ");
    lcd.setCursor(0,1);  
    lcd.print("1.3 Alarme Inc  ");
  }
  else if(newMenuItem.getName()=="1.4")
  {
    lcd.clear();
    delay(10); // pour laisser temps effacer écran
    lcd.setCursor(0,0);  
    lcd.print(" DOMOTIQUE AFA  ");
    lcd.setCursor(0,1);  
    lcd.print("1.4 Version Soft");
  }
  else if(newMenuItem.getName()=="2")
  {
    lcd.clear();
    delay(10); // pour laisser temps effacer écran
    lcd.setCursor(0,0);  
    lcd.print(" DOMOTIQUE AFA  ");
    lcd.setCursor(0,1);  
    lcd.print("2 Configuration ");
  }
  else if(newMenuItem.getName()=="2.1")
  {
    lcd.clear();
    delay(10); // pour laisser temps effacer écran
    lcd.setCursor(0,0);  
    lcd.print(" DOMOTIQUE AFA  ");
    lcd.setCursor(0,1);  
    lcd.print("2.1 Horloge     ");
  }
  else if(newMenuItem.getName()=="2.2")
  {
    lcd.clear();
    delay(10); // pour laisser temps effacer écran
    lcd.setCursor(0,0);  
    lcd.print(" DOMOTIQUE AFA  ");
    lcd.setCursor(0,1);  
    lcd.print("2.2 Rearm Inc   ");
  }
  else if(newMenuItem.getName()=="2.3")
  {
    lcd.clear();
    delay(10); // pour laisser temps effacer écran
    lcd.setCursor(0,0);  
    lcd.print(" DOMOTIQUE AFA  ");
    lcd.setCursor(0,1);  
    lcd.print("2.3 Active Inc  ");
  }
  else if(newMenuItem.getName()=="3")
  {
    lcd.clear();
    delay(10); // pour laisser temps effacer écran
    lcd.setCursor(0,0);  
    lcd.print(" DOMOTIQUE AFA  ");
    lcd.setCursor(0,1);  
    lcd.print("3  Hystorique   ");
  }
  else if(newMenuItem.getName()=="3.1")
  {
    lcd.clear();
    delay(10); // pour laisser temps effacer écran
    lcd.setCursor(0,0);  
    lcd.print(" DOMOTIQUE AFA  ");
    lcd.setCursor(0,1);  
    lcd.print("3.1 Evenements  ");  
  }
  else if(newMenuItem.getName()=="3.2")
  {
    lcd.clear();
    delay(10); // pour laisser temps effacer écran
    lcd.setCursor(0,0);  
    lcd.print(" DOMOTIQUE AFA  ");
    lcd.setCursor(0,1);  
    lcd.print("3.2 RAZ Events  "); 
  }

ou bien en réglant l'horloge

// Fonction configurant le DS1307 avec la date/heure fourni
void ecrire(Date *date) {
  Wire.beginTransmission(Adresse_Horloge); // Début de transaction I2C
  Wire.write(0); // Arrête l'oscillateur du DS1307
  Wire.write(dec2bcd(date->secondes)); // Envoi des données
  Wire.write(dec2bcd(date->minutes));
  Wire.write(dec2bcd(date->heures));
  Wire.write(dec2bcd(date->jourDeLaSemaine));
  Wire.write(dec2bcd(date->jour));
  Wire.write(dec2bcd(date->mois));
  Wire.write(dec2bcd(date->annee));
  Wire.write(0); // Redémarre l'oscillateur du DS1307
  Wire.endTransmission(); // Fin de transaction I2C
  delay(15);

même mon scanner I2C qui est une micro arduino et un module LCD en I2C se retrouve également a faire des caractères étranges, je ne comprend plus rien...

arnaudf09:
même mon scanner I2C qui est une micro arduino et un module LCD en I2C se retrouve également a faire des caractères étranges, je ne comprend plus rien...

tu a quoi comme R de pull-up resultante ?
il y a peut etre trop de R en // ?

Ben justement, je n’en ai pas mis car le module RTC en a deja de 3.3K. mais j’ai fait des tests avec différentes valeurs et ca na rien changé… Apres j’ai posé un analyseur de spectre sur le bus SDA et je le trouve saturé… Je cherche encore d’ou vient le probleme. Depuis le debut, j’ai deja refais mon programme 3 fois et demonter les esclaves x fois… on va bien finir par y arriver.
regarde le spectre comment il est saturé

arnaudf09:
Ben justement, je n'en ai pas mis car le module RTC en a deja de 3.3K. mais j'ai fait des tests avec différentes valeurs et ca na rien changé... Apres j'ai posé un analyseur de spectre sur le bus SDA et je le trouve saturé... Je cherche encore d'ou vient le probleme. Depuis le debut, j'ai deja refais mon programme 3 fois et demonter les esclaves x fois... on va bien finir par y arriver.
regarde le spectre comment il est saturé

oui , mais il y en a surement aussi sur le lcd/i²c (chez moi c'est du 4.7K) ce qu'il faut voir c'est la résultante R finale cablée
ça c'est le resultat d'un analyseur logique, pas d'un analyseur de spectre :grin:
on ne peux rien determiner de ta photo , il faudrai une capture du fichier , de plus il semble que tu ai mis le trigger sur SDA , c'est plutot sur SCL qu'il faudrait le mettre

bonjour,
Désolé, j’écris plus vite que ce que je pense. C’est bien un analyseur logique, l’analyseur de spectre, c’est un oscillo à memoire… je suis électronicien en plus mais comme je t’ai dis plus haut, j’écris plus vite que ce que je pense… j’essaye encore quelques trucs et je vais essayer d’avoir un fichier exploitable…
si vous avez des idées, faites partager.
Merci

Re,
Si j'utilise la nano, l'horloge(avec ses R pull up de retirées), le module LCD I2C(avec ses R pull up de retirées), je suis obligé de mettre des 4.7K sur le bus I2C.
Par contre, si je connecte ma arduino mega 2560 sur le bus, je suis obligé de retirer les 4.7K car la mega en a déjà de 10K sur son bus. mais des que je met la mega sur le bus I2C, j'obtiens des caractères bizarre...

Pour info, j’utilise le montage suivant mais que j’ai déconnecté pour les tests…

i2cbufferedss1.jpg

Saviez vous que les P82B715 ( Buffer I2C) Sont transparent entre l’entrée et la sortie. j’obtiens une valeur proche de 0 Ohms… j’ai fais le test sur un composant cms neuf, que j’ai déballé…
Donc dans le schéma joint précédemment, les 470 Ohms en parallèle sur le bus I2C bufferisé se retrouve en parallèle donc on obtient une valeur a environ 235 Ohms sur le bus, je crois que c’est la le problème…
je continue de chercher entre temps. En attente d’un de vos commentaires…

J'ai trouvé une piste, sur les 5 modules LCD I2C que j'ai commandés il y a un moment, sur les 5, 2 résistances cms sont interverties comme j'utilisais les 3 modules sur le mêmes bus, j'avais une R équivalente de 3x // D'environ 330 Ohms. donc voila le problème... Maintenant, me reste plus qu'a tout rebrancher, j'en ai pour un moment... Je vous confirmerais si ça marche. en attente d'un de vos commentaires...

par contre, sur les 10 Modules LCD I2C que je viens de commander, qui sont identiques aux anciens, ont bien les bonnes résistances au bon endroits... Merci Messieurs Chinois, j'ai perdu 1 mois de travail...

arnaudf09:
J’ai trouvé une piste, sur les 5 modules LCD I2C que j’ai commandés il y a un moment, sur les 5, 2 résistances cms sont interverties comme j’utilisais les 3 modules sur le mêmes bus, j’avais une R équivalente de 3x // D’environ 330 Ohms. donc voila le problème… Maintenant, me reste plus qu’a tout rebrancher, j’en ai pour un moment… Je vous confirmerais si ça marche. en attente d’un de vos commentaires…

bonsoir
C’est un peu ce que je “pressentais” depuis le début 8)
Verifier les R resultantes sur les lignes I²C c’est une des premieres choses à faire lorsque l’on utilise plusieurs modules differents.
perso je suis partisan du pas de R sur les modules et R externes sur le bus

Oui, c'est bien la direction que tu m'as donné et je t'en remercie, par contre, puis je mettre des R de 20K sur mes modules pour avoir une R totale 3.3K
car je m'explique:
la Mega a 10K de pull up sur son sda et scl.
Ma centrale maitre a juste 4.7K
Mon clavier 1 n'a pas R de pull up
Mon 2eme clavier, identique
donc ma R totale est d'environ 2.2K

arnaudf09:
Oui, c'est bien la direction que tu m'as donné et je t'en remercie, par contre, puis je mettre des R de 20K sur mes modules pour avoir une R totale 3.3K
car je m'explique:
la Mega a 10K de pull up sur son sda et scl.
Ma centrale maitre a juste 4.7K
Mon clavier 1 n'a pas R de pull up
Mon 2eme clavier, identique
donc ma R totale est d'environ 2.2K

tout ce "beau monde" est toujours present sur le bus ?
les 10K sur la mega c'est toi qui les a ajoutés ?

Je fais des tests avec ou sans tous ce beau monde... J'essaye d'avoir 5K de R total.
Non sur la Mega, ce n'est pas moi, je crois que cela doit etre interne...

pour la mega 2560, je viens d'en déballer une neuve et elle a bien une pull up sur son sda et sur scl...

arnaudf09:
...
Non sur la Mega, ce n'est pas moi, je crois que cela doit etre interne...

Tu es sur de toi là ?
tu a verifié à l'ohmetre la valeur entre scl/sda et VCC sur la mega deconnectée
je n'ai pas de mega sous la main , mais sur un uno je n'ai pas de R significatif entre sda/scl et VCC