Ecran LCD avec l’ESP8285 sous Arduino

Comment gère-t-on un écran LCD par l’interface I2C avec l’ESP8285 sous Arduino ?

Afficher sur un écran LCD1602 avec l'ESP8285

Cet article vous explique la procédure de manière détaillée. Cette procédure peut-être transposée à tous les modules non-gérés nativement par l’Arduino IDE.

Le matériel nécessaire

Voici les éléments requis pour cette réalisation:

Carte de développement ESP8285 NodeMCU-M Cordon USB de type Micro-B (Micro USB) Platine d'essai 830 points
Carte ESP8285 Câble USB Micro-B Plaque d’essai
Ecran LCD1602 avec module I2C  
Ecran I2C LCD 1602 Connecteur M/F  

Câblage

L’écran LCD 1602 choisi pour ce projet offre une interface I2C, ce qui simplifie son branchement puisque seulement 2 fils sont nécessaires pour la transmission des données à afficher. L’ESP8285 n’a pas de port dédié à l’interface I2C. Dans ce tutoriel nous choisissons les ports 4 et 5 :

  • la broche SDA de l’écran OLED est reliée à la sortie 5 (IO5) de l’ESP8285,
  • la broche SCL est reliée à la sortie 4 (IO4) de l’ESP8285.

Pour l’alimentation, de l’écran vous reliez:

  • la broche VCC de l’écran au 5V de l’ESP8285,
  • les deux masses ensemble (GND).
Branchement d'un écran LCD1602 sur une carte de développement ESP8285

Bibliothèque de gestion de l’écran LCD

Pour la gestion de l’écran LCD 1602 par l’interface I2C, nous allons installer une bibliothèque standard d’Arduino que nous allons ensuite modifier pour la rendre utilisable avec des microcontrôleurs non Arduino comme l’ESP8285.

Installation de la bibliothèque:

Je vous invite à installer la bibliothèque Arduino LiquidCrystal_I2C nommée « LiquidCrystal I2C » by Frank de Brabander. Pour plus d’information sur la procédure d’installation d’une bibliothèque sous Arduino, reportez-vous au chapitre « Installation d’une bibliothèque pour l’écran OLED » de l’article « Température et humidité avec Arduino ».

Emplacement des fichiers de la bibliothèque:

Une fois la bibliothèque installée, nous allons améliorer certains fichiers du code source de la bibliothèque. Pour savoir à quel endroit sont stockées les bibliothèques Arduino sur votre PC, il vous suffit de consultez votre paramétrage. Pour cela, dans le menu « Fichier », cliquez sur « Préférences »:

Emplacement des croquis Arduino

… dans la zone de saisie « Emplacement du carnet de croquis » se trouve renseignée l’emplacement du répertoire racine « croquis ». Les bibliothèques Arduino installées sur le PC sont localisées dans le sous-répertoire « libraries ».

Dans la bibliothèque « LiquidCrystal_I2C » nous allons modifier les fichiers « LiquidCrystal_I2C.h », « LiquidCrystal_I2C.cpp » et « library.properties » pour les rendre compatibles avec l’ESP8285. Cette modification consiste à rendre possible le passage en paramètre des numéros de ports « SDA » et « SCL » de connexion des cables de données de l’afficheur LCD. (Plutôt que d’utiliser ceux par défaut de la librairie qui ne correspondent pas à des numéros de ports disponible de notre microcontrôleur ESP8285.) Concrètement, la méthode « init() » d’initialisation de la librairie va être surchargée par la méthode « init(uint8_t NoPortSDA_P, uint8_t NoPortSCL) ».

Modification du fichier « LiquidCrystal_I2C.cpp »

Ouvrez le fichiez « LiquidCrystal_I2C.cpp«  avec un simple éditeur de code source comme par exemple Notepad++, puis recherchez le corps de la méthode « init()« :

void LiquidCrystal_I2C::init(){
	init_priv();
}

Nous constatons que cette méthode publique est une simple encapsulation de la méthode privée « init_priv ».

