Модули · статья

LCD 1602 и Arduino по I2C: подключение, библиотека, кириллица

Экран на две строки по шестнадцать знаков, который подключается к Arduino четырьмя проводами. Разбираем по порядку: что за модуль припаян сзади и зачем он нужен, какой у экрана адрес и как его узнать за секунду, какую из пяти библиотек с похожими именами ставить, почему «Привет» превращается в катакану и как вывести русские буквы. Размеры скетчей и поведение библиотек мы измерили сами; то, что видно на стекле, описано по устройству экрана — и мы это оговариваем.

Что такое LCD 1602 и при чём тут I2C

1602 — это 16 знаков в строке и 2 строки, всего 32 знакоместа. Бывает 2004 — 20 на 4, всё остальное у них одинаковое. Внутри стоит контроллер HD44780 или его клон, и общается он с платой через 16 контактов: 8 линий данных, три управляющих, питание, контраст и подсветка. В уроке «Экран LCD: выводим текст и цифры» мы подключали его напрямую: получалось шесть сигнальных проводов плюс питание и подстроечник на контраст — больше десяти проводов на одну деталь.

I2C — способ подключить то же самое по двум проводам. Сзади на экран напаивают маленький модуль с микросхемой PCF8574: плата шлёт ей байты по шине I2C, а микросхема раскладывает их по ножкам экрана. К плате идут только четыре провода — питание, земля и две линии шины. Подстроечник контраста переезжает на этот модуль, подсветка включается командой.

Экран LCD 1602
VSSVDDV0RSRWED0D1D2D3D4D5D6D7AK

16 контактов. Без модуля к плате идут 6 сигнальных проводов (4-битный режим) плюс питание, контраст и подсветка — 10–12 проводов.

К плате Arduino
  • GND → GND
  • VCC → 5V
  • SDA → A4 (Uno, Nano)
  • SCL → A5 (Uno, Nano)

На модуле: синий подстроечник контраста, перемычка подсветки и три площадки A0–A2, которые задают адрес.

Модуль I2C — это микросхема-расширитель PCF8574: она получает байт по двум проводам и раскладывает его по восьми ножкам экрана. Раскладка взята из библиотеки LiquidCrystal_I2C: P0 — RS, P1 — RW, P2 — E, P3 — подсветка, P4–P7 — линии данных D4–D7. Линии D0–D3 экрана не подключены вовсе.

Цена удобства — скорость: каждый байт экрану теперь едет через шину, и библиотека шлёт его двумя половинками. Для текста это не имеет значения, даже счётчик миллисекунд успевает. Зато вывод A4 и A5 на Uno теперь заняты шиной — правда, по той же шине можно повесить хоть десять устройств, и экран, и часы, и датчик.

Если у вас экран без модуля — с 16 голыми контактами — то вариантов два: купить модуль отдельно (он называется «I2C адаптер для LCD 1602» и стоит меньше сотни рублей) или собирать по уроку напрямую. Библиотека для прямого подключения, LiquidCrystal, в Trema IDE уже вшита, ставить ничего не надо.

Как подключить: четыре провода

ARDUINOUNOUSBPOWERANALOG INGND5VA4A5Hello, Arduino!I2C LCD 1602PCF8574Модуль I2C сзади экрана 1602GNDVCCSDASCL
  • GNDGND (земля)
  • 5VVCC (питание)
  • A4SDA (данные)
  • A5SCL (такт)
