[résolu] Problème d'affichage LCD 4x16 Caractères

Je ne comprends pas ce qui se passe !

J'ai branché un afficheur LCD 4x16 caractères sur une carte Arduino mega 2560
=> pas de problème (si ce n'est un décalage de 4 caractères pour les lignes 3 et 4 => il faut mettre -4 pour les colonnes).

voici le code qui fonctionne :

// --- Programme Arduino ---

// --- Que fait ce programme ? ---
/* Affiche des messages texte sur l'afficheur LCD*/

// --- Fonctionnalités utilisées ---
// Utilise un afficheur LCD 4x16 en mode 4 bits 

// --- Circuit à réaliser ---

// Connexion du LCD sur les broches de la carte Arduino 
// Connecter broche RS du LCD sur la broche 2
// Connecter broche E du LCD sur la broche 3
// Connecter broche D4 du LCD sur la broche 4
// Connecter broche D5 du LCD sur la broche 5
// Connecter broche D6 du LCD sur la broche 6
// Connecter broche D7 du LCD sur la broche 7

//**************** Entête déclarative *******
// A ce niveau sont déclarées les librairies, les constantes, les variables...

// --- Inclusion des librairies utilisées ---
#include <LiquidCrystal.h> // Inclusion de la librairie pour afficheur LCD 

// --- Déclaration des constantes ---

// --- constantes des broches ---

const int RS=2; //declaration constante de broche 
const int E=3; //declaration constante de broche 

const int D4=4; //declaration constante de broche 
const int D5=5; //declaration constante de broche 
const int D6=6; //declaration constante de broche 
const int D7=7; //declaration constante de broche 

// --- Déclaration des variables globales ---

// --- Initialisation des fonctionnalités utilisées ---
LiquidCrystal lcd(RS, E, D4, D5, D6, D7);// initialisation LCD en mode 4 bits 

//**************** FONCTION SETUP = Code d'initialisation *****
// La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme

void setup()   { // debut de la fonction setup()

// --- ici instructions à exécuter au démarrage --- 

lcd.begin(16,4); // Initialise le LCD avec 16 colonnes x 4 lignes 

delay(10); // pause rapide pour laisser temps initialisation

// Test du LCD

lcd.print("TEST LCD 4x16") ; // affiche la chaîne texte - message de test
delay(2000); // pause de 2 secondes

} // fin de la fonction setup()
// ********************************************************************************

//*************** FONCTION LOOP = Boucle sans fin = coeur du programme *************
// la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension

void loop(){ // debut de la fonction loop()

lcd.setCursor(0, 1) ; // 1ère col - 2ème ligne - positionne le curseur à l'endroit voulu (colonne, ligne) (1ère colonne =0, 2ème ligne=1 !) 
lcd.print("Salut...") ; // affiche la chaîne texte - message de test
delay(2000); // pause de 2 secondes

lcd.setCursor(-4, 2) ; // 1ère col - 2ème ligne - positionne le curseur à l'endroit voulu (colonne, ligne) (1ère colonne =-4, 3ème ligne=2 !) 
lcd.print("essais affichage") ; // affiche la chaîne texte - message de test
delay(2000); // pause de 2 secondes

lcd.setCursor(-4, 3) ; // 1ère col - 2ème ligne - positionne le curseur à l'endroit voulu (colonne, ligne) (1ère colonne =-4, 4ème ligne=3 !) 
lcd.print("LCD 4x16 carac.") ; // affiche la chaîne texte - message de test
delay(2000); // pause de 2 secondes

lcd.clear(); // // efface écran et met le curseur en haut à gauche
delay(10); // pour laisser temps effacer écran

// --- ici instructions à exécuter par le programme principal --- 

} // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin

Ensuite j'ai branché mon horloge RTC DS1307 tout fonctionne, sauf pour l'affichage, où la ligne 4 vient se positionner à la ligne 2.

J'ai fait différents essais => j'ai toujours le même problème.

Voici le code pour l'affichage avec l'horloge :

Affichage date et heure sur afficheur LCD 4x16
Real Time Clock DS1307 
*/
  
#include <WProgram.h> // nécessaire (je ne sais pas pourquoi !!!)

#include <Wire.h> // librairie I2C
#include <DS1307.h> // librairie pour RTC DS1307
#include <LiquidCrystal.h> // librairie pour afficheur LCD
  
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);  // mode 4 bits - RW non connectée
                                      // rs = broche 4 LCD => broche 2 Arduino
                                      // enable = broche 6 LCD => broche 3 Arduino
                                      // d4 = broche 11 LCD => broche 4 Arduino
                                      // d5 = broche 12 LCD => broche 5 Arduino
                                      // d6 = broche 13 LCD => broche 6 Arduino
                                      // d7 = broche 17 LCD => broche 7 Arduino
