Lcd 1602 бегущая строка на ардуино
Содержание
- 1 Кнопки LCD Keypad Shield
- 2 Подключение дисплея к плате ардуино
- 3 1Описание FC-113 преобразователя последовательного интерфейса в параллельный
- 4 Как создать собственные символы
- 5 Описание протокола I2C
- 6 Комнатный термометр
- 7 Общие сведения
- 8 Вывод информации:
- 9 4Скетч для вывода текста на LCD экран по шине I2C
Кнопки LCD Keypad Shield
На плате присутствуют пять управляющих кнопок, работа с которыми ведется через один аналоговый пин A0. В шилде использован достаточно распространенный способ простого кодирования сигнала, при котором каждая кнопка формирует определенное значение напряжения, которое после АЦП преобразуется в соответствующее значение от 0 до 1023. Таким образом, мы можем передавать информацию о нажатии разных кнопок через один пин, считывая его при помощи функции analogRead();
Значения уровня сигнала на пине A0 в зависимости от выбранной кнопки:
Нажатие кнопки | Значение на аналоговом пине |
RIGHT | 0-100 |
UP | 100-200 |
DOWN | 200-400 |
LEFT | 400-600 |
SELECT | 600-800 |
Клавиша не нажата | 800-1023 |
Пример скетча работы с кнопками LCD Keypad Shield:
int keyAnalog = analogRead(A0); if (keyAnalog < 100) { // Значение меньше 100 – нажата кнопка right // Выполняем какое-то действие для кнопки вправо. } else if (keyAnalog < 200) { // Значение больше 100 (иначе мы бы вошли в предыдущий блок результата сравнения, но меньше 200 – нажата кнопка UP // Выполняем какое-то действие для кнопки вверх } else if (keyAnalog < 400) { // Значение больше 200, но меньше 400 – нажата кнопка DOWN // Выполняем действие для кнопки вниз } else if (keyAnalog < 600) { // Значение больше 400, но меньше 600 – нажата кнопка LEFT // Выполняем действие для кнопки влево } else if (keyAnalog < 800) { // Значение больше 600, но меньше 800 – нажата кнопка SELECT // Выполняем действие для кнопки выбора пункта меню } else { // Все остальные значения (до 1023) будут означать, что нажатий не было }
В выбранном методе кодирования есть два главных недостатка:
- Нельзя отслеживать одновременное нажатие нескольких кнопок;
- Возможные искажения сигнала могут привести к ложным срабатываниям.
Нужно учитывать эти ограничения, выбирая этот шлд в своих проектах, если вы планируете использовать устройство в системах с большим количеством помех, которые могут искажать сигнал на входе A0, из-за чего АЦП может сформировать ошибочное значение и скетч в результате выполнит другие инструкции.
Подключение дисплея к плате ардуино
Стандартный способ
При подключении LCD 1602 по стандартной схеме в 4-битном режиме его необходимо установить на макетной плате, а затем в следующей последовательности соединить все контакты:
- подать питание на плату, подключив пины 5V и GND Arduino к дорожкам «+» и «-» соответственно;
- подключить экран к питанию, соединив пин VSS c дорожкой «-«, а VDD — c дорожкой «+»;
- подключить подсветку дисплея, соединив порт K c дорожкой «-«, а порт А — с дорожкой «+»;
- подключить проект Arduino к компьютеру, после чего LCD 1602 начнет светиться;
- подключить потенциометр или подстроечный резистор на 10 или 40 кОм, установив его на макетной плате и соединив его крайние порты с «-» и «+», а средний — с выходом V0 дисплея, после чего на мониторе выведется линия закрашенных прямоугольников, как и при самотестировании;
- соединить RS-выход экрана с контактом 7 Arduino желтого цвета, RW-выход — к одному из портов GND (земля), E-порт — к порту 8 на плате «Ардуино», а выходы 11, 12, 13 и 14 дисплея (DB4 — DB7) — к пинам 2, 3, 4 и 5 платы соответственно, что обеспечит обмен данными.
Если все выполнено верно, LCD 1602 выведет предусмотренные проектом символы в рабочем режиме. Проводить 8-битное подключение нецелесообразно, т.к. при этом лишь увеличится энергопотребление.
Нестандартный способ
Стандартный способ может вызывать большие трудности, если необходимые пины на плате Arduino используются для других целей. Вместо того, чтобы полностью перестраивать проект, можно инициализировать новые, неиспользуемые порты интерфейса. Для этого в строке «LiquidCrystal lcd (12, 11, 6, 5, 4, 3, 2)» в скетче в скобках нужно заменить имеющиеся числа на номера новых, свободных выходов, соблюдая соответствие назначению позиции.
Подключение по протоколу i2c
I2C (или IIC, от англ. Inter-Integrated Circuit) — это двухпроводная 8-битная шина, которая служит для последовательного соединения схем в электронных приборах. Так как при стандартном подключении LCD 1602 к Arduino занятыми оказываются, как минимум, 6 портов, использование этого дисплея без переходника неудобно, особенно с картами «Уно» или «Нано». Протокол I2C позволяет сократить количество используемых пинов до 2 -х и поэтому имеет большое значение для сложных проектов.
При подключении используются выходы SDA (линия данных) и SCL (линия синхронизации) и 4 провода, 2 из которых служат для питания. К этим линиям может быть подсоединено более 2 ведомых устройств, что позволяет включить в систему не только экран, но и часы, термометр или прочие периферийные объекты. Строки скетча при этом остаются неизменными.
При подключении по протоколу IIC рекомендовано использовать специальные библиотеки.
Возможные проблемы с подключением
Чаще всего за проблемы с подключением принимают неотрегулированную контрастность. Если она слишком низкая, дисплей будет казаться пустым, а если слишком высокая, то вместо символов выведутся темные прямоугольники.
Если настройка контрастности не помогает, а соответствие схемы и наличие питания (в т.ч. питания подсветки) уже проверены, проблема может быть связана с качеством спайки контактов. В этом случае необходимо проверить работу дисплея в режиме самотестирования и при подключении по стандартной 4-битной схеме без переходника.
Иногда при использовании шины i2c ошибка может возникать из-за ее неверного адреса. Адрес можно изменить в скетче. Для чипа PCF8574 подбор проводится от 0x20 до 0x27, а для PCF8574 — от 0x38 до 0x3F. Правильный вариант зависит от производителя.
Версии Arduino выше 1,8 имеют сложности при работе с библиотекой LiquidCrystal_I2C. В случае возникновения ошибок ее можно заменить на LCD_1602_RUS или LiquidCrystal_PCF8574.
1Описание FC-113 преобразователя последовательного интерфейса в параллельный
- Модуль FC-113 сделан на базе микросхемы PCF8574T, которая представляет собой 8-битный сдвиговый регистр – «расширитель» входов-выходов для последовательной шины I2C. На рисунке микросхема обозначена DD1.
- R1 – подстроечный резистор для регулировки контрастности ЖК дисплея.
- Джампер J1 используется для включения подсветки дисплея.
- Выводы 1…16 служат для подключения модуля к выводам LCD дисплея.
- Контактные площадки А1…А3 нужны для изменения адреса I2C устройства. Запаивая соответствующие перемычки, можно менять адрес устройства. В таблице приведено соответствие адресов и перемычек: «0» соответствует разрыву цепи, «1» – установленной перемычке. По умолчанию все 3 перемычки разомкнуты и адрес устройства 0x27.
I2C модуль FC-113 для подключения ЖК экрана
Как создать собственные символы
Если в наборе LCD 1602 отсутствует нужный для работы проекта символ, его можно создать самостоятельно. Для добавления нового символа нужно сформировать битовую маску размером 5х8 ячеек (в соответствии с количеством точек, которое приходится на 1 символ). Затем в маске необходимо разместить единицы там, где предполагается наличие подсветки, и нули — там, где должно остаться серое закрашивание.
Для экономии времени можно использовать генератор символов, созданный любителями и размещенный в свободный доступ в интернете.
Таким путем в память может быть добавлено до 7 дополнительных самодельных знаков.
Описание протокола I2C
Прежде чем обсуждать подключение дисплея к ардуино через i2c-переходник, давайте вкратце поговорим о самом протоколе i2C.
I2C / IIC(Inter-Integrated Circuit) – это протокол, изначально создававшийся для связи интегральных микросхем внутри электронного устройства. Разработка принадлежит фирме Philips. В основе i2c протокола является использование 8-битной шины, которая нужна для связи блоков в управляющей электронике, и системе адресации, благодаря которой можно общаться по одним и тем же проводам с несколькими устройствами. Мы просто передаем данные то одному, то другому устройству, добавляя к пакетам данных идентификатор нужного элемента.
Самая простая схема I2C может содержать одно ведущее устройство (чаще всего это микроконтроллер Ардуино) и несколько ведомых (например, дисплей LCD). Каждое устройство имеет адрес в диапазоне от 7 до 127. Двух устройств с одинаковым адресом в одной схеме быть не должно.
Плата Arduino поддерживает i2c на аппаратном уровне. Вы можете использовать пины A4 и A5 для подключения устройств по данному протоколу.
В работе I2C можно выделить несколько преимуществ:
- Для работы требуется всего 2 линии – SDA (линия данных) и SCL (линия синхронизации).
- Подключение большого количества ведущих приборов.
- Уменьшение времени разработки.
- Для управления всем набором устройств требуется только один микроконтроллер.
- Возможное число подключаемых микросхем к одной шине ограничивается только предельной емкостью.
- Высокая степень сохранности данных из-за специального фильтра подавляющего всплески, встроенного в схемы.
- Простая процедура диагностики возникающих сбоев, быстрая отладка неисправностей.
- Шина уже интегрирована в саму Arduino, поэтому не нужно разрабатывать дополнительно шинный интерфейс.
Недостатки:
- Существует емкостное ограничение на линии – 400 пФ.
- Трудное программирование контроллера I2C, если на шине имеется несколько различных устройств.
- При большом количестве устройств возникает трудности локализации сбоя, если одно из них ошибочно устанавливает состояние низкого уровня.
Комнатный термометр
Дисплей удобен для отображения показаний модулей и сенсоров. Сделаем задатки «Умного Дома», а именно «комнатный термометр».
Что понадобится
-
Управляющая платформа Arduino Uno или Iskra JS
-
Текстовый экран 16×2
-
Troyka Shield
-
Аналоговый термометр (Troyka-модуль)
-
Соединительные провода «папа-папа»
Как собрать
- Возьмите Troyka Shield и установите сверху на управляющую плату — Arduino или Iskra JS.
- Подключите текстовый экран к управляющей платформе.
- Подключите аналоговый термометр к управляющей плате через 3-проводной шлейф к аналоговому пину . В итоге должна получится схема.
- Прошейте управляющую платформу кодом, приведённым ниже.
Скетч для Arduino
- thermometer-room.ino
-
// подключаем библиотеку LiquidCrystal_I2C #include <Wire.h> #include <LiquidCrystal_I2C.h> // подключим библиотеку для работы с термометром #include <TroykaThermometer.h> // создаем объект-экран, передаём используемый адрес // и разрешение экрана: LiquidCrystal_I2C lcd(0x38, 16, 2); // создаём объект для работы с аналоговым термометром // и передаём ему номер пина выходного сигнала TroykaThermometer thermometer(A0); void setup() { // инициализируем экран lcd.init(); // включаем подсветку lcd.backlight(); } void loop() { // очищаем дисплей lcd.clear(); // считываем данные с аналогового термометра thermometer.readData(); // устанавливаем курсор в колонку 3, строку 0 // на самом деле это первая строка, т.к. нумерация начинается с нуля lcd.setCursor(3, ); // считываем показания с датчика температуры float temperature = thermometer.getTemperatureC(); // выводим результат на дисплей lcd.print("Temp="); lcd.print(temperature); lcd.print("\x99""C"); delay(500); }
Скрипт для Iskra JS
- thermometer-room.js
-
// HD44780 — контроллер монохромных жидкокристаллических знакосинтезирующих дисплеев // настраиваем интерфейс I2C PrimaryI2C.setup({sda SDA, scl SCL}); // подключаем библиотеку var lcd = require("HD44780").connectI2C(PrimaryI2C, 0x38); // включаем подсветку PrimaryI2C.writeTo(0x38, 0x08); // выключить подсветку // PrimaryI2C.writeTo(0x38, 0x00); // создаём переменную для работы с датчиком температуры var thermometer = require('@amperka/thermometer') .connect(A0); // каждую секунду считываем данные с датчика температуры и выводим на дисплей setInterval(function() { var celsius = thermometer.read('C'); lcd.setCursor(3, ); lcd.print("Temp="+ celsius.toFixed() + "\x99"+"C"); }, 1000);
Общие сведения
Большую часть модуля занимает ЖК дисплей, марки LCD 1602 с синей подсветкой, передача данных осуществляется по 4-битному режиму, подробнее в этой статье. На нижней части расположены шесть кнопок, пять из-за которых используются для навигации и одна кнопка дублирует reset. В верхнем левом углу установлен потенциометр, необходимый для регулировки контрастности ЖК дисплея. Так как LCD keypad shield устанавливается на плату Arduino свеху и фактически занимает разъемы, на модуле расположены дополнительные отверстия, для впаивания проводов или разъемов (на отдельную колодку. выведен интерфейс ICSP).
Из принципиальной схемы, можно увидеть, что база транзистора отвечающая за подсведку модуля подключена к выводу 10 платы Arduino, следовательно, можно отключать ее.
Принцип работы кнопок
Кнопки располагаются в удобном порядке — вверх, вниз, влево, вправо, и SELECT. Все кнопки подключены к одному аналоговому входу «A0» используя цепочку резисторов, которые выдают разное опорное напряжение для «А0» при нажатии любой кнопки. На рисунке показана часть принципиальной схема LCD keypad shield
Их принциписальной схемы видно, если кнопки не нажаты напряжение на «A0» через резистор R2 (2кОм) будет 5В. Другие резисторы не влияют на схему, а при чтении аналогового вывода «A0» будет параметр на верхнем приделе 1023 (или приблизительно). Теперь рассмотрим, что произойдет, если будет нажата кнопка «Вниз». На выводе «А0» будет напряжением, которое разделено между резистором R2 (2кОм) которое подтянуто к +5В и резисторами R3 (330ОМ) и R4 (620Ом) общий суммой 950Ом, которые пытаются тянуть его вниз к 0В. Напряжения на «A0» будет составлять порядка 1.61В, это означает, что если выполнить команду analogRead () на A0, будет возвращено значение около 306, что означает нажатие кнопки «Вниз»
Такой же принцип применим и для других кнопок, напряжением и значение analogRead (), можно посмотреть ниже:
Напряжением и значение analogRead► RIGNT: 0.00В: 0 — 8 bit; 0 — 10 bit
► UP: 0.71В: 36 — 8 bit; 145 — 10 bit
► DOWN: 1.61В: 82 — 8 bit; 306 — 10 bit
► LEFT: 2.47В: 126 — 8 bit; 505 — 10 bit
► SELECT: 3.62В: 185 — 8 bit; 741 — 10 bit
Это позволяет сэкономить целый набор выводов и использовать их для более нужного использования. Принципиальная схема LCD keypad shield, показана на рисунке ниже.
Назначение выводов► A0: Вывод кнопок
► D4: LCD — DB4
► D5: LCD — DB5
► D6: LCD — DB6
► D7: LCD — DB7
► D8: LCD – RS
► D9: LCD Enable
► D10: LCD – отключение подсветки дисплея
Вывод информации:
Для работы дисплея используется встроенная с среду Arduino IDE библиотека LiquidCrystal.h
Функционал библиотеки LiquidCrystal.h
//Работа с курсором
lcd.setCursor(0, 0); // Устанавливаем курсор (номер ячейки, строка)
lcd.home(); // Установка курсора в ноль (0, 0)
lcd.cursor(); // Включить видимость курсора (подчеркивание)
lcd.noCursor(); // Убрать видимость курсора (подчеркивание)
lcd.blink(); // Включить мигание курсора (курсор 5х8)
lcd.noBlink(); // Выключить мигание курсора (курсор 5х8)
//Вывод информации
lcd.print(«Mikrotok.ru»); // Вывод информации
lcd.clear(); // Очистка дисплея, (удаление всех данных) установка курсора в ноль
lcd.rightToLeft(); // Запись производится справа на лево
lcd.leftToRight(); // Запись производится слева на право
lcd.scrollDisplayRight(); // Смещение всего изображенного на дисплее на один символ вправо
lcd.scrollDisplayLeft(); // Смещение всего изображенного на дисплее на один символ влево
//Информация полезная для шпионов:)
lcd.noDisplay(); // Информация на дисплее становится невидимой, данные не стираются
// если, в момент когда данная функция активна, ничего не выводить на дисплей, то
lcd.display(); // При вызове функции display() на дисплее восстанавливается вся информация которая была
1 |
//Работа с курсором lcd.setCursor(,);// Устанавливаем курсор (номер ячейки, строка) lcd.home();// Установка курсора в ноль (0, 0) lcd.cursor();// Включить видимость курсора (подчеркивание) lcd.noCursor();// Убрать видимость курсора (подчеркивание) lcd.blink();// Включить мигание курсора (курсор 5х8) lcd.noBlink();// Выключить мигание курсора (курсор 5х8) lcd.print(«Mikrotok.ru»);// Вывод информации lcd.clear();// Очистка дисплея, (удаление всех данных) установка курсора в ноль lcd.rightToLeft();// Запись производится справа на лево lcd.leftToRight();// Запись производится слева на право lcd.scrollDisplayRight();// Смещение всего изображенного на дисплее на один символ вправо lcd.scrollDisplayLeft();// Смещение всего изображенного на дисплее на один символ влево lcd.noDisplay();// Информация на дисплее становится невидимой, данные не стираются // если, в момент когда данная функция активна, ничего не выводить на дисплей, то lcd.display();// При вызове функции display() на дисплее восстанавливается вся информация которая была |
Сам же дисплей может работать в двух режимах :
• 8-битный режим – для этого используются и младшие и старшие биты (BB0- DB7)
• 4-битный режим – для этого используются и только младшие биты (BB4- DB7)
Использование 8-битного режима на данном дисплее не целесообразно. Для его работы требуется на 4 ноги больше, а выигрыша в скорости практически нет т.к. частота обновления данного дисплея упирается в предел < 10раз в секунду.
Для вывода текста необходимо подключить выводы RS, E, DB4, DB5, DB6, DB7 к выводам контроллера. Их можно подключать к либым пинам Arduino, главное в коде задать правильную последовательность.
Пример Программного кода
Тест LCD Код с символом
#include <LiquidCrystal.h> // Добавляем необходимую библиотеку
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // (RS, E, DB4, DB5, DB6, DB7)
void setup(){
lcd.begin(16, 2); // Задаем размерность экрана
lcd.setCursor(0, 0); // Устанавливаем курсор в начало 1 строки
lcd.print(«LCD 16×2 Arduino»); // Выводим текст
lcd.setCursor(0, 1); // Устанавливаем курсор в начало 2 строки
lcd.print(«Mikrotok.ru «); // Выводим текст
}
1 |
#include <LiquidCrystal.h> // Добавляем необходимую библиотеку LiquidCrystal lcd(7,6,5,4,3,2);// (RS, E, DB4, DB5, DB6, DB7) voidsetup(){ lcd.begin(16,2);// Задаем размерность экрана lcd.setCursor(,);// Устанавливаем курсор в начало 1 строки lcd.print(«LCD 16×2 Arduino»);// Выводим текст lcd.setCursor(,1);// Устанавливаем курсор в начало 2 строки lcd.print(«Mikrotok.ru «);// Выводим текст |
Результат:
Символ я добавил потом. Что касается символов
4Скетч для вывода текста на LCD экран по шине I2C
#include <Wire.h> // подключаем библиотеку Wire #include <LiquidCrystal_I2C.h> // подключаем библиотеку ЖКИ #define printByte(args) write(args); // uint8_t heart = {0x0,0xa,0x1f,0x1f,0xe,0x4,0x0}; // битовая маска символа «сердце» LiquidCrystal_I2C lcd(0x27, 16, 2); // Задаём адрес 0x27 для LCD дисплея 16x2 void setup() { lcd.init(); // инициализация ЖК дисплея lcd.backlight(); // включение подсветки дисплея lcd.createChar(3, heart); // создаём символ «сердце» в 3 ячейке памяти lcd.home(); // ставим курсор в левый верхний угол, в позицию (0,0) lcd.print("Hello SolTau.ru!"); // печатаем строку текста lcd.setCursor(0, 1); // перевод курсора на строку 2, символ 1 lcd.print(" i "); // печатаем сообщение на строке 2 lcd.printByte(3); // печатаем символ «сердце», находящийся в 3-ей ячейке lcd.print(" Arduino "); } void loop() { // мигание последнего символа lcd.setCursor(13, 1); // перевод курсора на строку 2, символ 1 lcd.print("\t"); delay(500); lcd.setCursor(13, 1); // перевод курсора на строку 2, символ 1 lcd.print(" "); delay(500); }
Кстати, символы, записанные командой lcd.createChar();, остаются в памяти дисплея даже после выключения питания, т.к. записываются в ПЗУ дисплея 1602.