Дисплей LCD1602 с I2C-переходником PCF8574: обзор и подключение
Экран 16×2 — первый дисплей, который берёт новичок, и первая же ловушка: ему нужны шесть проводов данных и управления, плюс отдельная подстройка контраста. Переходник на микросхеме PCF8574 сжимает всю обвязку до четырёх проводов: питание, земля и две линии шины I2C. Внутри стоит 8-битный расширитель портов: он принимает по I2C байт и раздаёт его на выводы дисплея в четырёхбитном режиме. Сэкономленные пины уходят под датчики и реле.
Что внутри связки
Сам LCD1602 построен на контроллере, совместимом с классическим HD44780: внутри — память символов DDRAM, знакогенератор в ROM и стандартный набор команд. По паспорту Winstar команда очистки экрана выполняется за 1,53 мс. Дисплей умеет обмениваться данными 8-битной параллельной шиной, но поддерживает и четырёхбитный режим — им пользуются все переходники: старшие четыре линии DB4–DB7 подключены к расширителю, полубайты он передаёт по очереди.
PCF8574 по паспорту NXP питается от 2,5 до 6 В, держит шину 100 кГц и в покое потребляет типовые 2,5 мкА. Это восемь квазидвунаправленных портов: на выводе сидит слабый источник тока 100 мкА, единицу он подтягивает сам, а ноль ставится сильным ключом. Гарантированный ток стока — 10 мА на вывод при 5 В, предельный — 25 мА; дисплею хватает с запасом, а подсветку на плате переходника коммутирует транзистор.
Адрес на шине задаётся перемычками A0–A2: у базового PCF8574 это 0x20–0x27, у младшего собрата PCF8574A — 0x38–0x3F. Поэтому «фирменный» адрес 0x27, зашитый в половину примеров из интернета, у части плат не совпадает — на переходнике может стоять именно 8574A. На плате также стоит подстроечник контраста и джампер включения подсветки.
Характеристики из паспортов
| Параметр | Значение |
|---|---|
| Индикация | 16 символов × 2 строки, матрица 5×8 точек |
| Питание логики дисплея (WH1602B, Winstar) | 4,5–5,5 В (номинал 5,0) |
| Ток логики | 1,0–1,5 мА (тип. 1,2 мА при 5 В) |
| Контрастное напряжение VDD−V0 | тип. 3,7 В при 25 °C (3,2 В при 70 °C) |
| Подсветка | белый LED: 14,4–20 мА, тип. 16 мА при 3,5 В; питание только током; ресурс 50 000 ч при ≤16 мА |
| Контроллер дисплея | LSI, совместимый с HD44780; очистка экрана 1,53 мс |
| Габариты | 80×36×13,5 мм, зона просмотра 66×16 мм |
| Температура дисплея | −20…+70 °C |
| Переходник PCF8574 (NXP) | 2,5–6 В; I2C 100 кГц; покой 2,5 мкА; сток до 25 мА на вывод (суммарно 80 мА) |
| Адреса I2C | 0x20–0x27 (PCF8574) или 0x38–0x3F (PCF8574A), выбор A0–A2 |
Источники: паспорт Winstar «WH1602B-TMI-ET#» (Rev. C, 2009) и datasheet NXP «PCF8574; PCF8574A» Rev. 5, май 2013.
Подключение к Arduino
UNO или Nano, питание 5 В:
- VCC переходника → 5 V;
- GND → GND;
- SDA → A4;
- SCL → A5.
После первой подачи питания крутите подстроечник контраста, пока на верхней строке не появятся символы: по паспорту дисплею нужно примерно 3,7 В между VDD и V0, и при заводском положении движка экран часто выглядит «пустым», хотя всё исправно.
Подключение к ESP32
SDA → GPIO21, SCL → GPIO22, питание переходника — от пина 5V (VIN при питании по USB). Есть тонкость: порог логической единицы у дисплея — 0,7 от напряжения питания, то есть 3,5 В при 5-вольтовой логике, а ESP32 выдаёт 3,3 В. Формально не хватает, но реальный порог чипов заметно ниже паспортного, и связка работает без преобразователей уровней — это массовая практика. Для ответственного промышленного устройства поставьте согласование уровней, в самоделках на столе оно не нужно.
Код: сначала сканер, потом текст
Первый шаг при любой I2C-периферии — найти её на шине. Сканер перебирает адреса и печатает те, что ответили:
#include <Wire.h>
void setup() {
Wire.begin(); // ESP32: Wire.begin(21, 22);
Serial.begin(115200);
for (byte a = 8; a < 120; a++) {
Wire.beginTransmission(a);
if (Wire.endTransmission() == 0) { // 0 = устройство ответило ACK
Serial.print("Найдено: 0x");
Serial.println(a, HEX);
}
}
}
void loop() {}
Дальше — вывод текста. Библиотека LiquidCrystal_I2C (Frank de Brabander), ставится из менеджера библиотек Arduino IDE:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // адрес из сканера, столбцов, строк
void setup() {
lcd.init(); // инициализация переходника и дисплея
lcd.backlight(); // включить подсветку
lcd.setCursor(0, 0); // столбец 0, строка 0
lcd.print("LCD1602+PCF8574");
lcd.setCursor(0, 1);
lcd.print("T = 25.4 C");
}
void loop() {}
setCursor считает столбцы с нуля: позиция (16, 0) — уже за краем экрана, символ уйдёт в невидимую область DDRAM, а не на вторую строку. Убрать подсветку — lcd.noBacklight(), выключить экран без потери текста — lcd.display() / lcd.noDisplay().
Частые ошибки
- Подсветка горит, букв нет. Почти всегда контраст: крутите подстроечник на плате переходника. Экран при этом живой, просто V0 стоит далеко от нужных 3,7 В.
- Сканер не находит адрес. Проверьте, что модуль запитан от 5 В и не перепутаны SDA/SCL. Вторая причина — чип PCF8574A с диапазоном 0x38–0x3F вместо ожидаемого 0x27. Третья — забыли Wire.begin() до обращения к шине.
- Верхняя строка из 16 квадратов. Дисплей включился, но инициализация не прошла: чаще всего неверный адрес или плохой контакт. Иногда помогает задержка перед lcd.init() — контроллеру дисплея нужно время на собственный сброс.
- Каша на экране, зависания. Длинные макетные провода ловят наводки на 100 кГц. Укоротите проводники, при необходимости снизьте частоту шины.
- Кракозябры при выводе кириллицы. В ROM знакогенератора кириллицы нет — там латиница, цифры и японская катакана. Варианты: нарисовать нужные буквы через createChar(), поставить библиотеку с таблицей перекодировки или печатать латиницей.
- Подсветка не включается. Сначала джампер на переходнике. Затем помните: LED питается током — по паспорту 16 мА, и жечь его напрямую от пина без транзистора нельзя; на плате он уже есть.
Итог
Связка LCD1602 + PCF8574 — самый дешёвый способ добавить в проект экран и не отдать за него шесть пинов: две линии шины, питание, готовая библиотека. Шина общая, поэтому соседями дисплея становятся, например, датчик освещённости BH1750 или часы реального времени DS3231: у каждого свой адрес, и все они висят на одних SDA/SCL.
Информация собрана из открытых источников и паспортов производителей и не является истиной в последней инстанции. Характеристики, распиновку и совместимость проверяйте по документации конкретной партии модуля перед покупкой и подключением.