Эмулятор LCD 1602 онлайн: проверьте текст и I2C без железа
LCD 16×2 — самый частый дисплей в первых проектах и самый частый источник тупика «собрал, а на экране квадраты». Урок про первый текст по I2C ведёт от распиновки к печатанию; здесь же методика проверки текста до сборки — печатайте, двигайте курсор, гоняйте бегущую строку прямо в браузере.
Отдельная боль — кириллица: у дисплея своя кодовая таблица, и UTF-8 в неё не влезает. Как обходят этот затык, объясняет урок про кириллицу и свои глифы; на этой странице — что именно видит эмулятор, где кончается экран и начинается железо, и пять промахов, которые я собирал на кружке.
Что видно в эмуляторе сразу
Движок рисует честную сетку 16×2: две строки по шестнадцать знакомест, подсветка, позиция курсора после setCursor. Напечатаете строку длиннее — символы уйдут за край ровно так, как поведёт себя настоящая матрица. Схему собирать не нужно: дисплей встаёт на I2C-шину сам, а в коде — знакомые строки LiquidCrystal_I2C.
- Раскладка текста: 16 колонок (номера 0-15) и 2 строки (0 и 1) — заголовок и значения помещаются или нет, видно сразу.
- Курсор и очистка: setCursor ставит перо в нужное знакоместо, clear() возвращает его в угол — поведение один в один с библиотекой.
- Кириллица: в браузере «Привет» встанет в сетку как есть, а настоящая матрица примет его только после перекодировщика или своих глифов — разницу полезно знать заранее.
- Ширина строки: длинная фраза показывает, где именно отрезается 17-й символ.
- Бегущая строка: окно в 16 знаков едет по таймеру millis() так же, как на плате.
Скетч-проба: первый текст по I2C
#include <Wire.h>#include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); // часть плат: 0x3F void setup() { lcd.init(); lcd.backlight(); lcd.setCursor(0, 0); lcd.print("Privet, Arduino!"); // 15 знаков — влезает в 16 lcd.setCursor(0, 1); lcd.print("t=24.6 h=41"); // вторая строка} void loop() {}Адрес переходника — 0x27 у большинства плат, 0x3F у части клонов: если экран молчит и в браузере, и на сборке, первым делом перебирайте оба. init() и backlight() в эмуляторе живые — подсветка зажигается в тот же момент, что и у настоящей сборки. Распиновку, потенциометр и полный порядок подключения ведёт урок про первый текст на LCD по I2C — здесь же работа с текстом.
Кириллица: кодовая таблица и createChar
У HD44780 своя прошивка знакогенератора, и русские буквы лежат в ней не все: часть совпадает с латиницей (А, В, Е, К, М, Н, О, Р, С, Т, У, Х) и печатается кодами напрямую, остальные задают самому — createChar кладёт свой глиф 5×8 в один из восьми слотов. В движке эмулятора createChar принимается молча, но пикселей не рисует: раскладку позиций проверить можно, сами пиксели — только на плате. Откуда берутся кракозябры «РџСЂРёРІРµС‚» и как ставить глифы по слотам, подробно разобрано в уроке про кириллицу — здесь берите правило: в браузере правят раскладку, на плате — пиксели.
Бегущая строка без библиотечных сдвигов
#include <LiquidCrystal_I2C.h>LiquidCrystal_I2C lcd(0x27, 16, 2); unsigned long lastShift = 0;const char STROKA[] = "begushaya stroka po krugu ";int dl = sizeof(STROKA) - 1; // длина без нулевого байтаint sdvig = 0; void setup() { lcd.init(); lcd.backlight();} void loop() { if (millis() - lastShift < 300) return; // скорость: 300 мс кадр lastShift = millis(); lcd.setCursor(0, 0); for (int i = 0; i < 16; i++) { lcd.write(STROKA[(sdvig + i) % dl]); // печать окна из 16 символов } sdvig = (sdvig + 1) % dl;}Скорость 300 мс на кадр — стартовая: 150 уже дёргает глаз, 500 читается лениво. Свои глифы при ручном сдвиге не мешают — write с кодом 223 ставит на место знак градуса, и на плате он встанет тем же кодом. Позиции меню, курсор и вторая строка — отдельная песня: приёмы разобраны в уроке про меню на LCD и курсор, оттуда же берётся каркас навигации.
Рисуйте в буфер и выводите кадр кнопкой display() — как в настоящей библиотеке.
Подгружаем интерактив…
Родственный экран — OLED 128×64 — крутится на том же движке: лаборатория выше прямо на странице печатает текст и рисует графику без железа. Если проект спотыкается о вывод на экран, попробуйте сначала там: принцип «сначала раскладка в браузере, потом сборка» одинаковый для обеих матриц.
Граница экрана: эмулятор против сборки
| Проверка | Эмулятор | Только плата |
|---|---|---|
| Текст, раскладка, курсор | целиком, знакоместа те же | то же |
| Подсветка | зажигается от backlight() | плюс потенциометр контраста |
| Квадраты вместо текста | не случится: init() живой | классический сбой инициализации |
| Свои глифы createChar | принимает, пиксели не рисует | да: 8 слотов 5×8 |
| Шина I2C: адреса, подтяжки, длина проводов | нет | да — скан адресов на плате |
Типовые промахи дисплея
- Квадраты в обеих строках — init() или backlight() не вызваны, либо адрес не тот: скан I2C на плате отвечает за минуту.
- Кракозябры вместо кириллицы — скетч шлёт UTF-8 по два байта на букву: нужен перекодировщик или свои глифы.
- 17-й символ пропал — строка шире сетки: режьте текст по 16 знаков, вторая половина — вторая строка, а не автоперенос.
- Печать в пустоту — забыли setCursor после clear(): перо живёт там, где его оставили.
- На железе экран тёмный, а в браузере светится — контраст в модели не крутится: выкрутите потенциометр на переходнике.