I²C tekst display met twee regels van 16, 20 of 24 tekens

De programma's beneden zijn gemaakt voor LCD tekst displays van twee regels van 16, 20 of 24 tekens. Dit soort displays kunnen het adres 0x27 of 0x3F gebruiken. Als je display met het ene adres niet werkt probeer dan het andere.
Op foto's van deze displays kun je niet zien hoe mooi deze displays zijn. Displays met witte letters op een blauwe achtergrond zijn vaak veel helderder dan zwarte letters op een groene achtergrond. Je kunt de helderheid tussen bepaalde grenzen regelen met de stelknop achter op de interface van het display.
Er zijn diverse bibliotheken die je kunt gebruiken met dit display. Ik gebruikte tot voor kort altijd de bibliotheek LiquidCrystal_I2C van Francisco Malpartida. Deze komt in de plaats van de standaard LiquidCrystal_I2C.
Inmiddels heb ik ook ervaring met de bibliotheek LiquidCrystal_I2C_Hangul.h. Deze bibliotheek werkt eenvoudiger en kan bovendien via het menu bibliotheek beheren geïnstalleerd worden.
Als je toch de standaardbibliotheek LiquidCrystal_I2C gebruikt dan kan het zijn dat lcd.print maar één letter print.
Je moet dan in het bestand LiquidCrystal_I2C.cpp bij
inline size_t LiquidCrystal_I2C::write(uint8_t value) {
	send(value, Rs);
	return 0;
}
de 0 veranderen in een 1. Er zijn een paar verschillen tussen de bibliotheken van Malpartido en Hangul. Zo geef je bij Malpartido via lcd.begin(16, 2) op hoeveel regels (2) van hoeveel tekens (16) je hebt. Als je dat fout doet dan zal je display wel werken, maar kunnen sommige tekens op de verkeerde plaats komen.
Bij de bibliotheek van Hangul doe je dit meteen als je het lcd object aanmaakt. Ik heb voor de duidelijkheid ook van deze bibliotheek voorbeelden opgenomen, zie onder "Een Valentijn surprise" of "Lichtkrant". Als je deze bibliotheek gebruikt met een ESP processor, dan krijg je in de Arduino IDE een waarschuwing dat de bibliotheek misschien niet werkt, maar ik ben geen enkel probleem tegengekomen. Ik hem dit getest met een ESP32 en een ESP8266, met verschillende displays.

Aansluiting op je Arduino

Dit is heel simpel: VCC op 5 volt en GND op GND; bij de meeste Arduino's SDA op A4 en SCL op A5.

Aansluiting op systemen met een ESP processor

Modules met een ESP processor hebben doorgaans alleen 3,3 volt uitgangen. Een enkele zoals de WeMos D1 mini en de LoLin nodeMCU v2 hebben ook een pin die 5 volt levert, mits je de USB poort gebruikt voor de voeding.

Step-up (of boost-up) converter
Als jouw module alleen 3,3 volt uitgangen heeft, dan kun je een aparte 5 volt voeding voor het display gebruiken. Het is echter handiger om een zogenaamde step-up converter te gebruiken. Koop er een die 5 volt als uitgang heeft. Sluit VIN (of Vi of V1) van de step-up converter aan op een 3,3 volt pin en GND op GND. VOUT (of Vo) gaat dan naar VCC van het display.

Via step-up converter naar display.
Links: WeMos ESP8266 nodeMCU; rechts ESP32 WROOM (onbekend merk)

Bij bijna alle nodeMCU's die de ESP2866 gebruiken is pin D1 de klok en pin D2 de datalijn. Sluit D1 aan op SCL van het display en D2 op SDA van het display. Bij nodeMCU's, devKits e.d. die de ESP-32 gebruiken is pin 21 SDA en pin 22 SCL. Ik testte meer dan tien van deze displays met een aantal verschillende borden, waaronder met ESP32, allemaal zonder problemen.

Voorbeeldprogramma's

Eigen symbolen

24 × 2 display
16 × 2 display
Als eerste laat ik zien hoe je je eigen symbolen kunt maken. Meer dan 8 verschillende tegelijkertijd gaat niet, maar na elkaar wel. Verderop staat enige uitleg bij de code. LET OP: bij sommige displays moet je in de tweede regel 0x3F vervangen door 0x27.
Klik hier om het voorbeeldprogramma voor een 24 × 2 display te zien
Klik hier om het voorbeeldprogramma voor een 16 × 2 display te zien

Uitleg bij de code

