Данная библиотека позволяет платам Arduino управлять жидкокристаллическими дисплеями (LCD) на основе контроллера HD44780 (или аналогах), который используется в большинстве символьных LCD дисплеев. Библиотека работает либо в четырех, либо в восьми битном режиме (то есть используется 4 или 8 линий данных в дополнение к линиям управления RS, EN и, при необходимости, RW).
Подключение LCD дисплея на HD44780 к Arduino
Для тестирования приведенных ниже примеров необходимо подключить LCD дисплей к плате Arduino. Для этого понадобятся комплектующие, список которых приведен ниже.
Необходимые комплектующие
- плата Arduino или Genuino;
- LCD дисплей (совместимый с контроллером Hitachi HD44780);
- потенциометр 10 кОм;
- резистор 220 Ом;
- перемычки;
- макетная плата.
Схема
В приведенных ниже примерах используется плата Arduino Uno. Для подключения LCD дисплея к своей плате соедините следующие выводы:
- вывод RS LCD дисплея к цифровому выводу 12;
- вывод EN LCD дисплея к цифровому выводу 11;
- вывод D4 LCD дисплея к цифровому выводу 5;
- вывод D5 LCD дисплея к цифровому выводу 4;
- вывод D6 LCD дисплея к цифровому выводу 3;
- вывод D7 LCD дисплея к цифровому выводу 2;
Кроме того, соедините вывод RW LCD дисплея с землей. Крайние выводы потенциометра 10 кОм необходимо подключить к шинам +5V и GND, а средний вывод потенциометра соединить с выводом VO (вывод 3) LCD дисплея. Резистор 220 Ом используется для питания подсветки дисплея (обычно это выводы 15 и 16 LCD дисплея).
Функции
LiquidCrystal()
- Создает переменную типа
LiquidCrystal
. Дисплей может управляться с помощью 4 или 8 линий данных. В первом случае номера выводов с D0 по D3 пропускаются, а эти выводы остаются неподключенными. Вывод RW, вместо подключения к Arduino, может быть соединен с землей; если это так, то в параметрах функции он пропускается.Синтаксис
LiquidCrystal(rs, enable, d4, d5, d6, d7) LiquidCrystal(rs, rw, enable, d4, d5, d6, d7) LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7) LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7)
Параметры
-
rs
: номер вывода платы Arduino, который подключен к выводу RS LCD дисплея; -
rw
: номер вывода платы Arduino, который подключен к выводу RW LCD дисплея (необязательно); -
en
: номер вывода платы Arduino, который подключен к выводу включения EN LCD дисплея; -
d0
,d1
,d2
,d3
,d4
,d5
,d6
,d7
: номера выводов платы Arduino, которые подключены к соответствующим выводам LCD дисплея.d0
,d1
,d2
иd3
необязательны; если они пропущены, LCD будет управляться с помощью только четырех линий данных (d4
,d5
,d6
,d7
).
Пример
#include LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2); void setup() { lcd.begin(16,1); lcd.print("hello, world!"); } void loop() {}
-
begin()
- Инициализирует интерфейс связи с LCD дисплеем, и указывает размеры (ширину и высоту) дисплея. Функция
begin()
должна быть вызвана до любых других функций из библиотеки LCD.Синтаксис
lcd.begin(cols, rows)
Параметры
-
lcd
: переменная типаLiquidCrystal
; -
cols
: количество столбцов (символов в строке) у дисплея; -
rows
: количество строк у дисплея.
-
clear()
- Очищает LCD дисплей и помещает курсор в верхний левый угол.
Синтаксис
lcd.clear()
Параметры
-
lcd
: переменная типаLiquidCrystal
.
-
home()
- Помещает курсор в верхний левый угол LCD дисплея. Используется для помещения курсора в место, куда будет выводиться последующий текст. Чтобы еще и очистить дисплей, используйте
clear()
.Синтаксис
lcd.home()
Параметры
-
lcd
: переменная типаLiquidCrystal
.
-
setCursor()
- Помещает курсор в заданное положение LCD дисплея. Используется для помещения курсора в место, куда будет выводиться последующий текст.
Синтаксис
lcd.setCursor(col, row)
Параметры
-
lcd
: переменная типаLiquidCrystal
; -
col
: столбец, в который необходимо поместить курсор (первому столбцу соответствует 0); -
row
: строка, в которую необходимо поместить курсор (первой строке соответствует 0).
-
write()
- Записывает символ на LCD дисплей.
Синтаксис
lcd.write(data)
Параметры
-
lcd
: переменная типаLiquidCrystal
; -
data
: символ для записи на LCD.
Возвращаемое значение
byte
-
write()
возвращает количество записанных байтов, хотя чтение этого количества необязательно.
Пример
#include LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2); void setup() { Serial.begin(9600); } void loop() { if (Serial.available()) { lcd.write(Serial.read()); } }
-
print()
- Печатает текст на LCD дисплее.
Синтаксис
lcd.print(data) lcd.print(data, BASE)
Параметры
-
lcd
: переменная типаLiquidCrystal
; -
data
: данные для печати (char
,byte
,int
,long
илиstring
); -
BASE
(необязательно): основание для печати чисел:BIN
для двоичной формы (основание 2),DEC
для десятичной формы (основание 10),OCT
для восьмеричной формы (основание 8),HEX
для шестнадцатеричной формы (основание 16).
Возвращаемое значение
byte
-
print()
возвращает количество записанных байтов, хотя чтение этого количества необязательно.
Пример
#include LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2); void setup() { lcd.print("hello, world!"); } void loop() {}
-
cursor()
- Показывает курсор на LCD дисплее: подчеркивание (линия) в месте, куда будет записан следующий символ.
Синтаксис
lcd.cursor()
Параметры
-
lcd
: переменная типаLiquidCrystal
.
Пример
Смотрите пример для функции
noCursor()
. -
noCursor()
- Скрывает курсор на LCD дисплее.
Синтаксис
lcd.noCursor()
Параметры
-
lcd
: переменная типаLiquidCrystal
.
Пример
#include LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); lcd.print("hello, world!"); } void loop() { // Выключить курсор: lcd.noCursor(); delay(500); // Включить курсор: lcd.cursor(); delay(500); }
-
blink()
- Показывает на LCD дисплее мигающий курсор. Если используется в комбинации с
cursor()
, то результат будет зависеть от конкретного дисплея.Синтаксис
lcd.blink()
Параметры
-
lcd
: переменная типаLiquidCrystal
.
Пример
Смотрите пример для функции
noBlink()
. -
noBlink()
- Выключает мигающий курсор на LCD дисплее.
Синтаксис
lcd.noBlink()
Параметры
-
lcd
: переменная типаLiquidCrystal
.
Пример
#include LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); lcd.print("hello, world!"); } void loop() { // Выключить мигающий курсор: lcd.noBlink(); delay(3000); // Включить мигающий курсор: lcd.blink(); delay(3000); }
-
display()
- Включает LCD дисплей после того, как он был выключен функцией
noDisplay()
. Она восстанавливает текст (и курсор), который был на дисплее.Синтаксис
lcd.display()
Параметры
-
lcd
: переменная типаLiquidCrystal
.
Пример
Смотрите пример для функции
noDisplay()
. -
noDisplay()
- Выключает LCD дисплей без потери текста, который отображается на нем в текущий момент.
Синтаксис
lcd.noDisplay()
Параметры
-
lcd
: переменная типаLiquidCrystal
.
Пример
#include LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); lcd.print("hello, world!"); } void loop() { // Выключить дисплей: lcd.noDisplay(); delay(500); // Включить дисплей: lcd.display(); delay(500); }
-
scrollDisplayLeft()
- Прокручивает содержимое дисплея (текст и курсор) на одну позицию влево.
Синтаксис
lcd.scrollDisplayLeft()
Параметры
-
lcd
: переменная типаLiquidCrystal
.
Пример
Смотрите пример для функции
scrollDisplayRight()
. -
scrollDisplayRight()
- Прокручивает содержимое дисплея (текст и курсор) на одну позицию вправо.
Синтаксис
lcd.scrollDisplayRight()
Параметры
-
lcd
: переменная типаLiquidCrystal
.
Пример
#include LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); lcd.print("hello, world!"); delay(1000); } void loop() { // прокрутить на 13 позиций (длина строки) влево, // чтобы переместить контент за пределы дисплея влево: for (int positionCounter = 0; positionCounter < 13; positionCounter++) { // прокрутить на одну позицию влево: lcd.scrollDisplayLeft(); // немного подождать: delay(150); } // прокрутить на 29 позиций (длина строки + длина дисплея) вправо, // чтобы переместить контент за пределы дисплея вправо: for (int positionCounter = 0; positionCounter < 29; positionCounter++) { // прокрутить на одну позицию вправо: lcd.scrollDisplayRight(); // немного подождать: delay(150); } // прокрутить на 16 позиций (длина дисплея + длина строки) влево, // чтобы переместить контент снова в центр: for (int positionCounter = 0; positionCounter < 16; positionCounter++) { // прокрутить на одну позицию влево: lcd.scrollDisplayLeft(); // немного подождать: delay(150); } // задержка в конце полного цикла: delay(1000); }
-
autoscroll()
- Включает автоматическую прокрутку на LCD дисплее. Это приводит к тому, что каждый символ, выводимый на дисплей, передвигает предыдущие символы на одну позицию. Если направление текста задано слева-направо (по умолчанию), дисплей прокручивает влево; если направление текста задано справа-налево, дисплей прокручивает вправо. Это дает в результате вывод каждого нового символа на одном и том же месте LCD дисплея.
Синтаксис
lcd.autoscroll()
Параметры
-
lcd
: переменная типаLiquidCrystal
.
Пример
Смотрите пример для функции
noAutoscroll()
. -
noAutoscroll()
- Выключает автоматическую прокрутку на LCD дисплее.
Синтаксис
lcd.noAutoscroll()
Параметры
-
lcd
: переменная типаLiquidCrystal
.
Пример
Скетч печатает символы от до
9
с выключенной автоматической прокруткой, затем перемещает курсор вниз и вправо, включает автоматическую прокрутку и печатает эти символы снова.#include LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); } void loop() { // поместить курсор в точку (0,0): lcd.setCursor(0, 0); // напечатать символы от 0 до 9: for (int thisChar = 0; thisChar < 10; thisChar++) { lcd.print(thisChar); delay(500); } // поместить курсор в точку (16,1): lcd.setCursor(16, 1); // включить автоматическую прокрутку на дисплее: lcd.autoscroll(); // напечатать символы от 0 до 9: for (int thisChar = 0; thisChar < 10; thisChar++) { lcd.print(thisChar); delay(500); } // выключить автоматическую прокрутку lcd.noAutoscroll(); // очистить экран для следующего цикла: lcd.clear(); }
-
leftToRight()
- Устанавливает направление текста, записанного на LCD, в значение «слева направо», которое является значением по умолчанию. Это означает, что последующие символы, записанные на дисплей, идут слева направо, но это никак не влияет на ранее записанный текст.
Синтаксис
lcd.leftToRight()
Параметры
-
lcd
: переменная типаLiquidCrystal
.
-
rightToLeft()
- Устанавливает направление текста, записанного на LCD, в значение «справа налево» (значение по умолчанию – «слева направо»). Это означает, что последующие символы, записанные на дисплей, идут справа налево, но это никак не влияет на ранее записанный текст.
Синтаксис
lcd.rightToLeft()
Параметры
-
lcd
: переменная типаLiquidCrystal
.
-
Заключение
Примеры использования библиотеки LiquidCrystal смотрите в статье Взаимодействие Arduino с символьным LCD дисплеем.
Теги
ArduinoHD44780LCD дисплейПрограммирование
Подключение дисплея.
На прошлом уроке мы придумали как будут технически реализованы подключения модулей к Ардуино и установили две библиотеки на RTC и I2C для LCD. Теперь пришла пора сделать так чтобы эти блоки у нас заработали по отдельности. Т.е. LCD что нибудь отображал, контроллер корректно срабатывал на нажатия кнопок, звук выводился и т.д.
Как вы помните я решил использовать I2C для LCD. В принципе можно использовать без I2C но я хочу попробовать данную библиотеку. Поэтому я сначала приведу пример и код для тех кто будет использовать I2C, код подключения дисплея напрямую будет ниже. Если вы не хотите использовать I2C то подключите библиотеку LCD как написано в уроке. У вас должно получится что то типа этого:
#include<LiquidCrystal_I2C.h>// подключаем библиотеку
LiquidCrystal_I2C lcd(0x27,16,2); // объявляем дисплей, указываем адрес, затем количество знаков- 16, и количество рядов-2
Далее в секции setup
voidsetup() {
lcd.init(); // инициализируем дисплей
lcd.backlight();// Включаем подсветку дисплея }
Вообще набор для LCD может отличаться от тех что я привожу здесь. Это зависит в первую очередь от подключаемой библиотеки. Т.е. если ваша библиотека для LCD не поддерживает указанных команд то вероятнее всего компиляция скетча выдаст ошибку. Узнать, какие команды поддерживает библиотека, можно перейдя в папку с установленной оболочкой программы Arduino- Libraries- (Папка подключаемого модуля)- keywords.txt. Обычно в данном файле и выкладываются ключевые команды для использования библиотеки.
Далее по нашей программе часов. В секции Setup вы можете указать уже что будет отображаться при загрузке и инициализации ваших часов. Т.е. например ваш e-mail, имя и вообще любую информацию которая появится только один раз при загрузке.
Пример использования:
delay(3000); //отображаем 3 секунды
lcd.clear; //очищает экран
При загрузке текст отображается 3 секунды и затем переходит к исполнению основной программы в секции loop().
Для работы без модуля I2C листинг программы будет выглядеть следующим образом:
#include <LiquidCrystal.h>// подключаем библиотеку
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);// объявляем дисплей
void setup()
{
lcd.begin(16, 2); // указываем какой дисплей будем использовать
delay(3000); //отображаем 3 секунды
lcd.clear; //очищает экран
}
Разница лишь в первых строках секции setup. Далее работаем так же как и с модулем I2C.
Секция вывода звука.
Т.к. договорились с самого начала выводить прерывистый звук на буззер частотой 1 кГц то и для этой подпрограммы можно использовать просто несколько строк кода но можно пойти дальше и написать функцию которая будет работать по заданным параметрам. Рассмотрим оба варианта.
Первый- простой. Просто добавляем в место где будет использоваться вызов звукового сигнала следующие строки:
tone (8, 1000); //включаем на 8 цифровом пине частоту 1000 Гц
delay(500); //ждем 500 мс или полсекунды
noTone (8); //выключаем на 8 цифровом пине частоту
delay(500); //ждем 500 мс или полсекунды
В принципе ничего сложного в данной функции нет и данная код подойдет практически в 95% случаев но я хотел бы предложить вам более интересный и более практичный способ который я использую уже довольно длительное время. Напишем подпрограмму вывода звука которая может использоваться много раз из разных мест вашей основной программы. Этот вариант является более практичным в случае многократного использования. Например: при нажатии кнопок- один короткий звук одной частоты, при срабатывании будильника- прерывистый звук другой частоты, если вы проспали первое срабатывание то на втором звук будет более высоким и более прерывистей (т.е. чаще повторяться) что ли и т.д. Если для каждого варианта срабатываний звука писать выше указанный код то программа разрастется просто до гигантских размеров. Поэтому лучше все таки использовать отдельную подпрограмму и вызывать её буквально одной строкой кода. Приступаем.
Для начала давайте выведем функцию в отдельную вкладку типа браузеров Mozzila, Opera и т.д. что бы не прыгать по коду в поисках нужной функции и не искать ее постоянно. Делаем следующее: под кнопкой «Монитор порта» в оболочке Ардуино кликаем на флажок в форме треугольника отмеченный на картинке красным прямоугольником, затем кликаем на Новая вкладка или нажимаем Ctrl+Shift+N как и написано на картинке. Почти в самом низу появится панель с предложением задать имя для нового файла.
Программа создаст еще один файл с указанным именем и включит его в ваш текущий проект. Теперь весь код, который вы напишете будет использоваться в вашей программе. На данном рисунке предоставлена как раз функция вывода звука в моем делающемся проекте паяльной станции. К названиям нет никаких ограничений но я предпочитаю использовать в названиях первые буквы от используемых данных как написано ЗДЕСЬ. Т.е. в данном случае написано fSound что в моем понимании сразу расшифровывается как Function Sound, иначе говоря функция звука. Как видите в моей программе уже 4 вкладки не считая самой первой, которая собственно содержит все рабочие секции, и используются они для более удобного чтения и анализа кода.
Затем во вкладке идет объявление функции которая будет использоваться в вашей программе.
void Sound (int x, int y) {tone (8, x); //включаем на частоту х Гцdelay(y); //ждем y МсnoTone(8);delay(y); //ждем y Мс }
Теперь при вызове функции Sound указываем в скобках 2 параметра типа integer как и написано в параметрах функции. Т.е. если мы напишем Sound (1521,10000); то на 8 выводе, используемом для вывода звука мы получим звуковой сигнал частотой 1521 Гц и длительностью 10 сек. Вы можете ввести еще множество аргументов функций (это то что написано в скобках при объявлении функции) и использовать их как вам удобно. Заметьте что после отключения звука по программе управление и вообще доступ к микроконтроллеру будет закрыт на те же 10 сек оператором delay(10000). В этом случае можете добавить еще один аргумент или жестко прописать время в функции например вот так:
void Sound (int x, int y, int z) {tone (8, x); //включаем на частоту х Гцdelay(y); //ждем y МсnoTone(8);delay(z); //ждем z Мс }
Теперь функции требуется уже 3 параметра и при её вызове в формате Sound (1521,10000,100); микроконтроллер будет доступен к управлению через 0,1 секунды! Это равносильно такому коду:
void Sound (int x, int y) {tone (8, x); //включаем на частоту х Гцdelay(y); //ждем y МсnoTone(8);delay(100); //ждем 100 Мс }
Опять же вы должны исходить из того что вы хотите получить в итоге и отталкиваться уже от требуемых условий. В итоге мы избегаем написания здоровенной кучи кода для вывода звука и заменяем весь этот индийский код буквально одной строкой! Кстати, не забудьте объявить 8 цифровой вывод как выход.
<-Урок 7.1 | Урок 7.3-> |
Используемые источники:
- https://radioprog.ru/post/158
- https://samosdel.ru/arduino/urok-7-2-podprogramms-lcd-zvuk/