int rtc[7];  // déclaration d'un tableau de 7 entiers

void setup() 
{ 
  Serial.begin(9600); 
  lcd.begin(16, 2); // afficheur 16 colonnes, 2 lignes
  lcd.clear(); // efface LCD
  lcd.setCursor(0,0); // positionne curseur colonne 0, ligne 0
  lcd.print("TEST LCD + RTC"); 

// Décommenter la partie suivante et mettez vos valeurs pour initialiser l'horloge 
/*
  RTC.stop(); 
  RTC.set(DS1307_SEC,0);    // Secondes 
  RTC.set(DS1307_MIN,15);   // Minutes 
  RTC.set(DS1307_HR,11);    // Heures 
  RTC.set(DS1307_DOW,6);    // Jour de la semaine 
  RTC.set(DS1307_DATE,10);  // Jour du mois 
  RTC.set(DS1307_MTH,03);   // Mois 
  RTC.set(DS1307_YR,12);    // Année 
  RTC.start(); 
*/

} 
  
void loop() 
{ 
  RTC.get(rtc,true); 
  
  for(int i=0; i<7; i++) 
  { 
    Serial.print(rtc[i]); // lecture donnée RTC DS 1307
    Serial.print(" "); 
  } 
  Serial.println();
  
  //lcd.clear(); // efface LCD 
  
  lcd.setCursor(0, 1); // positionne curseur colonne 0, ligne 2
  
  // affichage jour
  if (rtc[4]<10)
  {
    lcd.print("0");
  }  
  lcd.print(rtc[4]); 
  lcd.print("/");
  // affichage mois
  if (rtc[5]<10)
  {
    lcd.print("0");
  }  
  lcd.print(rtc[5]); 
  lcd.print("/"); 
  lcd.print(rtc[6]);

  lcd.setCursor(-4, 2); // positionne curseur colonne 0, ligne 3
  
  // affichage heures
  if (rtc[2]<10)
  {
    lcd.print("0");
  }  
  lcd.print(rtc[2]); 
  lcd.print(":");
  // affichage minutes
  if (rtc[1]<10)
  {
    lcd.print("0");
  } 
  lcd.print(rtc[1]); 
  lcd.print(":");
  // affichage secondes
  if (rtc[0]<10)
  {
    lcd.print("0");
  }
  lcd.print(rtc[0]); 
  
  lcd.setCursor(-4, 3); // positionne curseur colonne 0, ligne 4
  lcd.print("ver. 0.0   03/12"); 
  
  delay(500); // attente 0,5 sec.
}

Si quelqu'un avait une idée, ou a déjà rencontré ce problème.
Merci pour votre aide.

J'ai trouvé c'était vraiment trop bête (une grosse erreur de ma part !!!) :roll_eyes::

=> J'avais laissé

lcd.begin(16,2); // Initialise le LCD avec 16 colonnes x 4 lignes

au lieu de :

lcd.begin(16,4); // Initialise le LCD avec 16 colonnes x 4 lignes

pourtant j'avais cherché, pas assez et pas au bon endroit !!!