Посмотр рубрик

Дисплей LCD1602

Классический символьный 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("   ");
  }
}

Полезные страницы #


(38 голосов)
Подписаться
Уведомить о
guest

37 комментариев
Старые
Новые Популярные
Прокрутить вверх