Voor meer informatie over LiquidCrystal_I2C kijk bij het vierregelig display.
In de vier regels die met byte beginnen worden de speciale symbolen gedefinieerd. Per pixel-regel wordt één byte gebruikt. Omdat dit display symbolen gebruikt van 5 pixels breed zijn alleen de laatste 5 bits van de byte van belang. Ik heb om de getallen te krijgen een programma gebruikt. Het is niet moeilijk om dat zonder programma te doen: stel dat je het raam wil maken (x = pixel AAN, spatie = pixel UIT)
xxxxx	Vertaal dit in B11111  (B staat voor binair)
x x x   Vertaal dit in B10101  (gebruik een 1 voor AAN en een 0 voor UIT)
x x x   Vertaal dit in B10101
xxxxx   Vertaal dit in B11111
x x x   Vertaal dit in B10101
x x x   Vertaal dit in B10101
x x x   Vertaal dit in B10101
xxxxx   Vertaal dit in B11111
De instructie wordt dan dus
byte raam[8] = {B11111, B10101, B10101, B11111, B10101, B10101, B10101, B11111};
Let op: de B moet een hoofdletter zijn.
Je kunt de nieuwe symbolen op twee manieren schrijven: met write of met print. Als je write gebruikt dan kun je gewoon het nummer van het symbool invoeren, behalve als dat nummer 0 is (dan moet je aangeven dat je een byte bedoelt). Als je print gebruikt dan moet je aangeven dat je een char bedoelt. Voor de pijl (nummer 2): lcd.write(2); of lcd.print(char(2));.

Een Valentijn surprise

Hier hoef je alleen de naam van je geliefde in te zetten (in plaats van Lisa). Als de naam van je geliefde langer dan 7 letters is dan zul je de eerste regel moeten aanpassen (of een 24 × 2 display gebruiken).

Klik hier om het voorbeeldprogramma voor een 24 × 2 display te zien
Klik hier om het voorbeeldprogramma voor een 16 × 2 display te zien


Angelina's gebroken hart op een mooi 20 × 2 display

Klik hier om het voorbeeld met Hangul bibliotheek te zien
Klik hier om het oude voorbeeldprogramma te zien

Lichtkrant

In het voorbeeld neem ik van de lange string "Krant" steeds de juiste letters die op de 16 plaatsen passen. Door te beginnen met spaties wordt de regel automatisch schoongemaakt als de krant begint te lopen. Het voordeel is hiervan is dat dit met andere displays, met minimale aanpassingen, ook zal werken. De laatste tekst blijft even staan wegens delay(1000). Kies voor de delays de waardes die jij prettig vindt. Als je de spaties in Krant achter de tekst zet dan krijg je meteen de hele tekst te zien die vervolgens naar links loopt. Kies zelf wat je beter vindt. Voor een 24 × 2 display kun de vier getallen 16 vervangen door 24. Bij een 20 × 2 display kun de vier getallen 16 vervangen door 20.
#include <LiquidCrystal_I2C.h> // Zorg dat je de goede versie hebt!

// Pas indien nodig het I2C adres (0x27) aan! Kan ook 0x3F zijn
LiquidCrystal_I2C display(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

void setup() {
  display.begin(16, 2); // initialiseer op 16 karakters en 2 regels.
  display.setBacklight(HIGH);
  display.setCursor(2, 0); display.print("Hallo allemaal !"); 
}
String Krant = "                Dit is 'n mooie lichtkrant!";
void loop() {
  for (int Teller = 0; Teller <= Krant.length() - 16; Teller++) {
    display.setCursor(0, 1);
    display.print(Krant.substring(Teller, Teller + 16));
    delay(250);
  }
  delay(1000);
}
Hieronder staat een versie met de LiquidCrystal_I2C_Hangul bibliotheek. Ik heb deze getest met verschillende displays, waaronder een 20 × 2 en een 16 × 4 display.
#include <LiquidCrystal_I2C_Hangul.h>
#define L 20 // Dit is het aantal letters per regel dat het display kan weergeven

// Kies hieronder het I2C adres. Dit is 0x27 of 0x3F
LiquidCrystal_I2C_Hangul display(0x27, L, 2);

void setup() {
  display.init();
  display.setBacklight(HIGH);
  display.setCursor(2, 0); display.print("Hallo allemaal !"); 
}
String Krant = "                Dit is 'n mooie lichtkrant!";
void loop() {
  for (int Teller = 0; Teller <= Krant.length() - L; Teller++) {
    display.setCursor(0, 1);
    display.print(Krant.substring(Teller, Teller + L));
    delay(250);
  }
  delay(1000);
}