Модули · статья
LCD 1602 и Arduino по I2C: подключение, библиотека, кириллица
Экран на две строки по шестнадцать знаков, который подключается к Arduino четырьмя проводами. Разбираем по порядку: что за модуль припаян сзади и зачем он нужен, какой у экрана адрес и как его узнать за секунду, какую из пяти библиотек с похожими именами ставить, почему «Привет» превращается в катакану и как вывести русские буквы. Размеры скетчей и поведение библиотек мы измерили сами; то, что видно на стекле, описано по устройству экрана — и мы это оговариваем.
Что такое LCD 1602 и при чём тут I2C
1602 — это 16 знаков в строке и 2 строки, всего 32 знакоместа. Бывает 2004 — 20 на 4, всё остальное у них одинаковое. Внутри стоит контроллер HD44780 или его клон, и общается он с платой через 16 контактов: 8 линий данных, три управляющих, питание, контраст и подсветка. В уроке «Экран LCD: выводим текст и цифры» мы подключали его напрямую: получалось шесть сигнальных проводов плюс питание и подстроечник на контраст — больше десяти проводов на одну деталь.
I2C — способ подключить то же самое по двум проводам. Сзади на экран напаивают маленький модуль с микросхемой PCF8574: плата шлёт ей байты по шине I2C, а микросхема раскладывает их по ножкам экрана. К плате идут только четыре провода — питание, земля и две линии шины. Подстроечник контраста переезжает на этот модуль, подсветка включается командой.
16 контактов. Без модуля к плате идут 6 сигнальных проводов (4-битный режим) плюс питание, контраст и подсветка — 10–12 проводов.
- GND → GND
- VCC → 5V
- SDA → A4 (Uno, Nano)
- SCL → A5 (Uno, Nano)
На модуле: синий подстроечник контраста, перемычка подсветки и три площадки A0–A2, которые задают адрес.
Цена удобства — скорость: каждый байт экрану теперь едет через шину, и библиотека шлёт его двумя половинками. Для текста это не имеет значения, даже счётчик миллисекунд успевает. Зато вывод A4 и A5 на Uno теперь заняты шиной — правда, по той же шине можно повесить хоть десять устройств, и экран, и часы, и датчик.
Как подключить: четыре провода
- GND → GND (земля)
- 5V → VCC (питание)
- A4 → SDA (данные)
- A5 → SCL (такт)
| На модуле | Uno, Nano | Mega 2560 | Leonardo, Micro | ESP8266 (NodeMCU, D1 mini) | ESP32 (классический DevKit) |
|---|---|---|---|---|---|
| GND | GND | GND | GND | GND | GND |
| VCC | 5V | 5V | 5V | VIN на NodeMCU, 5V на D1 mini — см. про питание ниже | VIN / 5V — см. про питание ниже |
| SDA | A4 | 20 | 2 | D2 (GPIO4) | 21 |
| SCL | A5 | 21 | 3 | D1 (GPIO5) | 22 |
Номера выводов для плат Arduino взяты из файлов pins_arduino.h ядра 1.8.8 (для Uno это выводы 18 и 19 — они же A4 и A5), для ESP8266 — из ядра 3.1.2, для ESP32 — по документации классической платы DevKit; у маленьких ESP32-C3 и S3 по умолчанию SDA 8 и SCL 9, смотрите свою плату. На Uno и Mega рядом с AREF есть ещё два контакта с подписями SDA и SCL — это те же самые линии, просто продублированные, пользуйтесь любыми.
Про питание. Обычный экран 1602 и его подсветка рассчитаны на 5 В: с 3,3 В сам модуль I2C отзовётся сканеру, а вот надпись будет еле видна или не видна вовсе. Бывают и 3,3-вольтовые экраны — у них на плате написано 3.3V, и с ESP они работают напрямую; если пометки нет, экран пятивольтовый. Для него на ESP8266 и ESP32 берут вывод, куда приходят 5 В от USB (VIN на NodeMCU, 5V на D1 mini), а SDA и SCL — выводы платы. Здесь честная оговорка: на дешёвых модулях I2C резисторы подтяжки стоят на 5 В, и на 3,3-вольтовых линиях ESP это перебор. Сама страница про ESP8266 так и советует: пятивольтовые модули — через преобразователь уровней. Безопасный путь — преобразователь на SDA и SCL или модуль с подтяжками, перепаянными на 3,3 В; прямое соединение встречается повсюду, но это на свой риск. Живьём мы это не проверяли. И мелочь при сборке под ESP: библиотека де Брабандера объявлена только для AVR, поэтому компилятор напишет «библиотека должна запускаться на архитектуре avr и может быть несовместима» — это предупреждение, не ошибка, скетч собирается (мы проверили под NodeMCU: 236 180 байт). Ответвление 2.0.0 в описании заявляет «all», но Arduino CLI это слово за «любую плату» не считает и предупреждает так же.
Если экрана ещё нет. Мы делаем среду для модулей Trema, и в том же магазине лежит ровно тот экран, о котором эта статья: символьный дисплей LCD1602 I²C (артикул 540, 460 ₽) — HD44780, две строки по 16 знаков, белые буквы на синем, модуль I2C на PCF8574 уже припаян. Полезная мелочь из его характеристик: питание ему нужно 5 В, а вот логические уровни заявлены 3,3–5 В — то есть с ESP8266 и ESP32 он работает без преобразователя уровней, в отличие от безымянных модулей с рынка. Адрес — 0x27 или 0x3F.
Адрес экрана: 0x27, 0x3F и как узнать свой
У каждого устройства на шине I2C есть номер — адрес, по которому плата к нему обращается. Модуль для LCD отзывается на 0x27 или 0x3F, и какой именно — решает буква в маркировке микросхемы. А три площадки A0–A2 на модуле позволяют адрес изменить, чтобы повесить на шину два одинаковых экрана.
| Запаяны площадки | Микросхема PCF8574 | Микросхема PCF8574A |
|---|---|---|
— — —заводское состояние: площадки не запаяны | 0x27 | 0x3F |
— — A0 | 0x26 | 0x3E |
— A1 — | 0x25 | 0x3D |
— A1 A0 | 0x24 | 0x3C |
A2 — — | 0x23 | 0x3B |
A2 — A0 | 0x22 | 0x3A |
A2 A1 — | 0x21 | 0x39 |
A2 A1 A0 | 0x20 | 0x38 |
Угадывать не обязательно. Вот сканер: он опрашивает все 126 возможных адресов и печатает в монитор порта те, где кто-то ответил. Запустите, откройте монитор на 9600 бод — и строка Found 0x27 (или 0x3F) и есть ваш адрес.
// Сканер I2C: печатает адреса всех устройств на шине.
#include <Wire.h>
void setup() {
Wire.begin();
Serial.begin(9600);
Serial.println("I2C scanner");
}
void loop() {
byte count = 0;
for (byte addr = 1; addr < 127; addr++) {
Wire.beginTransmission(addr);
if (Wire.endTransmission() == 0) { // кто-то ответил
Serial.print("Found 0x");
if (addr < 16) Serial.print("0");
Serial.println(addr, HEX);
count++;
}
}
if (count == 0) Serial.println("No devices");
delay(5000);
}
Если сканер говорит No devices — модуль не отвечает вовсе. Это не про адрес, а про провода: SDA и SCL перепутаны местами, нет общей земли, на модуль не пришло питание. Проверьте их, а не библиотеку. Если сканер нашёл 0x27, а на стекле пусто — смотрите контраст и питание: от 3,3 В модуль отвечает, а экрану этого мало. И третий исход: сканер напечатал заголовок и замолчал — одна из линий замкнута на землю, и на платах AVR библиотека Wire ждёт её вечно; снимите питание и проверьте провода. В Trema IDE похожий сканер лежит в примерах, раздел «Полезное», скетч I2C_Scanner — он пишет по-русски, «Найдено устройство по адресу 0x27».
Библиотека: пять похожих имён и одна правильная
Вот где новички теряют больше всего времени. По слову «liquidcrystal» каталог находит почти полсотни библиотек, с десяток из них — про I2C, и несколько из них называются одинаково. Мы поставили главные из нашего каталога и собрали с каждой похожий скетч «привет» для Arduino Uno.
| Библиотека | Как включается | Флеш, байт | ОЗУ, байт | Что надо знать |
|---|---|---|---|---|
| LiquidCrystal I2C 1.1.2 (Frank de Brabander) | lcd.init(); lcd.backlight(); | 3 272 | 287 | Та самая, из всех уроков. Папка LiquidCrystal_I2C. У неё нет begin() без аргументов — только init(). |
| LiquidCrystal_I2C 2.0.0 (Martin Kubovčík) | lcd.init(); lcd.backlight(); — те же | 3 290 | 288 | Ответвление библиотеки де Брабандера: команды те же, скетчи из уроков собираются без правок. Папка та же, поэтому рядом с первой не встанет — и не нужна. |
| LiquidCrystal_PCF8574 2.3.0 (Matthias Hertel) | lcd.begin(16, 2); lcd.setBacklight(255); | 3 254 | 277 | Аккуратная и поддерживаемая. setBacklight(255) включает подсветку, setBacklight(0) гасит — градаций яркости нет, у модуля подсветка на одном выводе. Команды другие: скетчи от де Брабандера не подойдут без правки. |
| hd44780 1.3.2 (Bill Perry) | #include <hd44780ioClass/hd44780_I2Cexp.h> вторым; hd44780_I2Cexp lcd; lcd.begin(16, 2); | 5 906 | 331 | Сама находит адрес и распайку модуля — из пяти в таблице единственная, которой не надо говорить 0x27 или 0x3F. Дороже на 2,6 КБ флеша. |
| I2C_LiquidCrystal_RUS 1.0.9 (Alash Electronics) | #define _LCD_TYPE 1 перед include | 5 804 | 505 | Русские буквы на обычном экране: рисует их сама. Требует установленной LiquidCrystal_I2C (любой из двух выше) и строку #define до подключения. Числа печатает только с основанием: lcd.print(x, DEC). |
Рецепт простой. Если вы идёте по уроку из интернета — почти наверняка там библиотека Франка де Брабандера: конструктор с тремя числами, lcd.init() и lcd.backlight(). В каталоге она называется «LiquidCrystal I2C» — с пробелом, автор Frank de Brabander, версия 1.1.2. Её и ставьте; её ответвление 2.0.0 подойдёт так же. Если пишете с нуля — hd44780 избавит от возни с адресом, а LiquidCrystal_PCF8574 — самая чистая. Но чужие примеры под них придётся подправлять.
begin() без чисел, а init() не существует. В каталожной 1.1.2 наоборот: запуск — init(), а begin() есть только с числами в скобках. Мы это проверили сборкой: замена одного слова — и ошибка уходит. Не чините её на begin(16, 2): это соберётся, но внутри нет Wire.begin() — шина останется ненастроенной, и модуль, скорее всего, не ответит (по коду; живьём не проверяли). Вторая популярная ошибка — LiquidCrystal_I2C.h: No such file or directory — значит просто, что библиотека не установлена: как ставить, разобрано в статье «Как установить библиотеку».Библиотека Wire.h, которую подключают первой строкой, — это сама шина I2C. Её скачивать не надо, она входит в ядро каждой платы. «Скачать библиотеку I2C для Arduino» — запрос, у которого нет ответа: качать нужно LiquidCrystal I2C, а Wire уже есть.
Первый скетч: две строки текста
// Первый скетч: две строки текста на экране 1602 по I2C.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Адрес 0x27 — у большинства модулей. Если экран молчит, попробуйте 0x3F
// или запустите сканер адресов из раздела ниже.
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
lcd.init(); // у этой библиотеки именно init(), а не begin()
lcd.backlight(); // init() гасит подсветку, эта строка включает снова
lcd.setCursor(0, 0); // столбец 0, строка 0 — верхняя
lcd.print("Hello, Arduino!");
lcd.setCursor(0, 1); // вторая строка
lcd.print("I2C LCD 1602");
}
void loop() {
}
Скетч занимает 3 272 байта памяти программ и 287 байт оперативной памяти на Uno — десятая часть флеша и седьмая часть ОЗУ. Для сравнения, пустая мигалка — 924 байта. То есть экран обходится плате в два с небольшим килобайта, и для любого проекта это копейки. Числа для Nano те же, Mega 2560 тратит 3 928 байт флеша из 253 952.
Три вещи, на которые стоит посмотреть в коде. Во-первых, setCursor(столбец, строка) — сначала столбец, и счёт с нуля: левый верхний угол — это (0, 0), начало второй строки — (0, 1). Во-вторых, backlight() обязателен: без него экран работает, но в темноте. В-третьих, если загрузили, а на экране ничего — не спешите менять код, сначала прочитайте раздел про контраст ниже.
Показания, которые меняются: счётчик и датчик
Экран не очищается сам: если напечатать «123», а потом на то же место «45», на стекле останется «453». Поэтому либо затираем хвост пробелами, либо печатаем число в поле фиксированной ширины. Вот счётчик секунд — 3 428 байт, и он работает без единого clear():
// Счётчик секунд: число меняется, а подпись остаётся.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
lcd.init();
lcd.backlight();
lcd.print("Seconds:");
}
void loop() {
lcd.setCursor(0, 1);
lcd.print(millis() / 1000);
lcd.print(" "); // затираем хвост, когда число стало короче
delay(200);
}
Команда lcd.clear() тоже есть, но пользоваться ею в loop() не стоит: она стирает весь экран, и при частом обновлении он начинает моргать. Стирайте только то, что меняется.
А вот показания с аналогового входа и полоска-индикатор из сплошных прямоугольников — код 255 в заводской таблице знаков. Подключать датчик не обязательно: без него A0 ловит наводки, и полоска живёт сама по себе. Скетч — 3 720 байт флеша.
// Показания аналогового входа числом и полоской-индикатором.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
lcd.init();
lcd.backlight();
lcd.print("A0 = ");
}
void loop() {
int value = analogRead(A0); // 0…1023
lcd.setCursor(5, 0);
lcd.print(value);
lcd.print(" "); // затираем хвост от прошлого числа
int bars = map(value, 0, 1023, 0, 16);
lcd.setCursor(0, 1);
for (int i = 0; i < 16; i++) {
lcd.write(i < bars ? 255 : ' '); // 255 — сплошной прямоугольник
}
delay(200);
}
Контраст: почему видно только квадраты или не видно ничего
Самая частая картина после первой загрузки — верхняя строка из шестнадцати тёмных прямоугольников, нижняя пустая. Или наоборот: подсветка горит, а букв нет. В обоих случаях код, скорее всего, правильный, а виноват контраст — синий подстроечник на модуле I2C.
- Ряд квадратов в верхней строке — контраст выкручен слишком сильно, либо экран не получил команды инициализации (не тот адрес, не та библиотека). Сначала медленно покрутите подстроечник. Если квадраты бледнеют, а букв так и нет — проверяйте адрес сканером.
- Подсветка есть, на стекле пусто — контраст на нуле. Крутите в другую сторону, пока не появятся бледные квадраты, потом чуть назад.
- Подсветки нет — либо не вызвали
backlight(), либо на модуле снята перемычка рядом с микросхемой (две площадки с подписью LED). Наденьте её. Яркость подсветки модуль I2C регулировать не умеет — только включить и выключить; хотите тусклее, вместо перемычки поставьте резистор на 100–470 Ом.
Подстроечник чувствительный: рабочая зона — небольшой участок хода, и крутить надо маленькой отвёрткой, не спеша. Это единственный орган управления на всей сборке, и он решает половину «не работает».
Кириллица: почему выходит катакана и что с этим делать
Напишите lcd.print("Привет") — и на экране появятся японские знаки и пустые места. Вот почему.
У экрана внутри зашита таблица знаков на 256 кодов. В самой массовой версии — её называют ПЗУ A00 — первые 128 кодов это обычная латиница и цифры, а вторая половина отдана японской азбуке катакана. Русских букв там нет вовсе. Компьютер же хранит слово «Привет» в кодировке UTF-8 по два байта на букву, и экран послушно рисует по своей таблице то, что лежит под каждым из двенадцати байтов.
Выхода три, и они не равноценны.
- Экран с русской таблицей. Бывают модули, у которых в ПЗУ зашита кириллица (в продаже они помечены «с русскими буквами» или «Russian ROM», это знакогенератор вроде Surenoo). Для них есть библиотека «LiquidCrystal I2C Multilingual» с классом
LCDI2C_Russian— мы её собрали, 6 468 байт флеша и 535 байт ОЗУ. Но на обычном экране она ничего не даст: букв-то в таблице нет. Уточняйте у продавца перед покупкой; в описании обычного модуля про ПЗУ не пишут ничего, и это значит A00. - Нарисовать буквы самому. У экрана есть восемь ячеек для собственных знаков — в уроке мы рисовали в них сердечко. Можно нарисовать и буквы, но только восемь разных одновременно. Для «Привет» хватит, для длинной строки — нет.
- Библиотека I2C_LiquidCrystal_RUS. Она делает второе за вас, причём хитро: буквы, которые совпадают с латинскими по начертанию, печатает из заводской таблицы, и только непохожие рисует в восемь ячеек. Это самый практичный путь для обычного экрана, и он есть в нашем каталоге. Одна особенность: числа ей надо отдавать с основанием —
lcd.print(value, DEC); простоlcd.print(value)не соберётся (мы проверили: «no matching function for call to … print(int&)»).
Знакоместо: 5 точек в ширину, 8 в высоту. Всего на экране 1602 их 32, и каждое показывает один код из знакогенератора.
Буквы, похожие на латиницу (А, В, Е, Ё, К, М, Н, О, Р, С, Т, Х и строчные а, е, о, р, с, у, х), библиотека берёт из заводской таблицы. Остальные рисует точками и кладёт в одну из восьми ячеек. После восьмой нарисованной буквы библиотека забывает все восемь: девятая ляжет в ячейку 0 и изменит ту букву, что там стояла.
// Русские буквы на обычном экране 1602: библиотека I2C_LiquidCrystal_RUS.
// Строка #define обязана стоять ДО #include — иначе сборка упадёт с
// ошибкой «LCD type connect has not been declared».
#define _LCD_TYPE 1 // 1 — по I2C, 2 — напрямую проводами
#include <I2C_LiquidCrystal_RUS.h>
I2C_LiquidCrystal_RUS lcd(0x27, 16, 2);
void setup() {
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Привет, мир!");
lcd.setCursor(0, 1);
lcd.print("Ардуино и LCD");
}
void loop() {
}
Две оговорки, обе — из исходников библиотеки. Первая: строка #define _LCD_TYPE 1 обязана стоять до #include, иначе сборка упадёт с ошибкой #error "LCD type connect has not been declared" — мы её воспроизвели. Вторая: библиотека надстраивается над LiquidCrystal_I2C (подойдёт любая из двух каталожных), но в каталоге эта зависимость не объявлена, так что ставить надо обе; если поставить одну RUS, ошибка будет выглядеть как LiquidCrystal_I2C.h: No such file or directory изнутри библиотеки. Скетч выше занимает 5 804 байта флеша и 505 байт ОЗУ — почти вдвое тяжелее английского «привета»: сами рисунки букв занимают полкилобайта, остальное — разбор UTF-8 и таблица соответствий, которая живёт в ОЗУ.
И честное предупреждение о пределе. В двух строках примера рисовать приходится семь букв — П, и, в, т, м, д, н (р, у, А, е, о библиотека печатает латиницей) — и в восемь ячеек они помещаются. Но стоит добавить ещё пару непохожих, скажем «ж» и «ы», как ячейки кончатся: сразу после восьмой нарисованной библиотека забывает все восемь, и следующую — даже повторную — кладёт в ячейку 0 — а буква, которая уже стояла на экране из этой ячейки, меняет начертание. По коду это именно так; на живом экране мы не проверяли, поэтому если нужна длинная русская надпись — переносите её на OLED, там такого ограничения нет: OLED-дисплей SSD1306 и Arduino.
Экран 2004, два экрана и шилд с кнопками
- LCD 2004 — тот же контроллер и тот же модуль, меняется только конструктор:
lcd(0x27, 20, 4). Всё остальное в этой статье верно и для него. - Два экрана на одной шине — на втором модуле запаиваем площадку A0 (адрес станет 0x26 или 0x3E), заводим два объекта с разными адресами. Провода SDA и SCL общие.
- LCD Keypad Shield — экран 1602 на плате с пятью кнопками, надевается на Uno сверху. Это не I2C: он подключён напрямую,
LiquidCrystal lcd(8, 9, 4, 5, 6, 7), а кнопки сидят на A0 через делитель. Библиотека для него — обычная LiquidCrystal, вшитая.
Ошибки, которые мы воспроизвели
| Что пишет компилятор или видно на экране | Что это | Что делать |
|---|---|---|
LiquidCrystal_I2C.h: No such file or directory | Библиотека не установлена | Поставить «LiquidCrystal I2C» (Frank de Brabander) из каталога. Trema IDE предложит её сама в окне «Нужна библиотека». |
no matching function for call to 'LiquidCrystal_I2C::begin()' | Скетч написан под версию библиотеки с GitHub, где запуск — begin() | Заменить lcd.begin() на lcd.init(). Не на begin(16, 2) — соберётся, но шина не настроится. |
no matching function for call to 'I2C_LiquidCrystal_RUS::print(int&)' | Русская библиотека не печатает число без основания | lcd.print(value, DEC) вместо lcd.print(value). |
I2C_LiquidCrystal_RUS.h: LiquidCrystal_I2C.h: No such file | Поставили русскую библиотеку без LiquidCrystal_I2C | Поставить «LiquidCrystal I2C» — Trema IDE предложит сама. |
#error "LCD type connect has not been declared" | Библиотеке RUS не сказали, как подключён экран | Добавить #define _LCD_TYPE 1 строкой выше #include. |
LiquidCrystal.h: No such file or directory | Библиотека прямого подключения не в ядре платы — в чистом Arduino CLI и PlatformIO её нет | В Arduino IDE и Trema IDE она вшита; в других средах поставить «LiquidCrystal» 1.0.7 из каталога. |
| Ряд тёмных квадратов в верхней строке | Контраст или экран не получил инициализацию | Крутить подстроечник; если не помогло — сканер адресов. |
Сканер пишет No devices | Модуль не виден на шине | SDA и SCL местами, нет общей земли, на модуль не пришло питание. |
| Катакана вместо русских букв | В заводской таблице экрана кириллицы нет | Библиотека I2C_LiquidCrystal_RUS или экран с русским ПЗУ. |
| При установке: «каталог LiquidCrystal_I2C уже существует» | Две версии одной библиотеки хотят одну папку (так говорят Arduino IDE и Arduino CLI) | Ничего: та, что стоит, подходит — команды у обеих одинаковые. |
LCD 1602 в Trema IDE
Мы делаем русскую среду для школ и кружков, и экран 1602 — одна из первых деталей, которые в ней подключают.
- Библиотека ставится из окна ошибки. Напишите
#include <LiquidCrystal_I2C.h>, нажмите «Проверить» — и вместо английской строки «No such file» появится окно «Нужна библиотека» с кандидатами из нашего каталога. Честно про порядок: первым в нём стоит ответвление LiquidCrystal_I2C 2.0.0, вторым — «LiquidCrystal I2C» 1.1.2 де Брабандера; команды у них одинаковые, так что подойдёт любой, но под уроки из интернета выбирайте второй. Мы это проверили, прогнав настоящий алгоритм программы по живому каталогу. Каталог — российский сервер libraries.trema.ru, 9 923 библиотеки, из них 195 про экраны. - LiquidCrystal для прямого подключения вшита — как и в Arduino IDE. Урок 26 собирается без установки чего бы то ни было.
- Сканер адресов — в примерах. Раздел «Полезное», скетч I2C_Scanner, с русскими комментариями.
- Ошибки объясняются по-русски. «Не хватает библиотеки: LiquidCrystal_I2C.h» — карточка с кнопкой установки. Честно: на ошибку с
begin()карточка пока общая — «Команда «LiquidCrystal_I2C::begin» вызвана с неподходящими значениями» — и проinit()она не подскажет; а на#errorиз библиотеки RUS карточка тоже общая, «Ошибка в программе», и за ней всплывает ложная — про неправильную строку#include, хотя дело в отсутствующем#define. Мы знаем и допишем.
Живой экран к этой статье мы не подключали: все цифры — из сборок и исходников библиотек, а картины на стекле описаны по устройству знакогенератора. Если у вас получается иначе — напишите, проверим.
Как подключить LCD 1602 с модулем I2C к Arduino Uno?
Четыре провода: GND к GND, VCC к 5V, SDA к A4, SCL к A5. На Arduino Mega SDA и SCL — это выводы 20 и 21, на Leonardo — 2 и 3, на NodeMCU — D2 и D1. Дальше нужна библиотека LiquidCrystal I2C и адрес модуля: 0x27 или 0x3F.
Какой адрес у экрана 1602 по I2C — 0x27 или 0x3F?
Зависит от микросхемы на модуле: PCF8574 даёт 0x27, PCF8574A — 0x3F (с незапаянными площадками A0–A2). Проверить проще, чем угадывать: загрузите сканер I2C, откройте монитор порта на 9600 — он напечатает Found 0x27 или Found 0x3F.
Какую библиотеку скачать для LCD 1602 I2C?
Почти все уроки написаны под LiquidCrystal I2C Франка де Брабандера (версия 1.1.2): у неё конструктор lcd(0x27, 16, 2), запуск lcd.init() и подсветка lcd.backlight(). Ошибка про begin() появляется, когда скетч написан под версию этой библиотеки с GitHub — там запуск lcd.begin() без чисел, а в каталожной его нет. В Trema IDE библиотека предлагается из окна ошибки «Нужна библиотека»: подойдёт любая из двух LiquidCrystal_I2C, команды одинаковые.
Почему на экране только квадраты в верхней строке?
Чаще всего это контраст: покрутите синий подстроечник на модуле I2C маленькой отвёрткой, пока квадраты не сменятся буквами. Если квадраты бледнеют, а текста нет, экран не получил команд инициализации — проверьте адрес сканером и библиотеку.
Почему вместо русских букв на LCD 1602 японские знаки?
В заводской таблице знаков массового экрана (ПЗУ A00) русских букв нет: там латиница и японская катакана. Слово «Привет» в UTF-8 — это 12 байт, и экран рисует по своей таблице каждый из них. Русские буквы выводят библиотекой I2C_LiquidCrystal_RUS, которая рисует недостающие буквы в восьми пользовательских ячейках, либо берут экран с русским знакогенератором.
Чем LCD 2004 отличается от 1602 при подключении?
Ничем, кроме размера: та же микросхема, тот же модуль I2C и та же библиотека. Меняется только конструктор — lcd(0x27, 20, 4) вместо lcd(0x27, 16, 2).
Сколько памяти Arduino занимает LCD 1602 по I2C?
Мы измерили: скетч с двумя строками текста занимает 3 272 байта памяти программ (10 %) и 287 байт оперативной памяти (14 %) на Uno. Пустая мигалка — 924 байта. Русская библиотека I2C_LiquidCrystal_RUS тяжелее: 5 804 и 505 байт.
Нужно ли скачивать библиотеку Wire.h для I2C?
Нет. Wire — это сама шина I2C, она входит в ядро каждой платы Arduino и ESP. Скачивать нужно только библиотеку экрана, например LiquidCrystal I2C; Wire.h подключают первой строкой, но ставить её неоткуда и незачем.
Подключите экран в Trema IDE
Библиотека ставится из окна ошибки, сканер адресов лежит в примерах, ошибки объясняются по-русски. Дома бесплатно: через неделю попросит бесплатную регистрацию по почте — и всё. Дальше по теме: OLED-дисплей SSD1306, урок про LCD без модуля, как ставить библиотеки.