Четыре провода — и всё. Выводы A4 и A5 на Uno и Nano — это шина I2C (в ядре Arduino они же выводы 18 и 19); на Mega 2560 вместо них 20 и 21, на Leonardo — 2 и 3, на NodeMCU — D2 и D1. Подписи на модуле всегда одни и те же: GND, VCC, SDA, SCL.
На модулеUno, NanoMega 2560Leonardo, MicroESP8266 (NodeMCU, D1 mini)ESP32 (классический DevKit)
GNDGNDGNDGNDGNDGND
VCC5V5V5VVIN на NodeMCU, 5V на D1 mini — см. про питание нижеVIN / 5V — см. про питание ниже
SDAA4202D2 (GPIO4)21
SCLA5213D1 (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
— — —заводское состояние: площадки не запаяны0x270x3F
— — A00x260x3E
— A1 —0x250x3D
— A1 A00x240x3C
A2 — —0x230x3B
A2 — A00x220x3A
A2 A1 —0x210x39
A2 A1 A00x200x38
Адрес модуля складывается из базы микросхемы и трёх перемычек. На микросхеме написано «PCF8574T» или «PCF8574AT» — буква A и решает, 0x27 у вас или 0x3F. Запаянная площадка даёт ноль в своём разряде, поэтому адрес уменьшается. Если на микросхеме маркировка стёрта — запустите сканер, он ответит за секунду.

Угадывать не обязательно. Вот сканер: он опрашивает все 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 272287Та самая, из всех уроков. Папка LiquidCrystal_I2C. У неё нет begin() без аргументов — только init().
LiquidCrystal_I2C 2.0.0 (Martin Kubovčík)lcd.init(); lcd.backlight(); — те же3 290288Ответвление библиотеки де Брабандера: команды те же, скетчи из уроков собираются без правок. Папка та же, поэтому рядом с первой не встанет — и не нужна.
LiquidCrystal_PCF8574 2.3.0 (Matthias Hertel)lcd.begin(16, 2); lcd.setBacklight(255);3 254277Аккуратная и поддерживаемая. setBacklight(255) включает подсветку, setBacklight(0) гасит — градаций яркости нет, у модуля подсветка на одном выводе. Команды другие: скетчи от де Брабандера не подойдут без правки.
hd44780 1.3.2 (Bill Perry)#include <hd44780ioClass/hd44780_I2Cexp.h> вторым; hd44780_I2Cexp lcd; lcd.begin(16, 2);5 906331Сама находит адрес и распайку модуля — из пяти в таблице единственная, которой не надо говорить 0x27 или 0x3F. Дороже на 2,6 КБ флеша.
I2C_LiquidCrystal_RUS 1.0.9 (Alash Electronics)#define _LCD_TYPE 1 перед include5 804505Русские буквы на обычном экране: рисует их сама. Требует установленной 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 — самая чистая. Но чужие примеры под них придётся подправлять.

Откуда ошибка «no matching function for call to LiquidCrystal_I2C::begin()». Вы взяли скетч, написанный под версию этой же библиотеки с GitHub (она ставится ZIP-файлом, в каталогах её нет): там запуск называется 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);
}

Контраст: почему видно только квадраты или не видно ничего

Микросхема PCF8574 — буква A в маркировке означает адрес 0x3FPCF8574контраст —крутить отвёрткойLEDперемычка подсветки:снята — экран не светитсяA2A1A0площадки адреса:запаять — адрес меньшеGNDVCCSDASCLчетыре провода к плате
Обратная сторона модуля: синий подстроечник — контраст (им лечится и ряд тёмных квадратов, и пустой экран при горящей подсветке), жёлтая перемычка LED — подсветка, три площадки A0–A2 задают адрес, а по букве в маркировке микросхемы видно, 0x27 у вас или 0x3F. Рисунок условный: у разных партий элементы расставлены по-своему, но набор всегда этот.

Самая частая картина после первой загрузки — верхняя строка из шестнадцати тёмных прямоугольников, нижняя пустая. Или наоборот: подсветка горит, а букв нет. В обоих случаях код, скорее всего, правильный, а виноват контраст — синий подстроечник на модуле I2C.

  • Ряд квадратов в верхней строке — контраст выкручен слишком сильно, либо экран не получил команды инициализации (не тот адрес, не та библиотека). Сначала медленно покрутите подстроечник. Если квадраты бледнеют, а букв так и нет — проверяйте адрес сканером.
  • Подсветка есть, на стекле пусто — контраст на нуле. Крутите в другую сторону, пока не появятся бледные квадраты, потом чуть назад.
  • Подсветки нет — либо не вызвали backlight(), либо на модуле снята перемычка рядом с микросхемой (две площадки с подписью LED). Наденьте её. Яркость подсветки модуль I2C регулировать не умеет — только включить и выключить; хотите тусклее, вместо перемычки поставьте резистор на 100–470 Ом.

