Классический символьный LCD дисплей, раньше такие стояли в кассовых аппаратах и офисной технике. Очень простой в использовании и универсальный вариант для вывода разной информации с устройства, создания текстового меню для управления и так далее. Имеет простое управление и встроенную таблицу символов, за счёт чего очень "лёгкий" при работе с микроконтроллером.
| В наборе GyverKIT | Aliexpress | |
|---|---|---|
![]() |
START |
Купить |
- Бывают разного размера, самый популярный – 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
- GyverLCD - моя универсальная библиотека с аппаратной и программной поддержкой кириллицы, удобным API и высокой скоростью работы
В примерах на этом сайте будем использовать GyverLCD, её можно установить/обновить из встроенного менеджера библиотек Arduino по названию GyverLCD. Краткая документация находится по ссылке выше, базовые примеры есть в самой библиотеке.
Программирование #
Начало работы #
При первой работе с дисплеем нужно настроить контраст и определиться с адресом:
- Прошить базовый пример
- Покрутить контраст на весь оборот - где-то между "пустой экран" и "белые прямоугольники" должен появиться текст
- Если буквы не появились – поменять адрес в программе:
0х26,0x27или0x3Fи заново загрузить прошивку
// базовый пример
#include <GyverLCD.h>
GyverLCD lcd(0x27, 16, 2); // (адрес, ширина, высота)
void setup() {
Wire.begin();
lcd.begin();
lcd.setCursor(1, 0); // столбец 1 строка 0
lcd.print("Hello, world!");
lcd.setCursor(4, 1); // столбец 4 строка 1
lcd.print("GyverKIT");
}
void loop() {
}
Печать текста #
Библиотека позволяет печатать в дисплей привычными методами print()/println(), автоматический перенос при переполнении строки по умолчанию отключен. Перед печатью можно настроить позицию курсора через setCursor(столбец, строка):
#include <GyverLCD.h>
GyverLCD lcd(0x27, 16, 2);
void setup() {
Wire.begin();
lcd.begin();
lcd.setCursor(3, 0);
lcd.println("Hello! 123456789"); // не влезет - обрежется
lcd.print("new line");
}
void loop() {
}
Таблица символов #
У дисплея есть своя таблица символов, это английские буквы, стандартные символы и иероглифы (языковая группа зависит от модели контроллера). Стандартные символы, такие как !@#$%&()* и прочие выводятся просто текстом через print(), остальные можно вывести по их коду при помощи write():
Из интересных:
- Стрелка вправо:
0x7E - Стрелка влево:
0x7F - Символ градуса:
0xDF - Прямоугольник:
0xFF
lcd.print("Temp: ");
lcd.print(12.34);
lcd.print(' ');
lcd.write(0xDF); // градус
lcd.print('C');
Свои символы #
У дисплея есть 8 ячеек под кастомные символы. Для вывода своего символа его нужно однократно загрузить в желаемую ячейку и вызвать write(номер ячейки) - символ напечатается в текущую позицию курсора. После вывода символ остаётся в памяти, т.е. загружать его каждый раз не нужно. Ячейки можно перезаписывать другими символами, но дисплей сразу обновляется, т.е. если символ под номером N выведен на дисплей, а затем в эту же ячейку был загружен другой символ - старый символ поменяется на новый. Ячейки сбрасываются при перезагрузке и повторной инициализации дисплея.
В классической библиотеке используется массив из 8 байт, что не очень удобно и эффективно по памяти, в GyverLCD предлагается использовать 64-битные значения (классический вариант также поддерживается). Для создания иконок можно использовать встроенный генератор из папки utils, он также доступен онлайн по ссылке.
64-бит иконки можно удобно создавать прямо в программе при помощи функции glcd::glyph64. Пример и результат:
#include <GyverLCD.h>
GyverLCD lcd(0x27, 16, 2);
// смайлик через "редактор"
uint64_t smile = glcd::glyph64(
0b00000,
0b00000,
0b01010,
0b01010,
0b00000,
0b10001,
0b01110,
0b00000);
void setup() {
Wire.begin();
lcd.begin();
// создать в ячейке 0
lcd.createChar(0, smile);
// вывод ячейки 0
lcd.write(0);
lcd.write(0);
// ячейка 1
lcd.createChar(1, 0x1f111515151d011f); // спираль
lcd.write(1);
}
void loop() {
}
Вывод на кириллице #
Библиотека поддерживает вывод текста на кириллице: программно (для любых дисплеев) и аппаратно (для дисплеев с таблицей кириллицы). Подробности и ограничения указаны в описании к библиотеке. Для обычного английского дисплея достаточно просто использовать класс GyverLCD_UTF8:
#include <GyverLCD_UTF8.h>
GyverLCD_UTF8 lcd(0x27, 16, 2);
void setup() {
Wire.begin();
lcd.begin();
lcd.print("Привет, мир!");
}
void loop() {
}
Меню на дисплее LCD1602 #
Самый простой способ создать меню - готовые библиотеки, например моя GyverMenu. Это не самая "лёгкая" библиотека, но она позволяет в пару строк простого кода описать сложное динамическое меню, которое оптимально выводится на любые символьные дисплеи и управляется любым количеством кнопок или другим способом. Примеры с LCD1602 есть в самой библиотеке, подробное описание по ссылке выше. Более подробная работа с меню будет рассмотрена в других уроках.
Важная информация по дисплеям #
- Вывод данных на дисплей занимает время, поэтому выводить нужно либо по таймеру, либо по факту изменения данных
- Очищать дисплей полностью не всегда целесообразно, иногда достаточно вывести новые значения поверх старых, либо частично очистить "пробелами"
- Вот урок по этой теме
Выводим значение с потенциометра
// оптимально выводим значение с потенциометра по таймеру
// текстовый лейбл не выводим, дисплей не очищаем
// потенциометр подключен на A0
#include <GyverLCD.h>
GyverLCD lcd(0x27, 16, 2);
void setup() {
Wire.begin();
lcd.begin();
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>
Button btn(3); // кнопка на D3
#include <GyverLCD.h>
GyverLCD lcd(0x27, 16, 2);
void setup() {
Wire.begin();
lcd.begin();
}
void loop() {
btn.tick();
if (btn.click()) {
static int count = 0;
count++;
// выводим текст и значение
lcd.home();
lcd.print("Counter: ");
lcd.print(count);
lcd.print(" ");
}
}
Полезные страницы #
- Набор GyverKIT – наш большой стартовый набор Arduino, продаётся в России
- Каталог ссылок на дешёвые Ардуины, датчики, модули и прочие железки с AliExpress
- Обратная связь – сообщить об ошибке в уроке или предложить дополнение по тексту (alex@alexgyver.ru)
- Поддержать автора за работу над уроками








