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-дисплей?
Эти дисплеи работают на микросхеме-драйвере HD44780. Каждый символ рисуется в маленькой клетке 5x8 пикселей, а внутри микросхемы есть встроенная таблица символов: буквы, цифры и некоторые значки. Arduino отправляет только команду вида «напиши эту букву в этой позиции»; превратить букву в пиксели — уже задача дисплея. Светодиодная подсветка делает текст читаемым в темноте, а слой жидких кристаллов формирует текст, затемняя пиксели.
Что такое I2C и почему с ним проще?
I2C — способ, которым несколько устройств общаются по двум проводам: SDA передаёт данные, а SCL — тактовый сигнал. У каждого устройства свой адрес, и Arduino обращается к нужному устройству по этому адресу. LCD-модули обычно используют адрес 0x27 или 0x3F. На те же два провода можно повесить модуль часов, OLED-дисплей и датчики вроде BME280; пока адреса разные, все они работают вместе.

Микросхема 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-пины своей платы, загляни в утилиту Распиновка.
| Пин LCD | Arduino Uno / Nano | Arduino Mega | ESP32 | Raspberry Pi Pico |
|---|---|---|---|---|
| GND | GND | GND | GND | GND |
| VCC | 5V | 5V | VIN (5V) | VBUS (5V) |
| SDA | A4 | 20 | GPIO 21 | GP4 |
| SCL | A5 | 21 | GPIO 22 | GP5 |
Как найти I2C-адрес: скетч-сканер
Если адрес дисплея неизвестен, загрузи код ниже. Он перебирает все адреса от 1 до 126 и выводит в монитор порта адрес каждого устройства, которое ответило. Этот адрес понадобится при настройке дисплея.
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.
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 миллисекунд сдвигает его влево, так что длинное сообщение бежит по экрану, как на табло.
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, — это горящие пиксели. Пример ниже рисует сердечко; точно так же можно нарисовать любую недостающую букву.
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 heartI2C 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 — и используй их так:
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
Дай своему Arduino собственный экран и заставь его написать первое сообщение. Двухстрочный LCD-экран подключается всего несколькими проводами; в верхней строке появляется приветствие, затем второе соо

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

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

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

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

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

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

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

