LCD 1602 с I2C: подключение к ESP32 и Arduino

Символьный дисплей 16×2

Две строки по шестнадцать символов с подсветкой — классика. С переходником I2C (PCF8574) вместо шестнадцати проводов нужно четыре.

Как работает

Дисплей на контроллере HD44780 показывает 2 строки по 16 символов. Напаянный сзади переходник на PCF8574 превращает параллельный интерфейс в I2C, адрес — 0x27 или 0x3F (зависит от версии микросхемы).

Библиотека LiquidCrystal_I2C: lcd.init(), lcd.backlight(), lcd.setCursor(столбец, строка), lcd.print(). Восемь своих символов можно нарисовать через createChar() — так делают значки градуса, батарейки или русские буквы, которых нет в прошивке дисплея.

Выводы

ВыводНазначение
SCLтактовая линия I2C
SDAлиния данных I2C
VCCпитание 5 В
GNDобщий провод

Подключение к ESP32

LCD 1602 с I2CESP32
SCLGPIO22
SDAGPIO21
VCC3V3
GNDGND

Схема из примера «LCD 16x2: первый текст».

⚡ В примере «LCD 1602 с I2C» питается от 3V3 — в симуляторе так проще, и модель это допускает. Настоящий модуль рассчитан на 5 В: подключайте VCC к VIN (5 В от USB) или к отдельному источнику 5 В с общей землёй.

LCD 16x2: первый текст

Открыть пример целиком
Код скетча
#include <LiquidCrystal_I2C.h>

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("Hello, world!");
}

void loop() {
}

Подключение к Arduino Uno

LCD 1602 с I2CArduino Uno
SCLA5
SDAA4
VCC5V
GNDGND

Схема из примера «Arduino Uno: дисплей LCD 16x2 по I2C».

Arduino Uno: дисплей LCD 16x2 по I2C

Открыть пример целиком
Код скетча
#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 обычно работают и так, но надёжнее — через преобразователь уровней.

Частые ошибки

Другие детали