Surchargez  la méthode « init() » afin de permettre le passage en paramètre des numéro de port SDA et SCL. Vous obtenez le résultat suivant:

void LiquidCrystal_I2C::init(){
	init_priv();
}

void LiquidCrystal_I2C::init(uint8_t NoPortSDA_P, uint8_t NoPortSCL_P)
{
	init_priv(NoPortSDA_P, NoPortSCL_P);
}

Maintenant, recherchez le corps de la méthode « init_priv() »:

void LiquidCrystal_I2C::init_priv()
{
	Wire.begin();
	_displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS;
	begin(_cols, _rows);  
}

De la même manière que précédemment, surchargez  la méthode « init_priv() » afin de permettre le passage en paramètre des numéro de port SDA et SCL. Voici le résultat que vous obtenez:

void LiquidCrystal_I2C::init_priv()
{
	Wire.begin();
	_displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS;
	begin(_cols, _rows);  
}

void LiquidCrystal_I2C::init_priv(uint8_t NoPortSDA_P, uint8_t NoPortSCL_P)
{
	Wire.begin(NoPortSDA_P, NoPortSCL_P);
	_displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS;
	begin(_cols, _rows);  
}

Modification du fichier « LiquidCrystal_I2C.h »

Ce fichier header « LiquidCrystal_I2C.h »  contient la déclaration des fonctions, méthodes, événements et propriétés. Ouvrez-le puis recherchez la déclaration de la méthode « init() »:

  void init();

Ajoutez la déclaration de la surcharge de la méthode. Vous obtenez le résultat suivant:

  void init();
  void init(uint8_t, uint8_t);

Puis recherchez la déclaration de la méthode « init_priv() »:

  void init_priv();

Ajouter également la surcharge. Vous obtenez:

  void init_priv();
  void init_priv(uint8_t, uint8_t);

Modification du fichier « library.properties »

La modification de ce fichier « library.properties » est facultative, elle a pour but de supprimer le message d’avertissement suivant

« ATTENTION : la bibliothèque LiquidCrystal_I2C prétend être exécutable sur la (ou les) architecture(s) avr et peut être incompatible avec votre carte actuelle qui s’exécute sur esp8266. »

qui va s’afficher lors de la compilation de la librairie à destination du microcontrôleur ESP8285. Ouvrez le fichier « library.properties » puis recherchez le mot clef « architectures= » situé habituellement en fin de fichier:

architectures=avr

Ajoutez la déclaration de la compatibilité avec l’architecture ESP8266 qui désigne l’architecture sur laquelle repose l’ESP8285. Vous obtenez le résultat suivant:

architectures=avr,esp8266

La modification de la librairie « LiquidCrystal_I2C.cpp » est finie. Nous allons pouvoir l’utiliser.

Exemple de code logiciel

Maintenant que ces préparatifs sont terminés, nous allons passer au code logiciel. Pour cela, vous allez partir de l’ossature du code Arduino suivante:

// Fonction de démarrage, s'exécute une seule fois:
void setup()
{

}

// Fonction principale du programme, s'exécute en boucle:
void loop()
{

}

Vous commençez par indiquer au compilateur Arduino l’utilisations de la la bibliothèque « LiquidCrystal_I2C.h » que nous venons de modifier:

// Déclaration des librairies utilisées
#include <LiquidCrystal_I2C.h>

Cette librairie utilisant la programmation objet, nous déclarons un objet globale de type « LiquidCrystal_I2C » qui sera utilisé par la suite pour contrôler l’afficheur en utilisant le protocole I2C.

Le constructeur de cette classe prends 3 paramètres:

  • l’adresse I2C de l’écran (0x27 pour le LCD1602),
  • le nombre de caractères par ligne (16)
  • et enfin le nombre de lignes (2).

Vous allez déclarer l’objet « Afficheur_G » à l’aide des instructions suivantes:

// Déclaration globales
LiquidCrystal_I2C Afficheur_G(0x27, 16, 2); // Afficheur LCD1206 d'addresse 0x27 avec écran de 2 lignes de 16 caractères

