La librairie LiquidCrystal permet de créer 8 caractères spéciaux. Ces caractères sont créés en “allumant” ou “éteignant” des pixels sur la matrice de chaque caractère.

Mon écran LCD est un 20 x 4 donc il y a 4 lignes de 20 caractères et chaque caractère est composé de 5 x 8 pixels. Il existe des sites permettant de générer de code à intégrer ensuite dans le code Arduino pour afficher les caractères. J’ai utilisé celui-ci :

https://diyusthad.com/custom-character-generator-lcd

Le code Arduino que j’ai utilisé pour gérer le menu de ma télécommande utilise déjà 2 caractères spéciaux pour dessiner une flèche et un carré. Il me restait donc 6 caractères disponibles.

Je me suis inspiré de l’image ci-dessous pour faire mon logo :

J’ai utilisé une feuille Excel pour dessiner mon logo de petite locomotive afin de connaitre les pixels à mettre à 1 et ceux à 0 :

Grace au site précédemment cité, j’ai généré les codes ci-dessous correspondant aux 6 caractères spéciaux :

Dans le code Arduino avant le void setup(); j’ai créé les différents caractères grâce au code précédent, plus les 2 caractères de navigation dans le menu:

// **************  CREATION DU LOGO et des ICONES en custom character *********************

byte Loco1[8] = {
  0b00000,
  0b00000,
  0b11111,
  0b11100,
  0b00100,
  0b00100,
  0b00011,
  0b00011
};

byte Loco2[8] = {
  0b00000,
  0b00000,
  0b10011,
  0b10001,
  0b10001,
  0b10001,
  0b11111,
  0b11111
};

byte Loco3[8] = {
  0b00000,
  0b00000,
  0b11000,
  0b10000,
  0b10000,
  0b10000,
  0b11000,
  0b11100
};

byte Loco4[8] = {
  0b00111,
  0b11111,
  0b11111,
  0b11111,
  0b11000,
  0b10011,
  0b00111,
  0b00011
};

byte Loco5[8] = {
  0b11111,
  0b11111,
  0b11111,
  0b11111,
  0b01100,
  0b00001,
  0b10011,
  0b00001
};

byte Loco6[8] = {
  0b11110,
  0b11100,
  0b11000,
  0b11000,
  0b00100,
  0b10010,
  0b11011,
  0b10000
};

byte arrow[8] = {
  // creation d'1 flêche (custom character)
  0b10000,  //  *
  0b11000,  //  * *
  0b01100,  //   * *
  0b00111,  //    * * *
  0b01100,  //   * *
  0b11000,  //  * *
  0b10000,  //  *
  0b00000   //
};

byte box[8] = {
  // creation d'1 carré (custom character)
  0b00000,  //
  0b00000,  //
  0b11111,  //  * * * * *
  0b11111,  //  * * * * *
  0b11111,  //  * * * * *
  0b11111,  //  * * * * *
  0b11111,  //  * * * * *
  0b00000   //
};

Dans le Setup on associe chaque caractère à un objet pour la bibliothèque LCD :

 // CREER LES CHARACTERES SPECIAUX EN LES ASSOCIANTS A DES NUMEROS DE 0 à 7

  lcd.createChar(0, Loco1);  // creation des 6 parties du logo
  lcd.createChar(1, Loco2);
  lcd.createChar(2, Loco3);
  lcd.createChar(3, Loco4);
  lcd.createChar(4, Loco5);
  lcd.createChar(5, Loco6);
  lcd.createChar(6, arrow);  // creation du caractère flêche
  lcd.createChar(7, box);    // creation du caractère carré

Les logos étant affichés à 2 endroits mais uniquement au démarrage de la télécommande, j’ai inséré le code suivant dans le Setup qui n’est lu qu’une fois :

 //-----------------  Ecran LOGO ou Bienvenu  --------------

  lcd.clear();  // effacer l'écran

  // Ecrire un message sur l'ecran
  lcd.setCursor(4, 0);  //placer curseur colonne 5 ligne 0
  lcd.print("TELECOMMANDE");

  lcd.setCursor(6, 1);  //placer curseur colonne 7 ligne 1
  lcd.print("TRAIN DE");

  lcd.setCursor(7, 2);  //placer curseur colonne 8 ligne 2
  lcd.print("JARDIN");

  lcd.setCursor(16, 3);
  lcd.print("V1.5");

  // AFFICHER LE LOGO EN CHARACTERE SPECIAUX A GAUCHE

  lcd.setCursor(1, 1);
  lcd.write(0);  // Loco1

  lcd.setCursor(2, 1);
  lcd.write(1);  // Loco2

  lcd.setCursor(3, 1);
  lcd.write(2);  // Loco3

  lcd.setCursor(1, 2);
  lcd.write(3);  // Loco4

  lcd.setCursor(2, 2);
  lcd.write(4);  // Loco5

  lcd.setCursor(3, 2);
  lcd.write(5);  // Loco6

  // AFFICHER LE LOGO EN CHARACTERE SPECIAUX A DROITE


  lcd.setCursor(16, 1);
  lcd.write(0);  // Loco1

  lcd.setCursor(17, 1);
  lcd.write(1);  // Loco2

  lcd.setCursor(18, 1);
  lcd.write(2);  // Loco3

  lcd.setCursor(16, 2);
  lcd.write(3);  // Loco4

  lcd.setCursor(17, 2);
  lcd.write(4);  // Loco5

  lcd.setCursor(18, 2);
  lcd.write(5);  // Loco6

  delay(3000);  // affichage de l'ecran d'accueil 3 secondes

Voici ce que cela donne au final sur l’écran LCD :