Две строки по шестнадцать символов с подсветкой — классика. С переходником I2C (PCF8574) вместо шестнадцати проводов нужно четыре.
Как работает
Дисплей на контроллере HD44780 показывает 2 строки по 16 символов. Напаянный сзади переходник на PCF8574 превращает параллельный интерфейс в I2C, адрес — 0x27 или 0x3F (зависит от версии микросхемы).
Библиотека LiquidCrystal_I2C: lcd.init(), lcd.backlight(), lcd.setCursor(столбец, строка), lcd.print(). Восемь своих символов можно нарисовать через createChar() — так делают значки градуса, батарейки или русские буквы, которых нет в прошивке дисплея.
⚡ В примере «LCD 1602 с I2C» питается от 3V3 — в симуляторе так проще, и модель это допускает. Настоящий модуль рассчитан на 5 В: подключайте VCC к VIN (5 В от USB) или к отдельному источнику 5 В с общей землёй.
#include <LiquidCrystal_I2C.h>
// Дисплей на I2C. Ни один вывод шины в скетче не назван — и это не
// упущение: у Uno менять их всё равно нельзя. SDA это A4, SCL это A5,
// они разведены внутри контроллера, и библиотека берёт их сама.
//
// На ESP32 всё наоборот: там Wire.begin(sda, scl) принимает любые
// выводы, и перенесённая схема с 21 и 22 здесь просто не заработает.
//
// Адрес обычно 0x27, реже 0x3F. Это свойство платы дисплея, а не
// микросхемы, и узнают его сканером шины.
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("PinPort");
lcd.setCursor(0, 1);
lcd.print("Arduino Uno");
}
void loop() {
// Счётчик секунд во второй строке. Пробелы в конце затирают остаток
// прошлого числа: дисплей не очищает знакоместа сам, и после 10 из
// 100 осталась бы висеть двойка.
lcd.setCursor(0, 1);
lcd.print(millis() / 1000);
lcd.print(" c ");
delay(200);
}
В железе
Дисплей рассчитан на 5 В: от 3,3 В символы едва видны. С ESP32 питание берут с вывода VIN (5 В от USB), а линии I2C обычно работают и так, но надёжнее — через преобразователь уровней.
Частые ошибки
Подсветка горит, символов нет — не выставлен контраст: покрутите синий подстроечный резистор на переходнике.
Пустой экран без подсветки — неверный адрес. Проверьте сканером I2C оба варианта: 0x27 и 0x3F.
Кириллица «кракозябрами»: в знакогенераторе большинства дисплеев русских букв нет. Нужен дисплей с кириллицей или свои символы.
lcd.clear() в каждом проходе loop — экран мерцает. Перезаписывайте только изменившиеся символы.