Компоненты · 4 мин чтения

I2C LCD-дисплей 16x2: как подключить к Arduino, ESP32 и Pico

Как подключить I2C LCD-дисплей 16x2 к Arduino? Подключение по 4 проводам, поиск I2C-адреса (0x27, 0x3F), библиотека LiquidCrystal_I2C, настройка контраста, свои символы и бегущая строка.

LCD 16x2, который показывает 2 строки по 16 символов, — самый распространённый дисплей в мире Arduino. На нём выводят показания вроде температуры и расстояния, меню, часы и счёт в играх. У самого дисплея 16 выводов, и ему одному нужно минимум 6 цифровых пинов; маленький I2C-модуль, припаянный сзади, сокращает это число всего до 2 проводов данных. В этой статье ты пошагово разберёшься, как подключить I2C LCD, найти его адрес и вывести на него всё, что захочется.

LCD-дисплей 16x2 с I2C-модулем
LCD 16x2 с I2C-модулем: благодаря маленькой плате сзади он подключается всего по 4 проводам.

Как работает LCD-дисплей?

Эти дисплеи работают на микросхеме-драйвере HD44780. Каждый символ рисуется в маленькой клетке 5x8 пикселей, а внутри микросхемы есть встроенная таблица символов: буквы, цифры и некоторые значки. Arduino отправляет только команду вида «напиши эту букву в этой позиции»; превратить букву в пиксели — уже задача дисплея. Светодиодная подсветка делает текст читаемым в темноте, а слой жидких кристаллов формирует текст, затемняя пиксели.

Что такое I2C и почему с ним проще?

I2C — способ, которым несколько устройств общаются по двум проводам: SDA передаёт данные, а SCL — тактовый сигнал. У каждого устройства свой адрес, и Arduino обращается к нужному устройству по этому адресу. LCD-модули обычно используют адрес 0x27 или 0x3F. На те же два провода можно повесить модуль часов, OLED-дисплей и датчики вроде BME280; пока адреса разные, все они работают вместе.

I2C-адаптер PCF8574 для LCD
I2C-модуль на PCF8574: синий подстроечный резистор задаёт контраст, а перемычка включает и выключает подсветку.

Микросхема PCF8574 на модуле превращает команды, приходящие по I2C, в 8 параллельных сигналов, которых ждёт дисплей. Дисплей можно использовать и без I2C-модуля, но тогда понадобятся 6 пинов, потенциометр и куча проводов. Модуль экономит пины и делает схему аккуратнее.

Технические характеристики

ПараметрЗначение
Экран16 столбцов × 2 строки символов
Размер символа5 × 8 пикселей
Микросхема-драйверHD44780 (или совместимая)
I2C-адаптерPCF8574 / PCF8574A
Адрес по умолчанию0x27 (PCF8574) или 0x3F (PCF8574A)
Питание5 V, около 20–30 mA с включённой подсветкой
ВыводыGND, VCC, SDA, SCL

Подключение I2C LCD: Arduino, ESP32 и Pico

На любой плате подключение одинаковое — четыре провода; меняется только то, на каких пинах находятся SDA и SCL. Чтобы увидеть I2C-пины своей платы, загляни в утилиту Распиновка.

Пин LCDArduino Uno / NanoArduino MegaESP32Raspberry Pi Pico
GNDGNDGNDGNDGND
VCC5V5VVIN (5V)VBUS (5V)
SDAA420GPIO 21GP4
SCLA521GPIO 22GP5
I2C-модуль подтягивает линии SDA и SCL (pull-up) к своему VCC, то есть к 5 V. А пины ESP32 и Pico рассчитаны на 3,3 V. На практике обычно всё работает, но надёжнее всего поставить между ними двунаправленный преобразователь уровней I2C или снять с модуля подтягивающие резисторы и подтянуть линии к 3,3 V.

Как найти I2C-адрес: скетч-сканер

Если адрес дисплея неизвестен, загрузи код ниже. Он перебирает все адреса от 1 до 126 и выводит в монитор порта адрес каждого устройства, которое ответило. Этот адрес понадобится при настройке дисплея.

