Подключение LCD 16x2 по I2C к Arduino: 4 провода
LCD 16x2 с I2C-переходником на PCF8574 подключается к Arduino четырьмя проводами: VCC, GND, SDA (A4) и SCL (A5). Это самый быстрый способ добавить экран в проект и одновременно самый частый источник вопросов «квадраты вместо текста» и «пустой экран».
Живой пример с кодом есть в уроке LCD 16x2 по I2C, экран можно пощупать в симуляторе.
Ниже разбираем, что стоит внутри переходника, почему экран может молчать при правильной проводке, что делать с квадратами, как выбрать библиотеку, какой экран взять новичку и как проверить готовую схему по семи шагам.
Схема на 4 провода
| LCD I2C | Arduino Uno |
|---|---|
| GND | GND |
| VCC | 5 В |
| SDA | A4 |
| SCL | A5 |
За двумя надписями VCC и GND на самом деле не LCD, а модуль-переходник: на нём стоит микросхема PCF8574, это восемь дополнительных выводов, раздающих команды самому дисплею. С настоящим LCD без переходника пришлось бы тянуть 12 проводов: восемь данных, две команды подсветки, питание и земля. Переходник превращает это в две линии шины I2C, по которым Arduino общается с расширителем, а тот уже дёргает HD44780 как положено. Отсюда и два практических следствия: у экрана появляется свой адрес на шине, а сам контроллер дисплея остаётся восьмибитным и ничего не знает про Arduino.
Адрес у модулей один из двух: 0x27 у микросхемы PCF8574 и 0x3F у PCF8574A. Какой именно стоит, зависит от перемычки A0 на плате: в положении «включено» адрес сдвигается. Поэтому в коде адрес указывают не по памяти, а узнают сканером, и это занимает меньше минуты.
Код: приветствие и счётчик
#include <LiquidCrystal_I2C.h>LiquidCrystal_I2C lcd(0x27, 16, 2); void setup() { lcd.init(); lcd.backlight(); lcd.setCursor(0, 0); lcd.print("Privet, mir!");} void loop() { lcd.setCursor(0, 1); lcd.print("Sec: "); lcd.print(millis() / 1000); delay(500);}Конструктор LiquidCrystal_I2C принимает три параметра: адрес, число столбцов и число строк. Для экрана 16x2 это lcd(0x27, 16, 2), для 20x4 это lcd(0x27, 20, 4), и путаница между этими размерами даёт симптом, который мы разберём ниже. Дальше lcd.init() переводит контроллер в рабочий режим, lcd.backlight() включает подсветку, setCursor перемещает курсор, а print выводит текст. Текст на латинице выводится без проблем: в отличие от кириллицы, латинские буквы есть в штатной прошивке контроллера.
Квадраты вместо текста
Ряды закрашенных квадратов в первой строке означают, что экран включён, но не инициализирован, либо сбита контрастность. Подстроечный потенциометр на I2C-модуле крутите до появления символов при включённом питании, и делайте это при подключённом питании, иначе регулировать нечего. Квадраты во второй строке после старта говорят о другом: библиотека не совпадает с адресом или размером экрана. Проверьте параметры конструктора lcd(0x27, 16, 2) против 0x3F и 20, 4, а размер берите с маркировки самого дисплея.
Отдельно про подсветку. Модули с синей подсветкой читаются плохо: на них белые символы выцветают, и приходится уменьшать контраст до предела. Экран с зелёной или белой подсветкой читается заметно лучше, и если покупаете новый, берите такой. Если же подсветка нужна только для индикации, а не для чтения, её можно погасить вызовом noBacklight(), и это снимает лишний ток.
Тупик: экран не загорается, хотя провода верные
Первый такой случай мы разобрали на учебном стенде. Провода были разложены правильно, SDA на A4, SCL на A5, питание 5 В, земля общая. Экран не показывал ничего, сканер I2C молчал, и мы начали менять библиотеки и версии, как будто дело было в софте.
В итоге оказалось, что на плате переходника перепутаны две пары выводов: переключатель на модуле стоял в положении «I2C», а провода шли к разъёму с параллельным интерфейсом. Переходник на PCF8574 можно переключать между режимами I2C и SPI, и в режиме SPI он занимает четыре обычных вывода вместо двух шинных. Второй случай был связан с питанием: модуль питался от 3,3 В, а подтяжки на нём оказались подняты к 5 В, и шина встала в неопределённое состояние. Вывод: прежде чем менять код, проверьте положение переключателя на модуле и уровень напряжения на VCC.
Личный опыт: почему мы перестали брать LCD 16x2
Мы много работали с LCD 16x2 и знаем его слабые места. Первое: контроллер HD44780 не умеет кириллицу из коробки. В штатной прошивке есть латиница и цифры, а русские буквы нужно либо загружать в восемь доступных пользовательских символов через createChar, либо пользоваться библиотекой с русской кодовой страницей. Для нормального русского текста это неудобно, и часть сообщений приходится писать транслитом.
Второе: обновление экрана идёт медленно. Каждый символ переводится по внутренней таблице контроллера, и вывод строки занимает заметное время, поэтому частые обновления дают мерцание. Третье: у 20x4 четыре строки, но на корпусе сверху часто напечатаны подписи позиций для платы с LCD1602, и при первом включении кажется, что экран сломан. Мы не отказываемся от LCD полностью, там, где нужен большой шрифт и простое чтение, но для русскоязычного интерфейса всё чаще берём OLED SSD1306: там нет ограничения на алфавит, а сам экран рисуется программно и обновляется целиком.
Авторская позиция: какой экран взять новичку
Мы советуем начинать с OLED 128x64, а LCD 16x2 оставить на потом. Причина одна и очень практичная: OLED рисуется библиотекой Adafruit GFX, где текст выводится любыми символами сразу, а не через ограниченный алфавит контроллера. Плюс на OLED проще геометрия: линии, круги и графики строятся готовыми командами, тогда как на LCD для каждого пикселя приходится генерировать свои символы.
Но если задача именно LCD, а не OLED, берите модуль 20x4 с зелёной или белой подсветкой и с перемычками A0, A1: это даст возможность выбрать адрес перемычкой и вывести больше текста. Проверьте при покупке, что на модуле есть потенциометр контраста: у некоторых дешёвых модулей его нет, и тогда контраст не регулируется вообще, а экран может не работать вовсе. И помните про кириллицу: если в проекте предполагается русский текст, сразу считайте, сколько символов придётся рисовать самому.