Arduino. Подключаем LCD-дисплей
Опубликовано: 06.09.2018
Сегодня попробуем остановиться на выводе на текстовый дисплей. Наиболее популярным является чип HD44780 (или совместимый с ним KS0066). Перечислим их плюсы и минусы:
Видеоуроки по Arduino. ЖК-дисплеи / LCD (13-я серия)
Плюсы:
Невысокая цена. Простота программирования, код будет одинаков для любой модели. Многообразие моделей - наиболее распространённые: 8x1, 16x2, 20x4. Также можно встретить довольно экзотические модели 40x4, т.е. четыре строки по 40 символов в каждой. Возможность подключить несколько дисплеев к одной Arduino. Возможность задавать собственные символы.Минусы:
Далеко не все дисплеи поддерживают русские символы. Подробнее надо смотреть в описании к конкретному дисплею. Подключение без использования I2C-шины требует использования 10-16 проводов, что очень плохо. с I2C - 4 провода.Исходя из вышеизложенного буду рассматривать только подключение дисплея через I2C.
Давайте попробуем.
Что нам понадобится.
Arduino (Я взял модель Nano) Дисплей на чипе HD44780 с модулем I2C или без него (тогда понадобится отдельно плата LC1602 IIC) - в нашем случае 16x2 без I2C модуля Резистор на 10Ком (Если нужно ручное управление подсветкой). Потенциометр (Если нужно ручное управление подсветкой). Макетная плата Breadboard. Библиотека LiquidCrystal_I2C. http://www.ansealk.ru/files/LiquidCrystal_V1.2.1.zipНебольшое отступление №1: Как отличить дисплей с I2C-модулем?
На самом деле все довольно просто. Если, перевернув дисплей мы видим длинную колодку разъемов (как правило 16 штук) то модуля I2C на дисплее нет:
А вот так выглядит дисплей с уже установленным I2C-модулем:
Контакты SCL, SDA, VCC, GND используются для подключения Arduino. Два контакта слева - на картинке они замкнуты перемычкой - нужны для работы подсветки.
Если модуль не подключен - придется сделать это самостоятельно. Главное, на что стоит обратить внимание - соединить контакты в правильном порядке. Как правило первый и 16 пины помечены. Иногда бывает, что 15-16 контакты, через которые осуществляется управление подсветкой, могут располагаться перед первым (в этом случае они будут пронумерованы). На самом же модуле первый пин также может быть обозначен не цифрой, а квадратом вокруг самого пина.
Схемы:
Соберем следующую схему:
Обращу внимание на следующие моменты:
Если вам попался дисплей с уже припаянным I2C-модулем, то провода, помеченные серым, не понадобятся. В остальном - ничего не меняется. Если мы не хотим менять яркость дисплея - то схема упростится:как заметили, два пина на I2C-модуле с маркировкой LED отвечают за подсветку дисплея. Если не хотим использовать управление яркостью - их просто можно замкнуть.
Теперь давайте разберем код.
Тут почти все нам должно быть знакомо. В строке 5 указываем адрес устройства. В строках 16 и 17 - количество символов в строке и количество строк. В строках 20-22 - Создаем объект для работы с дисплеем и описываем параметр работы с ним.
Небольшое отступление №2: Как узнать адрес I2C-устройства?
В большинстве своем адрес можно посмотреть в даташите к микросхеме, на которой построено I2C-устройство. Если же такой возможности нет вот ссылка на архив со скетчем и схемами - http://www.ansealk.ru/files/Arduino_lcd_i2c.zip который определяет адреса всех устройств, подключенных по I2C-шине. Достаточно только подключить устройство к Arduino, загрузить скетч, открыть консоль и увидеть адрес.
Продолжаем дальше.
Тут мы видим функцию, которая, собственно, и будет заниматься выводом на дисплей. Принцип вывода примерно такой:
- Задаём позицию начала вывода функцией setCursor()
- Печатаем строку функцией print()
После этого следующая функцию print() начнет вывод со следующей позиции, после которой закончился предыдущий ввод. Также обращу внимание на то, что, в отличие от вывода в консоль, тут не используется функция println() для завершения вывода и перевода строки.
Таким образом у нас на экране в первой строке появится надпись "Test LCD1602", а во второй будет указано разрешение дисплея и счетчик, показывающий, сколько циклов отработал наш скетч.
Но, если нам надо будет выводить много значений переменных на экран, этот метод не совсем удобен. Дело в том, что процедура вывода на дисплей - очень энергоёмкая и медленная, а вывод мы делаем в этой функции аж 7 раз. Гораздо проще будет заранее сформировать строку заранее, а затем вывести её целиком. В этом нам поможет функция форматированного ввода sprintf().
Небольшое отступление №3: Функция форматированного ввода sprintf().
В Языке C существует несколько очень удобных функций для вывода строк - они называются функциями форматированного вывода - printf (от слов print и format). В нашем конкретном случае нас интересует функция sprintf, которая не выводит ничего на экран, а формирует строку для последующего вывода. Выглядит она примерно так:
sprintf ( str , " Строка %d для вывода ", i );
Функция формирует строку (помечено синим ) с использованием шаблона (желтым), в который подставляются значения переменных (зеленым). Полученный результат будет записан в строковую переменную (красным).
Шаблонов и переменных может быть несколько. В этом случае переменные записываются через запятую. Главное, следите за тем, чтобы количество шаблонов в строке соответствовало количеству переменных. Переменные для шаблонов берутся последовательно, т.е. в первый шаблон подставляется значение первой переменной, во второй - второй переменной и т.д.
Что же такое шаблоны? Любой шаблон начинается символом "%" и заканчивается одним из десяти (в случае Arduino - семи) символов типа. Между ними может быть указано довольно много информации о том, как выводить значение, а может быть не указано и ничего.
Давайте разберем что же может быть в шаблоне. В общем случае шаблон имеет такой вид:
%[ флаг ][ ширина ][ .точность ][ h| I| L]типа
Квадратные скобки показывают, что элемент заключенный в них может отсутствовать. Вертикальная черта говорит о том, что в этом поле должно быть выбрано одно из указанных значений (в нашем случае одна из букв H, I, или L).
Давайте сначала разберемся с обязательным элементом шаблона - типом. Он указывает, какой тип переменной будет выводится и может принимать одно из следующих значений:
Символ | Значение |
c | Один символ |
s | Строка символов |
d,i | Целое десятичное со знаком |
o | Целое восьмеричное |
u | Целое десятичное без знака |
x, X | Целое шестнадцатеричное |
p | Указатель (в шестнадцатеричном виде) |
f | Дробное число в фиксированном формате |
e, E | Дробное число в научном формате |
g, G | Дробное число в научном или фиксированном формате |
Серым помечены те типы, которые не применимы при работе с Arduino. Таким образом, для вывода строки надо указать "%s", а для вывода целого числа - "%d".
Далее рассмотрим поле ширины. Число в нем указывает минимальную ширину поля, в котором будет выведен шаблон. Если размер значения в переменной меньше - поле будет добито пробелами, если больше - запись выйдет за пределы поля. Таким образом шаблон "%6d" для числа 385 выведет 385 (обратим внимание на три пробела перед числом).
Спецификатор точности всегда начинается с точки и следующее за ним число указывает различные действия в зависимости от типа значения. Для типов "d,o,u,x" он укажет минимальное количество символов, которое должно появится при обработке. Для типа "f" - число знаков после запятой. Для типа "s" - максимальное число символов стоки, который будут выведены. Например, "%6.1f" для числа 34.2345 выведет "34.1" (обращу внимание, что точка также считается знаком и перед числом будет присутствовать два пробела). Или шаблон "%.3s" от строки "точность" выведет только первые три символа - "точ".
Флаг позволяет изменить отображение выводимого значения:
Флаг | Описание |
- | Выровнять выводимое значение по левому краю поля |
+ | Всегда указывать знак для десятичного значения |
0 | Дополнять выводимое значение нулями до ширины поля |
Более подробно о шаблонах функции printf можно прочитать интернете. Здесь же я дал краткий обзор наиболее часто используемых возможностей.
Таким образом, наша функция вывода, переписанная с учетом использования форматированного вывода будет выглядеть следующим образом:
Заметим, что в строках 33 и 37 мы формируем целую строку для вывода, а в строках 34 и 38 - выводим их.
Наконец, наши любимые функции setup и loop.
В строке 47 мы задаем разрешение дисплея, в строке 48 - включим подсветку (яркость которой можно отрегулировать потенциометром). В строке 49 установим счетчик циклов в ноль. Увеличивать его будем на единицу в 37-й строке при выводе (помните конструкцию count++?). Наконец, в строке 56 вызываем рассмотренную раннее функцию вывода на дисплей. Все.
Что можно поменять или улучшить?
К примеру, можно сделать автоматическое управление подсветкой в зависимости от освещенности, использовав фоторезистор или датчик освещенности из рассмотренной несколькими статьями ранее метеостанции. Допустим, при сильном освещении - увеличить яркость подсветки, а в ночное время - уменьшить. Или прикрутить датчик движения и зажигать подсветку при появлении объект перед дисплеем, или... В общем, я думаю, вы уже поняли, что при желании, заменив один или несколько компонентов и написав кусок кода можно довольно серьезно улучшить удобство работы с дисплеем. Также мы можем использовать для вывода на дисплей собственноручно разработанные символы.
Все эти вопросы я тут не рассматриваю, так как они выходят за рамки обзора для начинающих.
А на сегодня у меня все.
автор: ansealk (Пикабу)
Arduino. Подключаем LCD-дисплей
26 оценок, Средняя оценка: 5 из 5