C++ (Arduino IDE)
1#include <Wire.h>
2
3void setup() {
4  Wire.begin();
5  Serial.begin(9600);
6  Serial.println("I2C taranıyor / scanning...");
7  for (byte addr = 1; addr < 127; addr++) {
8    Wire.beginTransmission(addr);
9    if (Wire.endTransmission() == 0) {   // cihaz cevap verdi / device answered
10      Serial.print("Bulundu / found: 0x");
11      Serial.println(addr, HEX);
12    }
13  }
14}
15
16void loop() {
17}

Установка библиотеки и вывод текста

В «Менеджере библиотек» (Library Manager) найди LiquidCrystal I2C и установи библиотеку от Frank de Brabander. Код ниже пишет приветствие в первой строке, а во второй — сколько секунд прошло с момента запуска Arduino.

C++ (Arduino IDE)
1#include <Wire.h>
2#include <LiquidCrystal_I2C.h>
3
4LiquidCrystal_I2C lcd(0x27, 16, 2);  // adres, sütun, satır / address, columns, rows
5
6void setup() {
7  lcd.init();
8  lcd.backlight();               // arka ışığı aç / backlight on
9  lcd.setCursor(0, 0);           // sütun 0, satır 0 / column 0, row 0
10  lcd.print("Merhaba Dunya!");
11}
12
13void loop() {
14  lcd.setCursor(0, 1);           // ikinci satır / second row
15  lcd.print("Sure: ");
16  lcd.print(millis() / 1000);    // saniye / seconds
17  lcd.print(" sn   ");           // eski rakamları sil / clear old digits
18  delay(200);
19}
Если подсветка горит, а текста нет или в верхней строке видны только сплошные прямоугольники, медленно покрути маленькой отвёрткой синий подстроечный резистор на обратной стороне модуля. Это регулировка контраста, и она решает большинство проблем вида «дисплей не работает».

Самые полезные команды LCD

КомандаЧто делает
lcd.init()Инициализирует дисплей; вызывается один раз в setup().
lcd.backlight() и lcd.noBacklight()Включает или выключает подсветку.
lcd.setCursor(столбец, строка)Задаёт, откуда начинается текст; счёт идёт с 0.
lcd.print(значение)Выводит текст или число.
lcd.clear()Очищает весь экран и возвращает курсор в начало.
lcd.scrollDisplayLeft()Сдвигает всё изображение на один символ влево.
lcd.blink() и lcd.cursor()Показывает мигающий курсор или курсор-подчёркивание.
lcd.createChar(ячейка, массив)Сохраняет свой символ в ячейку 0–7.

Бегущая строка

Чтобы показать текст длиннее 16 символов, изображение можно прокручивать. Код ниже выводит текст и каждые 300 миллисекунд сдвигает его влево, так что длинное сообщение бежит по экрану, как на табло.

C++ (Arduino IDE)
1#include <Wire.h>
2#include <LiquidCrystal_I2C.h>
3
4LiquidCrystal_I2C lcd(0x27, 16, 2);
5
6void setup() {
7  lcd.init();
8  lcd.backlight();
9  lcd.print("BlueGrays ile elektronik ogren");  // 16 karakterden uzun / longer than 16 chars
10}
11
12void loop() {
13  lcd.scrollDisplayLeft();   // bir adım sola / one step left
14  delay(300);
15}

Свои символы и особые буквы

В стандартной таблице символов HD44780 нет кириллицы и букв с диакритикой вроде é, ñ, ö, ü (бывают версии дисплея с русской таблицей, но чаще попадаются без неё); если попробовать их вывести, появятся бессмысленные значки. Решение — задать до 8 собственных символов 5x8 пикселей. Каждая строка записывается одним байтом, а биты, равные 1, — это горящие пиксели. Пример ниже рисует сердечко; точно так же можно нарисовать любую недостающую букву.

C++ (Arduino IDE)
1byte heart[8] = {
2  0b00000,
3  0b01010,
4  0b11111,
5  0b11111,
6  0b01110,
7  0b00100,
8  0b00000,
9  0b00000
10};
11
12// setup() içinde / inside setup()
13lcd.createChar(0, heart);   // 0. yuvaya kaydet / store in slot 0
14lcd.setCursor(15, 0);
15lcd.write(byte(0));         // kalbi göster / show the heart