Ensuite, dans la fonction « setup« , initialisez l’écran en lui précisant en paramètre les ports SDA (5)et SCL (4) utilisés pour ce projet, puis effacez l’écran :

    Afficheur_G.init(5,4); // Initialisation de l'afficheur, SDA=5, SCL=4
    Afficheur_G.clear(); // Effacement de l'écran

Une erreur courante avec ce type d’afficheur est de croire que le projet ne fonctionne pas car rien ne s’affiche à l’écran. Et puis après des heures de recherche on s’aperçoit qu’il ne s’agit que d’un mauvais réglage du contraste !

Pour faciliter le déverminage, vous allez faire clignoter le rétroéclairage de l’écran au démarrage afin de visualiser que l’écran LCD est bien piloté par l’ESP8285 .

    // Clignotement du rétroéclairage au démarrage
    Afficheur_G.backlight(); // Allumage
    delay(1000); // Attente d'1 seconde
    Afficheur_G.noBacklight(); // Extinction
    delay(1000); // Attente d'1 seconde
    Afficheur_G.backlight(); // Allumage

Toujours dans la fonction « setup« , vous aller demander l’affichage des 2 lignes de texte » visible dans la capture d’écran du début de l’article.

LA première ligne de texte « LCD + ESP8285 » est affichée en haut à gauche de l’écran LCD. Pour faire cela, vous commencez par positionner le curseur sur la première colonne et la première ligne de l’écran à l’aide de la méthode « setCursor() », puis vous appeler la méthode « print() » pour l’écriture du texte à l’écran.

	  // Affichage du message
    Afficheur_G.setCursor(0, 0); // Curseur 1ère colonne / 1ère ligne
    Afficheur_G.print("LCD + ESP8285");

La deuxième ligne de texte « tropratik.fr » est présente en bas à droite de l’écran LCD. Sachant que l’écran peut afficher 16 caractères, vous en déduisez que l’affichage doit démarrer à la 5ème colonne de la deuxième ligne:

    Afficheur_G.setCursor(4, 1); // Curseur 5ème colonne / 2ème ligne
    Afficheur_G.print("tropratik.fr");

Au final, voici à quoi ressemble votre programme maintenant:

// Déclaration des librairies utilisées
#include <LiquidCrystal_I2C.h>
  
// Déclaration globales
LiquidCrystal_I2C Afficheur_G(0x27, 16, 2); // Afficheur LCD1206 d'addresse 0x27 avec écran de 2 lignes de 16 caractères

// Fonction de démarrage, s'exécute une seule fois:
void setup()
{
    Afficheur_G.init(5,4); // Initialisation de l'afficheur, SDA=5, SCL=4
    Afficheur_G.clear(); // Effacement de l'écran

    // Clignotement du rétroéclairage au démarrage
    Afficheur_G.backlight(); // Allumage
    delay(1000); // Attente d'1 seconde
    Afficheur_G.noBacklight(); // Extinction
    delay(1000); // Attente d'1 seconde
    Afficheur_G.backlight(); // Allumage

	  // Affichage du message
    Afficheur_G.setCursor(0, 0); // Curseur 1ère colonne / 1ère ligne
    Afficheur_G.print("LCD + ESP8285");
    Afficheur_G.setCursor(4, 1); // Curseur 5ème colonne / 2ème ligne
    Afficheur_G.print("tropratik.fr");
}

// Fonction principale du programme, s'exécute en boucle:
void loop()
{

} 

Afin de le vérifier, vous compilez ce programme puis le transférez dans l’ESP8285. Vous obtenez le résultat suivant:

L’écran clignote mais n’affiche rien

Si l’écran LCD clignote bien à la mise sous tension mais rien ne s’affiche à l’écran, c’est probablement du à un mauvais réglage du contraste. Pour corriger ce problème, retournez l’écran puis tournez le potentiomètre du convertisseur I2C jusqu’à visualiser le message affiché:

Réglage du contrast de l'écran I2C LCD1602 à l'aide du potentiomètre

Laisser un commentaire