Работа с символьными ЖК дисплеями 1602,2004.
Для работы с символьными графическими дисплеями предлагаем воспользоваться библиотекой LiquidCrystal которая входит в стандартный набор Arduino IDE и предназначена для работы по 8-битному (4-битному) параллельному интерфейсу. Если Ваш дисплей подключается к Arduino по аппаратной шине I2, то Вам нужно установить библиотеку LiquidCrystal_I2C (большинство функций которой повторяют функции первой библиотеки).
Поддерживаемые дисплеи:
Дисплей | Подключение и инициализация |
---|---|
LCD1602 — символьный дисплей (16×02 символов), с параллельным интерфейсом (синий) ![]() |
#include LiquidCrystal lcd( 2 , 3 , 4 , 5 , 6 , 7 [ , 8 , 9 , 10 , 11 ] ); void setup()< lcd.begin( 16 , 2 ); > |
// Пояснение:
LiquidCrystal ОБЪЕКТ ( RS , E , D4 , D5 , D6 , D7 );
void setup()
// Пояснение:
LiquidCrystal ОБЪЕКТ ( RS , E , D4 , D5 , D6 , D7 );
void setup()
#1 Пример
Выводим надпись на дисплей LCD1602 подключённый по шине I2C. Для работы с дисплеем LCD2004 нужно изменить 3 строку на LiquidCrystal_I2C lcd(0x27,20,4);
#include // Подключаем библиотеку для работы с шиной I2C #include // Подключаем библиотеку для работы с LCD дисплеем по шине I2C LiquidCrystal_I2C lcd(0x27,16,2); // Объявляем объект библиотеки, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2) // Если надпись не появилась, замените адрес 0x27 на 0x3F void setup() < // lcd.init(); // Инициируем работу с LCD дисплеем lcd.backlight(); // Включаем подсветку LCD дисплея lcd.setCursor(0, 0); // Устанавливаем курсор в позицию (0 столбец, 0 строка) lcd.print("LCD"); // Выводим текст "LCD", начиная с установленной позиции курсора lcd.setCursor(0, 1); // Устанавливаем курсор в позицию (0 столбец, 1 строка) lcd.print("www.iarduino.ru"); // Выводим текст "www.iarduino.ru", начиная с установленной позиции курсора >// // void loop()<> // Код внутри функции loop выполняется постоянно. Но так как мы выводим статичный текст, нам достаточно его вывести 1 раз при старте, без использования кода loop
#2 Пример
Выводим надпись на дисплей LCD1602 подключённый по 4-битной параллельной шине. Для работы с дисплеем LCD2004 нужно изменить 5 строку на lcd.begin(20, 4);
#include // Подключаем библиотеку LiquidCrystal для работы с LCD дисплеем LiquidCrystal lcd(2,3,4,5,6,7); // Объявляем объект библиотеки, указывая выводы дисплея (RS,E,D4,D5,D6,D7) // Если используется 8 проводов шины данных, то указываем (RS,E,D0,D1,D2,D3,D4,D5,D6,D7) void setup() < // lcd.begin(16, 2); // Инициируем работу с LCD дисплеем, указывая количество (столбцов, строк) lcd.setCursor(0, 0); // Устанавливаем курсор в позицию (0 столбец, 0 строка) lcd.print("LCD2004"); // Выводим текст "LDC1602", начиная с установленной позиции курсора lcd.setCursor(0, 1); // Устанавливаем курсор в позицию (0 столбец, 1 строка) lcd.print("www.iarduino.ru"); // Выводим текст "www.iarduino.ru", начиная с установленной позиции курсора >// // void loop()<> // Код внутри функции loop выполняется постоянно. Но так как мы выводим статичный текст, нам достаточно его вывести 1 раз при старте, без использования кода loop
#3 Пример
Выводим надпись «Русский язык» на дисплей LCD1602 подключённый по шине I2C:
#include // Подключаем библиотеку для работы с шиной I2C #include // Подключаем библиотеку для работы с LCD дисплеем по шине I2C LiquidCrystal_I2C lcd(0x27,16,2); // Объявляем объект библиотеки, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2) // uint8_t symbol[6][8] = < // Объявляем массив из 6 собственных символов (к и й я з ы), каждый символ состоит из 8 байт < 0, 0,18,20,24,20,18, 0 >, // к < 0, 0,17,19,21,25,17, 0 >, // и , // й < 0, 0,15,17,15, 5, 9, 0 >, // я < 0, 0,14,17, 6,17,14, 0 >, // з < 0, 0,17,17,29,19,29, 0 >>; // ы // void setup() < // lcd.init(); // Инициируем работу с LCD дисплеем lcd.backlight(); // Включаем подсветку LCD дисплея lcd.createChar(1, symbol[0]); // Загружаем 1 символ "к" в ОЗУ дисплея lcd.createChar(2, symbol[1]); // Загружаем 2 символ "и" в ОЗУ дисплея lcd.createChar(3, symbol[2]); // Загружаем 3 символ "й" в ОЗУ дисплея lcd.createChar(4, symbol[3]); // Загружаем 4 символ "я" в ОЗУ дисплея lcd.createChar(5, symbol[4]); // Загружаем 5 символ "з" в ОЗУ дисплея lcd.createChar(6, symbol[5]); // Загружаем 6 символ "ы" в ОЗУ дисплея lcd.setCursor(0, 0); // Устанавливаем курсор в позицию (0 столбец, 0 строка) lcd.print("Pycc\1\2\3 \4\5\6\1"); // Выводим текст "Pycckий языk", где "Pycc" написано латиницей, а "kий языk" - символами из ОЗУ дисплея >// Если нужно вывести символ из ОЗУ дисплея, то пишем \ и номер символа // void loop()<> // Код внутри функции loop выполняется постоянно. Но так как мы выводим статичный текст, нам достаточно его вывести 1 раз при старте, без использования кода loop
#4 Пример
Выводим время прошедшее после старта на дисплей LCD1602 подключённый по шине I2C:
#include // Подключаем библиотеку для работы с шиной I2C #include // Подключаем библиотеку для работы с LCD дисплеем по шине I2C LiquidCrystal_I2C lcd(0x27,16,2); // Объявляем объект библиотеки, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2) // uint8_t tim_D, tim_H, tim_M, tim_S; // Объявляем переменные для хранения дней, часов, минут и секунд. uint32_t tim; // Объявляем переменную для хранения общего количества времени прошедшего после старта. // Если надпись не появилась, замените адрес 0x27 на 0x3F void setup() < // lcd.init(); // Инициируем работу с LCD дисплеем lcd.backlight(); // Включаем подсветку LCD дисплея >// // void loop() < // // Получаем время прошедшее после старта: // tim = millis() / 1000; // Получаем общее количество секунд (максимум 4'294'967 сек ≈ 49,7 дней). tim_S = tim % 60; // Получаем секунды: остаток от деления всех секунд на минуту (60 сек). tim = (tim-tim_S) / 60; // Получаем общее количество минут. tim_M = tim % 60; // Получаем минуты: остаток от деления всех минут на час (60 мин). tim = (tim-tim_M) / 60; // Получаем общее количество часов. tim_H = tim % 24; // Получаем часы: остаток от деления всех часов на день (24 час). tim_D = (tim-tim_H) / 24; // Получаем общее количество дней. // Выводим время прошедшее после старта: // if (millis()%1000<100)< // Условие выполняется в течении 100 первых миллисекунд каждой новой секунды. delay(100); lcd.setCursor(0, 0); // Устанавливаем курсор в позицию (0 столбец, 0 строка). lcd.print("Days: "); // Выводим текст. if(tim_D<10)// Выводим 0 перед количеством дней. lcd.print(tim_D ); // Выводим количество дней. lcd.setCursor(0, 1); // Устанавливаем курсор в позицию (0 столбец, 1 строка) lcd.print("Time: "); // Выводим текст. if(tim_H <10) // Выводим 0 перед количеством часов. lcd.print(tim_H ); // Выводим количество часов. lcd.print(':' ); // Выводим символ. if(tim_M <10) // Выводим 0 перед количеством минут. lcd.print(tim_M ); // Выводим количество минут. lcd.print(':' ); // Выводим символ. if(tim_S <10) // Выводим 0 перед количеством секунд. lcd.print(tim_S ); // Выводим количество секунд. > // > //
Функции, общие для библиотек LiquidCrystal и LiquidCrystal_I2C:
- begin(cols,rows,[char_size]); – Инициализация дисплея с указанием количества столбцов, строк и размера символа.
- clear(); – Очистка дисплея с установкой курсора в положение 0,0 (Занимает много времени!).
- home(); – Установка курсора в положение 0,0 (Занимает много времени!).
- display(); – Быстрое включение дисплея (без изменения данных в ОЗУ).
- noDisplay(); – Быстрое выключение дисплея (без изменения данных в ОЗУ).
- blink(); – Включение мигающего курсора (с частотой около 1 Гц).
- noBlink(); – Выключение мигающего курсора.
- cursor(); – Включение подчеркивания курсора.
- noCursor(); – Выключение подчеркивания курсора.
- scrollDisplayLeft(); – Прокрутка дисплея влево. Сдвиг координат дисплея на один столбец влево (без изменения ОЗУ).
- scrollDisplayRight(); – Прокрутка дисплея вправо. Сдвиг координат дисплея на один столбец вправо (без изменения ОЗУ).
- leftToRight(); – Указывает в дальнейшем сдвигать положение курсора, после вывода очередного символа, на один столбец вправо.
- rightToLeft(); – Указывает в дальнейшем сдвигать положение курсора, после вывода очередного символа, на один столбец влево.
- noAutoscroll(); – Указывает в дальнейшем выравнивать текст по левому краю от позиции курсора (как обычно).
- autoscroll(); – Указывает в дальнейшем выравнивать текст по правому краю от позиции курсора.
- createChar(num,array); – Запись пользовательского символа в CGRAM дисплея под указанным номером.
- setCursor(col,row); – Установка курсора в позицию указанную номером колонки и строки.
- print(data); – Вывод текста, символов или цифр на экран дисплея. Синтаксис схож с одноимённой функцией класса Serial.
Функции, реализованные только в библиотеке LiquidCrystal_I2C:
- init(); – Инициализация дисплея. Должна быть первой командой библиотеки LiquidCrystal_I2C после создания объекта. На самом деле данная функция есть и в библиотеке LiquidCrystal, но в той библиотеке она вызывается автоматически (по умолчанию) при создании объекта.
- backlight(); – Включение подсветки дисплея.
- noBacklight(); – Выключение подсветки дисплея.
- setBacklight(flag); – Управление подсветкой (true — включить / false — выключить), используется вместо функций noBacklight и backlight.
Подключение:
// Для шины I2C:
#include
#include
LiquidCrystal_I2C lcd( address , col , row );
void setup()lcd.init();
>
- address: Адрес дисплея на шине I2C — 0x27 или 0x3F
- col: количество столбцов реализованное у дисплея
- row: количество строк реализованное у дисплея
- RS: № вывода Arduino к которому подключён вывод RS
- E: № вывода Arduino к которому подключён вывод E
- D0. D3: № выводов Arduino к которым подключены выводы D0-D3
- D4. D7: № выводов Arduino к которым подключены выводы D4-D7
- col: количество столбцов реализованное у дисплея
- row: количество строк реализованное у дисплея
- col: количество столбцов реализованное у дисплея
- row: количество строк реализованное у дисплея
- size: размер символов, указывается константой:
LCD_5x8DOTS (по умолчанию), или LCD_5x10DOTS
/* Для шины I2C: */ #include // Подключаем библиотеку для работы с шиной I2C #include // Подключаем библиотеку для работы с LCD дисплеем по шине I2C LiquidCrystal_I2C lcd(0x3F,20,4); // Объявляем объект библиотеки, указывая параметры дисплея (адрес I2C = 0x3F, количество столбцов = 20, количество строк = 4) // void setup() < // lcd.init(); // Инициируем работу с LCD дисплеем lcd.backlight(); // Включаем подсветку LCD дисплея . // Выводим информацию, которая должна отображаться при старте >// // void loop()<> // . // Выводим информацию которая должна меняться по алгоритму Вашего кода > //
/* Для 4 проводной параллельной шины: */ #include // Подключаем библиотеку LiquidCrystal для работы с LCD дисплеем LiquidCrystal lcd(2,3,4,5,6,7); // Объявляем объект библиотеки, указывая выводы дисплея (RS,E,D4,D5,D6,D7) // Если используется 8 проводов шины данных, то указываем (RS,E,D0,D1,D2,D3,D4,D5,D6,D7) void setup() < // lcd.begin(16, 2); // Инициируем работу с LCD дисплеем, указывая количество (столбцов, строк) . // Выводим информацию, которая должна отображаться при старте >// // void loop()<> // . // Выводим информацию которая должна меняться по алгоритму Вашего кода > //
Функции управления дисплеем:
- flag: значение true — включает, а false — выключает подсветку.
/* Выводим надпись для наблюдения за функциями управления дисплеем: */ lcd.cursor(0,0); // Устанавливаем курсор в крайний верхний угол дисплея (0 столбец, 0 строка) lcd.print("iarduino.ru"); // Выводим текст "iarduino.ru" (первая буква "i" будет находиться в позиции "0,0", а последняя "u" в позиции "10,0", невидимый курсор в позиции "11,0") // lcd.noDisplay(); // Выключаем дисплей (надпись исчезнет с дисплея) lcd.display(); // Включаем дисплей (надпись появится на дисплее в том же месте) lcd.scrollDisplayLeft(); // Сдвигаем координаты столбцов влево (на дисплее будет отображаться "arduino.ru" без первой буквы "i", которая выйдет за пределы дисплея, но останется в его ОЗУ) lcd.scrollDisplayRight(); // Сдвигаем координаты столбцов вправо (на дисплее будет отображаться "iarduino.ru" на том же месте, где и была выведена изначально) lcd.clear(); // Чистим дисплей (надпись безвозвратно исчезнет с дисплея) lcd.noBacklight(); // Отключаем подсветку дисплея lcd.backlight(); // Включаем подсветку дисплея lcd.setBacklight(0); // Отключаем подсветку дисплея lcd.setBacklight(1); // Включаем подсветку дисплея
Функции управления курсором:
- col: номер столбца (начиная с 0).
- row: номер строки (начиная с 0)
lcd.setCursor( 0, 1); // Устанавливаем курсор на первый символ второй строки (нумерация строк и столбцов начинается с 0) lcd.home(); // Устанавливаем курсор на первый символ первой строки (как при вызове lcd.setCursor(0,0);) lcd.blink(); // Делаем курсор видимым (на месте курсора будет мигать прямоугольник) lcd.noBlink(); // Делаем курсор невидимым (убираем мигающий прямоугольник) lcd.cursor(); // Делаем курсор видимым (на месте курсора появится знак подчёркивания) lcd.noCursor(); // Делаем курсор невидимым (убираем знак подчёркивания) // Если курсор попадает на место где есть символ, то этот символ не исчезает
Функции указывающие направление и выравнивание:
leftToRight(); Указывает, что после каждого нового символа, положение курсора должно сдвигаться на один столбец вправо. |
Примечание: Если вывести текст «abc» на дисплее отобразится «abc» и текст будет находиться правее от изначального положения курсора. (Как обычно) |
rightToLeft(); Указывает, что после каждого нового символа, положение курсора должно сдвигаться на один столбец влево. |
Примечание: Если вывести текст «abc» на дисплее отобразится «cba» и текст будет находиться левее от изначального положения курсора. (Письменность справа налево) |
noAutoscroll(); Указывает, что в дальнейшем, текст нужно выравнивать по левому краю от изначальной позиции курсора. |
Примечание: если установить курсор в позицию 10,0 и вывести текст, то в данной позиции будет находиться первый символ выведенного текста. (Как обычно) |
autoscroll(); Указывает, что в дальнейшем, текст нужно выравнивать по правому краю от изначальной позиции курсора. |
Примечание: если установить курсор в позицию 10,0 и вывести текст, то в данной позиции будет находиться курсор. (Координаты дисплея будут сдвинуты влево, как будто Вы вызвали функцию scrollDisplayLeft столько раз, сколько букв в выведенном тексте) |
lcd.leftToRight(); // Указываем курсору сдвигаться вправо (Как обычно в европейской письменности) lcd.clear(); lcd.setCursor(5,0); lcd.print("ABC"); // На дисплее увидим: " ABC " (После "A" курсор сдвинулся вправо и вывелась "B", далее курсор сдвинулся вправо и вывелась "C") lcd.rightToLeft(); // Указываем курсору сдвигаться влево (Как в письменности справа налево) lcd.clear(); lcd.setCursor(5,0); lcd.print("ABC"); // На дисплее увидим: " CBA " (После "A" курсор сдвинулся влево и вывелась "B", далее курсор сдвинулся влево и вывелась "C") lcd.noAutoscroll(); // Устанавливаем выравнивание по левому краю (Как обычно) lcd.clear(); lcd.setCursor(5,0); lcd.print("ABC"); // На дисплее увидим: " ABC " (Как обычно) lcd.autoscroll(); // Устанавливаем выравнивание по правому краю (Координаты дисплея будут сдвинуты влево на количество выведенных символов) lcd.clear(); lcd.setCursor(5,0); lcd.print("ABC"); // На дисплее увидим: " ABC " (Координаты дисплея будут сдвинуты на 3 символа влево, так как после каждого символа совершается вызов функции scrollDisplayLeft)
Функции ввода текста и символов:
- num: номер под которым будет записан символ (от 1 до 7).
- array: массив представляющий записываемый символ.
- text: символ, число или строка для вывода на дисплей.
#include // Подключаем библиотеку для работы с шиной I2C #include // Подключаем библиотеку для работы с LCD дисплеем по шине I2C LiquidCrystal_I2C lcd(0x27,16,2); // Объявляем объект библиотеки, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2) // uint8_t symbol_d[8] = ; // 8 строка символа "д" Весь массив можно записать одной строкой: uint8_t symbol_d[8]=; // uint8_t symbol_i[8] = ; // 8 строка символа "и" Весь массив можно записать одной строкой: uint8_t symbol_i[8]=; void setup() < // lcd.init(); // Инициируем работу с LCD дисплеем lcd.backlight(); // Включаем подсветку LCD дисплея lcd.createChar(1,symbol_d); // Загружаем в память дисплея первый символ lcd.createChar(2,symbol_i); // Загружаем в память дисплея второй символ lcd.clear(); // Чистим экран lcd.setCursor(0,0); // Устанавливаем курсор в крайний верхний угол lcd.print("Pa\1\2o"); // Выводим текст "Paдиo" при этом символы 'P', 'a' , 'o' пишем латиницей, >// а символы 'д', 'и' выводим из памяти дисплея, указывая их номера // void loop() < // lcd.setCursor(0,1); lcd.print(" "); // стираем всю нижнюю строку lcd.setCursor(0,1); lcd.print("i"); lcd.print("arduino"); lcd.print(".ru"); // выводим текст "i" "arduino" ".ru" в нижней строке delay(2000); // ждём 2 секунды lcd.setCursor(0,1); lcd.print(" "); // стираем всю нижнюю строку lcd.setCursor(0,1); lcd.print(12.345); // выводим число 12.34 (выводится 2 знака после запятой) delay(2000); // ждём 2 секунды lcd.setCursor(0,1); lcd.print(" "); // стираем всю нижнюю строку lcd.setCursor(0,1); lcd.print(12, HEX); // выводим число 12 в виде шестнадцатиричного числа delay(2000); // ждём 2 секунды lcd.setCursor(0,1); lcd.print(" "); // стираем всю нижнюю строку lcd.setCursor(0,1); lcd.print(1); // выводим число 1 delay(2000); // ждём 2 секунды >
Дисплей 1602 подключение к arduino
Дисплеи очень важные части устройства, если нужно получить обратную связь без использования компьютера. К плате arduino можно подключать как специально разработанные дисплеи, так и схожие по техническим характеристикам.
Дисплеи могут выводит информацию по датчикам или создавать определённый визуальный эффект.
Рассмотрим процесс подключения дисплея 1602. У него шестнадцать выводов. Рассмотрим вариант подключения по четырёх битному параллельному интерфейсу.
Таблица обозначения подключений
Перед тем, как собрать данную схему, вам необходимо припаять провода к выводам дисплея. Для удобства предлагаю использовать провода МГТФ самого малого диаметра. Их преимущества в гибкости и прочности. С них легко снять изоляцию. Также можно использовать акустические провода, но они обладают более «толстой» изоляцией и менее гибкие. Длина провода не более 15 см. для каждого вывода.
Для теста возьмём пример из библиотеки LiquidCrystal.h — «Hello World».
Подадим питание на arduino и загрузим программу.
Ниже представлен видеообзор подключения дисплея.
Лучшие схемы создаются во fritzing.
Урок 4. Подключение LCD1602 по I2C к Ардуино
К сожалению стандартная схема подключения расмотренная в предыдущих уроках не всегда удобна, так как занимает как минимум 6 цифровых выходов на арудине.
В этом уроке мы рассмотрим способ как это можно обойти и использовать только два аналоговых выхода.
Нам понадобится дополнительный модуль 1602 LCD конвертор в IIC/I2C. Он припаивается к нашему дисплею как видно на фото ниже.
И подключается к ардуине следующим образом
Arduino Mega | Arduino Uno | LCD i2c | Цвет проводов на фото |
GND | GND | GND | Черный |
5V | 5V | VCC | Красный |
20 (SDA) | A4 | SDA | Коричневый |
21(SCL) | A5 | SCL | Белый |
Этот способ подключения работает только со специально библиотекой, скачать библиотеку можно по ссылке (LiquidCrystal_I2C1602V1 Библиотека). Установите данную библиотеку.
Код программы:
#include #include LiquidCrystal_I2C lcd(0x27,16,2); // Устанавливаем дисплей void setup() < lcd.init(); lcd.backlight();// Включаем подсветку дисплея lcd.print("iarduino.ru"); lcd.setCursor(8, 1); lcd.print("LCD 1602"); >void loop() < // Устанавливаем курсор на вторую строку и нулевой символ. lcd.setCursor(0, 1); // Выводим на экран количество секунд с момента запуска ардуины lcd.print(millis()/1000); >
Видео:
Arduino и дисплей LCD1602
Классический LCD дисплей, раньше такие стояли в кассовых аппаратах и офисной технике.
- Бывают разного размера, самый популярный – 1602 (16 столбцов 2 строки), есть ещё 2004, 0802 и другие. В наборе идёт 1602.
- Снабжён отключаемой светодиодной подсветкой. Существует несколько вариантов, например синий фон белые буквы, зелёный фон чёрные буквы, чёрный фон белые буквы и проч. В наборе идёт с зелёным фоном и чёрными буквами.
- Сам по себе требует для подключения 6 цифровых пинов, но китайцы выпускают переходник на шину I2C на базе PCF8574, что сильно упрощает подключение и экономит пины. В наборе идёт дисплей с припаянным переходником.
- На переходнике также распаян потенциометр настройки контрастности (синий параллелепипед с крутилкой под крестовую отвёртку). В зависимости от напряжения питания нужно вручную подстроить контрастность. Например при питании платы от USB на пин 5V приходит ~4.7V, а при внешнем питании от адаптера – 5.0V. Контрастность символов на дисплее будет разной!
- Переходник может иметь разный адрес для указания в программе: 0х26 , 0x27 или 0x3F , об этом ниже.
Подключение
Дисплей подключается по шине I2C, выведенной на пины:
Библиотеки
Для этого дисплея существует несколько библиотек, я рекомендую LiquidCrystal_I2C от Frank de Brabander. Библиотека идёт в архиве к набору, а также её можно скачать через менеджер библиотек по названию LiquidCrystal_I2C и имени автора. Репозиторий на GitHub.
print(data); // вывести (любой тип данных) setCursor(x, y); // курсор на (столбец, строка) clear(); // очистить дисплей home(); // аналогично setCursor(0, 0) noDisplay(); // отключить отображение display(); // включить отображение blink(); // мигать курсором на его текущей позиции noBlink(); // не мигать cursor(); // отобразить курсор noCursor(); // скрыть курсор scrollDisplayLeft(); // подвинуть экран влево на 1 столбец scrollDisplayRight(); // подвинуть экран вправо на 1 столбец backlight(); // включить подсветку noBacklight(); // выключить подсветку createChar(uint8_t, uint8_t[]); // создать символ createChar(uint8_t location, const char *charmap); // создать символ
Пример вывода
При первой работе с дисплеем нужно настроить контраст и определиться с адресом:
- Прошить пример “Демо”
- Если дисплей показывает чёрные прямоугольники или пустой экран – крутим контраст
- Если кроме чёрных прямоугольников и пустого экрана ничего не видно – меняем адрес в программе: 0х26 , 0x27 и 0x3F
- Снова крутим контраст, должно заработать
- Если не работает – проверяем подключение и повторяем сначала
- Примечание: в наборе должны идти дисплеи с адресом 0x27 , но может зависеть от партии!
// базовый пример инициализации и вывода текста #include // подключаем библу // адрес дисплея 0x3f или 0x27 // размер дисплея 16×2 (поддерживаются и другие, например 20×4) 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 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() :
#include LiquidCrystal_I2C lcd(0x27, 16, 2); void setup() < lcd.init(); // инициализация lcd.backlight(); // включить подсветку // выводим стрелочку, надпись temp, число и градус lcd.write(126); lcd.print("Temp: "); lcd.print(25.6); lcd.write(223); >void loop()
Свои символы
Библиотека поддерживает создание “своих” дополнительных символов размером 5х7 точек, можно воспользоваться онлайн-генератором кодов символов – ссылка. Для компактности рекомендую переключить его в HEX. Вот так будет выглядеть “символ” крестик: byte myX[] = ;
Дисплей имеет 8 ячеек под сторонние символы, добавляются они при помощи createChar(номер, массив) , где номер – от 0 до 7, а массив – имя массива с данными, которое мы создали для символа. Выводятся символы при помощи write(номер) .
Важный момент: после вызова createChar сбрасывается позиция вывода текста, нужно обязательно вызвать setCursor!
// выводим кастомные символы #include LiquidCrystal_I2C lcd(0x27, 16, 2); byte bell[] = ; byte note[] = ; byte clock[] = ; byte heart[] = ; byte duck[] = ; byte check[] = ; byte cross[] = ; byte retarrow[] = ; 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 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 btn(INPUT_PULLUP); // кнопка на D3 #include 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 от ssilver2007. Библиотека поддерживает также украинский язык для LCD1602. Пример:
#define _LCD_TYPE 1 // для работы с I2C дисплеями #include LCD_1602_RUS lcd(0x27, 16, 2); void setup() < lcd.init(); lcd.backlight(); lcd.setCursor(0, 0); lcd.print("Привет!"); >void loop()
Домашнее задание
- Освоить библиотеку LiquidCrystal_I2C, попробовать все функции из документации
- Создать несколько символов и вывести их
- Оптимизировать последний пример: не очищать дисплей и не выводить лейбл при клике, менять только значение