I2C LCD с ESP32 и Raspberry Pi Pico

На ESP32 работают тот же код Arduino и та же библиотека; Wire.begin() по умолчанию использует GPIO 21 (SDA) и GPIO 22 (SCL). Если нужны другие пины, напиши Wire.begin(SDA, SCL). На Raspberry Pi Pico с MicroPython скопируй на Pico два небольших файла — lcd_api.py и pico_i2c_lcd.py — и используй их так:

MicroPython
1from machine import I2C, Pin
2from pico_i2c_lcd import I2cLcd   # Pico'ya kopyalanan dosya / file copied to the Pico
3
4i2c = I2C(0, sda=Pin(4), scl=Pin(5), freq=400000)
5addr = i2c.scan()[0]              # ilk bulunan adres / first found address
6lcd = I2cLcd(i2c, addr, 2, 16)    # 2 satır, 16 sütun / 2 rows, 16 columns
7
8lcd.putstr("Merhaba Pico!")
9lcd.move_to(0, 1)                 # sütun 0, satır 1 / column 0, row 1
10lcd.putstr("BlueGrays")

Идеи проектов с I2C LCD

  • Цифровой термометр: выводи на дисплей температуру и влажность; про датчик читай в статье Датчик температуры и влажности DHT11.
  • Индикатор расстояния: показывай в сантиметрах расстояние, измеренное HC-SR04; подробности в статье Датчик расстояния HC-SR04.
  • Цифровой вольтметр: показывай напряжение, считанное с аналогового пина.
  • Кодовый замок: показывай набранный на клавиатуре код звёздочками.
  • Система меню: листай пункты на дисплее потенциометром или двумя кнопками.
  • Мини-игра: пусть бегущий человечек из своих символов уворачивается от препятствий.

Частые ошибки и как их исправить

  • Подсветка горит, а текста нет: не настроен контраст; покрути подстроечный резистор.
  • Сплошные прямоугольники в верхней строке: питание есть, но дисплей не инициализирован; возможно, неверный адрес, перепутаны SDA и SCL или не вызвана lcd.init().
  • Неверный адрес: в коде 0x27, а у дисплея 0x3F; найди настоящий адрес скетчем-сканером.
  • Остаются старые цифры: число, упавшее со 100 до 99, выглядит как 990; выводи после числа несколько пробелов. lcd.clear() тоже помогает, но работает медленно, и при частом вызове в loop экран мерцает.
  • Кракозябры вместо особых букв: их нет в таблице дисплея; задай свои символы или обойдись без них.
  • Текст случайно портится: длинные, болтающиеся провода или шумные детали вроде моторов могут мешать шине I2C; делай провода короткими, а моторы питай от отдельного источника.

Дисплей в паре с датчиком — самый быстрый путь к первому настоящему проекту. В приложении BlueGrays есть десятки проектов с I2C LCD со схемами и готовым кодом, а чтобы менять значения ручкой, пригодится статья Что такое потенциометр?.

Частые вопросы

Почему мой LCD показывает только прямоугольники?

Сплошные прямоугольники в верхней строке означают, что питание есть, но дисплей не инициализирован. Возможно, неверный адрес, перепутаны SDA и SCL или слишком высокий контраст. Сначала проверь адрес скетчем-сканером I2C, затем подстрой контраст резистором.

Какой адрес у моего I2C LCD: 0x27 или 0x3F?

Модули с микросхемой PCF8574 обычно используют 0x27, а с PCF8574A — 0x3F. Проще всего узнать скетчем-сканером I2C; потом достаточно поменять в коде строку на LiquidCrystal_I2C lcd(0x3F, 16, 2).

Можно ли подключить два LCD к одной Arduino?

Да. Если замкнуть припоем контактные площадки A0, A1 и A2 на модуле, его адрес изменится, так что на тех же двух проводах может работать до 8 LCD. В коде для каждого дисплея создаётся отдельный объект со своим адресом.

Подойдёт ли тот же код для LCD 20x4?