Подстроечник чувствительный: рабочая зона — небольшой участок хода, и крутить надо маленькой отвёрткой, не спеша. Это единственный орган управления на всей сборке, и он решает половину «не работает».

Кириллица: почему выходит катакана и что с этим делать

Напишите lcd.print("Привет") — и на экране появятся японские знаки и пустые места. Вот почему.

D09FD180D0B8D0B2D0B5D182
Слово «Привет» в кодировке UTF-8 — это 12 байт: D0 9F D1 80 D0 B8 D0 B2 D0 B5 D1 82. Экран получает их по одному и на каждый рисует то, что лежит в его заводской таблице под этим номером: в японской таблице A00 коды 0xA1–0xDF — знаки катаканы, 0xE0–0xFF — греческие буквы и значки, а 0x80–0x9F вообще не определены. Получается 12 знакомест мусора вместо 6 букв.

У экрана внутри зашита таблица знаков на 256 кодов. В самой массовой версии — её называют ПЗУ A00 — первые 128 кодов это обычная латиница и цифры, а вторая половина отдана японской азбуке катакана. Русских букв там нет вовсе. Компьютер же хранит слово «Привет» в кодировке UTF-8 по два байта на букву, и экран послушно рисует по своей таблице то, что лежит под каждым из двенадцати байтов.

Выхода три, и они не равноценны.

  1. Экран с русской таблицей. Бывают модули, у которых в ПЗУ зашита кириллица (в продаже они помечены «с русскими буквами» или «Russian ROM», это знакогенератор вроде Surenoo). Для них есть библиотека «LiquidCrystal I2C Multilingual» с классом LCDI2C_Russian — мы её собрали, 6 468 байт флеша и 535 байт ОЗУ. Но на обычном экране она ничего не даст: букв-то в таблице нет. Уточняйте у продавца перед покупкой; в описании обычного модуля про ПЗУ не пишут ничего, и это значит A00.
  2. Нарисовать буквы самому. У экрана есть восемь ячеек для собственных знаков — в уроке мы рисовали в них сердечко. Можно нарисовать и буквы, но только восемь разных одновременно. Для «Привет» хватит, для длинной строки — нет.
  3. Библиотека I2C_LiquidCrystal_RUS. Она делает второе за вас, причём хитро: буквы, которые совпадают с латинскими по начертанию, печатает из заводской таблицы, и только непохожие рисует в восемь ячеек. Это самый практичный путь для обычного экрана, и он есть в нашем каталоге. Одна особенность: числа ей надо отдавать с основанием — lcd.print(value, DEC); просто lcd.print(value) не соберётся (мы проверили: «no matching function for call to … print(int&)»).

Знакоместо: 5 точек в ширину, 8 в высоту. Всего на экране 1602 их 32, и каждое показывает один код из знакогенератора.

8 ячеек для своих знаков (CGRAM)
0
1и
2в
3т
4м
5д
6н
7ж

Буквы, похожие на латиницу (А, В, Е, Ё, К, М, Н, О, Р, С, Т, Х и строчные а, е, о, р, с, у, х), библиотека берёт из заводской таблицы. Остальные рисует точками и кладёт в одну из восьми ячеек. После восьмой нарисованной буквы библиотека забывает все восемь: девятая ляжет в ячейку 0 и изменит ту букву, что там стояла.

Так устроена кириллица на обычном экране 1602 с библиотекой I2C_LiquidCrystal_RUS: в заводском знакогенераторе (ПЗУ A00) русских букв нет, и библиотека рисует их сама — но ячеек только восемь.
// Русские буквы на обычном экране 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

Остались вопросы? Напишите нам

Как подключить 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 без модуля, как ставить библиотеки.