Классический символьный LCD дисплей, раньше такие стояли в кассовых аппаратах и офисной технике. Очень простой в использовании и универсальный вариант для вывода отладочной информации с устройства, создания текстового меню для управления и так далее. Имеет встроенную таблицу символов, за счёт чего очень "лёгкий" при работе с микроконтроллером.
![]() |
В наборе GyverKIT | START | IOT | EXTRA |
---|---|---|---|---|
LCD дисплей | ✔ |
- Бывают разного размера, самый популярный – 1602 (16 столбцов 2 строки), есть ещё 2004, 0802 и другие
- Снабжён отключаемой светодиодной подсветкой. Существует несколько вариантов, например синий фон белые буквы, зелёный фон чёрные буквы, чёрный фон белые буквы и проч.
- Сам по себе требует для подключения 6 цифровых пинов, но в продаже есть переходник на шину I2C на базе PCF8574, что сильно упрощает подключение и экономит пины. В GyverKIT идёт дисплей с припаянным переходником
- На переходнике также распаян потенциометр настройки контрастности (синий параллелепипед с крутилкой под крестовую отвёртку). В зависимости от напряжения питания нужно вручную подстроить контрастность. Например при питании платы от USB на пин 5V приходит ~4.7V, а при внешнем питании от адаптера – 5.0V. Контрастность символов на дисплее будет разной!
- Переходник может иметь разный адрес для указания в программе:
0х26
,0x27
или0x3F
, об этом ниже
Подключение к Arduino #
Дисплей подключается по шине I2C, выведенной на пины:
- Arduino: SDA – A4, SCL – A5
- Wemos: SDA – D2, SCL – D1
- Питание: 5V в обоих случаях
Библиотеки #
Для этого дисплея существует несколько библиотек:
- LiquidCrystal_I2C от johnrickman. Давно не обновлялась, но стабильно работает
- LiquidCrystal_I2C от enjoyneering. Актуальная библиотека, но чуть сложнее в использовании
- LCD_1602_RUS_ALL - библиотека с поддержкой кириллицы (программно)
Для новичка рекомендую первую, её можно установить из менеджера библиотек:
LiquidCrystal_I2C (johnrickman) #
Краткая документация:
init(); // запустить дисплей
backlight(); // включить подсветку
noBacklight(); // выключить подсветку
setCursor(x, y); // курсор на (столбец, строка)
home(); // аналогично setCursor(0, 0)
print(data); // вывести (любой тип данных)
clear(); // очистить дисплей
noDisplay(); // отключить отображение
display(); // включить отображение
blink(); // мигать курсором на его текущей позиции
noBlink(); // не мигать
cursor(); // отобразить курсор
noCursor(); // скрыть курсор
scrollDisplayLeft(); // подвинуть экран влево на 1 столбец
scrollDisplayRight(); // подвинуть экран вправо на 1 столбец
createChar(uint8_t, uint8_t[]); // создать символ
createChar(uint8_t location, const char *charmap); // создать символ
Начало работы #
При первой работе с дисплеем нужно настроить контраст и определиться с адресом:
- Прошить пример "Демо"
- Если дисплей показывает чёрные прямоугольники или пустой экран – крутить контраст
- Если кроме чёрных прямоугольников и пустого экрана ничего не видно – поменять адрес в программе:
0х26
,0x27
или0x3F
и загрузить прошивку - Если не работает – проверяем подключение и повторяем сначала
Демо
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // адрес, столбцов, строк
void setup() {
lcd.init(); // инициализация
lcd.backlight(); // включить подсветку
lcd.setCursor(1, 0); // столбец 1 строка 0
lcd.print("Hello, world!");
lcd.setCursor(4, 1); // столбец 4 строка 1
lcd.print("GyverKIT");
}
void loop() {
}
Выводим по буквам
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
lcd.init(); // инициализация
lcd.backlight(); // включить подсветку
// строки для вывода
char s1[] = "Hello, world!";
char s2[] = "GyverKIT";
lcd.setCursor(1, 0);
for (int i = 0; i < strlen(s1); i++) {
lcd.print(s1[i]);
delay(100);
}
lcd.setCursor(4, 1);
for (int i = 0; i < strlen(s2); i++) {
lcd.print(s2[i]);
delay(100);
}
}
void loop() {
}
Таблица символов #
В памяти дисплея содержится 255 символов, это английские буквы, стандартные символы и китайские буквы. Стандартные символы, такие как !@#$%&()*
и так далее выводятся через print()
, остальные можно вывести по их коду
при помощи write()
:
Из интересных:
- Стрелка вправо –
126
- Стрелка влево –
127
- Символ градуса –
223
- Прямоугольник –
255
Свои символы #
Библиотека поддерживает создание "своих" дополнительных символов размером 5х7 точек, можно воспользоваться онлайн-генератором кодов символов – ссылка. Для компактности рекомендую переключить его в HEX
. Вот так будет выглядеть "символ" крестик: byte myX[] = {0x00, 0x00, 0x11, 0x0A, 0x04, 0x0A, 0x11, 0x00};
Дисплей имеет 8 ячеек под сторонние символы, добавляются они при помощи createChar(номер, массив)
, где номер – от 0
до 7
, а массив – имя массива с данными, которое мы создали для символа. Выводятся символы при помощи write(номер)
.
Важный момент: после вызова createChar()
сбрасывается позиция вывода текста, нужно обязательно вызвать setCursor()
!
Пример
// выводим кастомные символы
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
byte bell[] = {0x4, 0xe, 0xe, 0xe, 0x1f, 0x0, 0x4};
byte note[] = {0x2, 0x3, 0x2, 0xe, 0x1e, 0xc, 0x0};
byte clock[] = {0x0, 0xe, 0x15, 0x17, 0x11, 0xe, 0x0};
byte heart[] = {0x0, 0xa, 0x1f, 0x1f, 0xe, 0x4, 0x0};
byte duck[] = {0x0, 0xc, 0x1d, 0xf, 0xf, 0x6, 0x0};
byte check[] = {0x0, 0x1, 0x3, 0x16, 0x1c, 0x8, 0x0};
byte cross[] = {0x0, 0x1b, 0xe, 0x4, 0xe, 0x1b, 0x0};
byte retarrow[] = {0x1, 0x1, 0x5, 0x9, 0x1f, 0x8, 0x4};
void setup() {
lcd.init(); // инициализация
lcd.backlight(); // включить подсветку
// загружаем все сразу
lcd.createChar(0, bell);
lcd.createChar(1, note);
lcd.createChar(2, clock);
lcd.createChar(3, heart);
lcd.createChar(4, duck);
lcd.createChar(5, check);
lcd.createChar(6, cross);
lcd.createChar(7, retarrow);
// выводим для примера все
lcd.home();
lcd.write(0);
lcd.write(1);
lcd.write(2);
lcd.write(3);
lcd.write(4);
lcd.write(5);
lcd.write(6);
lcd.write(7);
}
void loop() {
}
Важная информация по дисплеям #
- Вывод данных на дисплей занимает время, поэтому выводить нужно либо по таймеру, либо по факту изменения данных
- Очищать дисплей полностью не всегда целесообразно, иногда достаточно вывести новые значения поверх старых, либо частично очистить "пробелами"
- Вот урок по этой теме
Выводим значение с потенциометра
// оптимально выводим значение с потенциометра по таймеру
// текстовый лейбл не выводим, дисплей не очищаем
// потенциометр подключен на A0
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
lcd.init(); // инициализация
lcd.backlight(); // включить подсветку
lcd.home();
lcd.print("Pot. val: ");
}
void loop() {
static uint32_t tmr;
// таймер на 10 раз в секунду
if (millis() - tmr >= 100) {
tmr = millis();
lcd.setCursor(10, 0);
lcd.print(analogRead(0));
lcd.print(" ");
}
}
Выводим счётчик от кнопки
// выводим счётчик нажатий по событию
#include <EncButton.h>
EncButton<EB_TICK, 3> btn(INPUT_PULLUP); // кнопка на D3
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
lcd.init(); // инициализация
lcd.backlight(); // включить подсветку
}
void loop() {
btn.tick();
if (btn.isClick()) {
static int count = 0;
count++;
// очищаем и выводим текст и значение
lcd.home();
lcd.clear();
lcd.print("Counter: ");
lcd.print(count);
}
}
Вывод на русском языке #
Данный дисплей работает следующим образом: шрифт (буквы, цифры, символы) зашит в память контроллера дисплея, поэтому язык определяется моделью контроллера. Самые распространённые – с английским и китайским, как в табличке выше. Есть дисплеи с кириллицей (вместо китайского), но они сильно дороже. Также у нас есть 8 ячеек для хранения своих символов, и с их помощью можно вполне организовать вывод на другом языке.
Что касается русского – большая часть букв совпадает по написанию, и это сильно упрощает задачу. Есть готовые библиотеки, где это уже реализовано, например LCD_1602_RUS_ALL. Библиотека поддерживает также украинский язык для LCD1602.
Пример:
#define _LCD_TYPE 1 // для работы с I2C дисплеями
#include <LCD_1602_RUS_ALL.h>
LCD_1602_RUS lcd(0x27, 16, 2);
void setup() {
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Привет!");
}
void loop() {
}
Библиотека работает с createChar()
, поэтому выводить свои символы не получится
На дисплее не может находиться одновременно больше 8 уникальных русских букв! Русской буквой считается буква, написание которой не совпадает с английской, например ы
. Для уменьшения количества таких букв пишите КАПСОМ - в этом случае похожих написаний в языках больше
Полезные страницы #
- Набор GyverKIT – наш большой стартовый набор Arduino, продаётся в России
- Каталог ссылок на дешёвые Ардуины, датчики, модули и прочие железки с AliExpress
- Обратная связь – сообщить об ошибке в уроке или предложить дополнение по тексту ([email protected])
- Поддержать автора за работу над уроками