Да. Достаточно изменить объявление на LiquidCrystal_I2C lcd(0x27, 20, 4); тогда строки идут от 0 до 3, а столбцы — от 0 до 19.

Как вывести на LCD кириллицу или особые символы?

Во встроенной таблице дисплея нет букв вроде é, ñ, а в большинстве модулей и кириллицы. Нарисуй каждую такую букву как свой символ 5x8 пикселей с помощью lcd.createChar() и выведи её через lcd.write(). Помни, что одновременно можно задать не больше 8 своих символов.

Что выбрать: LCD или OLED-дисплей?

LCD дешёвый, читается на солнце и идеален для текста и чисел. OLED меньше, контрастнее и умеет рисовать графику и значки, но если долго показывать одно и то же изображение, на нём может остаться выгоревший след. Для текста выбирай LCD, для графики — OLED.

Все проекты
LCD-экран с I2C
#32Новичок
Premium

LCD-экран с I2C

Дай своему Arduino собственный экран и заставь его написать первое сообщение. Двухстрочный LCD-экран подключается всего несколькими проводами; в верхней строке появляется приветствие, затем второе соо

4.8(53)
70
Вывод сообщения на LCD-экран 2x16
#29Продвинутый
Premium

Вывод сообщения на LCD-экран 2x16

Твой первый шаг к выводу текста на экран. Двухстрочный LCD-экран сначала показывает сообщение ожидания, затем пишет приветствие в верхней строке и печатает слово по букве в нижней строке, как пишущая

4.6(37)
51
Прыгающий текст на LCD
#30Продвинутый
Premium

Прыгающий текст на LCD

В верхней строке LCD-экрана слово BLUEGRAYS скользит от одного края к другому и отскакивает, как мяч от стены, снова и снова без конца. Нужны только Arduino, LCD-экран 2x16 и потенциометр, который зад

4.5(29)
40
I2C LCD-дисплей (16x2) на ESP32
#119Средний
Premium

I2C LCD-дисплей (16x2) на ESP32

В этом проекте символьный LCD-экран 16x2 подключается к ESP32 по протоколу I2C и выводит текст. Благодаря I2C экраном можно управлять всего двумя пинами данных (SDA и SCL), не тратя 6+ пинов, как при классическом параллельном подключении. Код печатает постоянное сообщение в первой строке и счётчик, растущий каждую секунду, во второй. Кроме того, при запуске работает сканер I2C, который выводит адрес дисплея в монитор порта.

4.9(23)
40
Температура и влажность с DHT11
#55Средний

Температура и влажность с DHT11

Насколько тепло в твоей комнате и влажный ли воздух или сухой? Датчик DHT11 измеряет температуру и влажность, а Arduino выводит значения на двухстрочный LCD-экран и обновляет их каждые пару секунд. Ес

4.7(47)
73
Цифровой вольтметр с LCD-дисплеем
#56Средний
Premium

Цифровой вольтметр с LCD-дисплеем

Узнай, какое напряжение даёт батарейка или блок питания, с помощью измерителя, собранного своими руками. Делитель из двух резисторов понижает высокое напряжение до уровня, который может прочитать плат

4.5(27)
36
Кодовый замок с клавиатурой 4x4 и LCD
#64Продвинутый
Premium

Кодовый замок с клавиатурой 4x4 и LCD

Маленький электронный дверной замок, который не пускает тех, кто не знает кода. Ты нажимаешь клавишу решётки и вводишь код на клавиатуре; если он верный, экран сообщает, что доступ разрешён, загораетс

4.8(59)
75
Игра-бегалка на LCD с Arduino
#98Средний
Premium

Игра-бегалка на LCD с Arduino

Бесконечная игра-бегалка с горизонтальной прокруткой на символьном LCD-экране 16x2. Герой бежит сам, а игрок перепрыгивает препятствия нажатием кнопки. Случайные препятствия появляются в верхней и нижней строке. Пассивный зуммер играет вступительную мелодию, звук прыжка, праздничный звук на 50 очков и мелодию конца игры. При запуске показывается заставка «BlueGrays - Arduino Projects». Счёт обновляется сразу в правом верхнем углу экрана.

4.6(32)
55