lcd keypad shield 1602 скетч меню
Подключение LCD Keypad Shield к Arduino
Сегодня я решил описать процесс подключения к контроллеру Arduino платы LCD Keypad Shield и пример работы с ним.
Разработчики этого шилда очень грамотно поступили, подключив все кнопки через резисторы разного сопротивления к аналоговому пину. Это позволило сэкономить 5 дискретных пинов для других нужд.
Схема LCD Keypad Shield
Используемые пины
Проверочный скетч для LCD Keypad Shield
// include the library code:
#include// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);void setup() <
// set up the LCD’s number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.setCursor(0,0);
lcd.print(«LCD Key Shield»);
lcd.setCursor(0,1);
lcd.print(«Press Key:»);
>void loop() <
int x;
x = analogRead (0);
lcd.setCursor(10,1);
if (xarduinoLab
LCD Keypad Shield для Arduino
Популярная плата расширения для Arduino, с не менее популярным текстовым экраном WH1602A и несколькими кнопками.
Характеристики:
Подключение:
Совместим со всеми arduino совместимыми платами,которые имеют стандартное для arduino подключение шилдов, за одним небольшим исключением, разъем ICSP на шилде не дублирует ICSP платы, а соединен с 11, 12 и 13 цифровыми выходами, работать он будет с платами серии UNO.
Резистивная клавиатура подключена к аналоговому входу А0, клавиатура представляет собой делитель напряжения с группой резисторов, сопротивление делителя и напряжение на входе А0 зависит от нажатой кнопки. Более подробно на схеме ниже.
Регулировка яркости подсветки экрана осуществляется ШИМ сигналом с 10 цифрового выхода ардуино, также можно полностью выключить подсветку подав на 10 выход логическую единицу.
Все задействованные выходы, включая выходы LCD экрана указаны в таблице ниже.
Пин Функция A0 Резистивная клавиатура, кнопки select, up, right, down and left D4 LCD 1602 — DB4 D5 LCD 1602 — DB5 D6 LCD 1602 — DB6 D7 LCD 1602 — DB7 D8 LCD 1602 — RS D9 LCD 1602 — Enable D10 Управление подсветкой LCD 1602 Основные элементы шилда:
Дополнительные штырьки для подключения периферии, обычно не распаяны.
Пример для работы с шилдом от производителя:
Подключение модуля LCD Keypad Shield 1602 к Arduino
LCD Keypad Shield — одна из самых популярных плат расширения для ардуино. Она может существенно упростить работу с жидкокристаллическими экранами, позволяя разработчику сосредоточиться на других задачах. В этой статье мы рассмотрим шилд LCD Keypad Shield для дисплея TC 1602 со встроенными 5 управляющими кнопками. Узнаем, как работает эта плата, как ее можно подключить к ардуино, рассмотрим несколько примеров скетчей в реальных проектах.
Рассматриваемый шилд представляет собой плату с встроенными модулями индикации и управления. Индикация осуществляется с помощью LCD-дисплея TC1602, управление – через встроенные кнопки. Есть возможность регулировки яркости дисплея прямо на плате с помощью подстроечного резистора. Плата снабжена разъемами, в которые могут быть подключены другие устройства, например, датчики. Для работы с экраном используются пины 4-10, для определения нажатия кнопок — только один аналоговый пин A0. Свободными являются цифровые пины 0-3, 11-13 и аналоговые пины A1-A5.
Основные области применения шилда: создание управляющих модулей, реализующих настройки устройства с помощью интерфейса меню. Экран шилда можно использовать для вывода информации, получаемой с датчиков, с возможностью выполнения пользователем каких-либо действий путем нажатия на встроенные кнопки. Естественно, можно найти и другие способы использования платы: например, реализовать игру типа тетрис.
Технические характеристики
Распиновка LCD shield для подключения к Arduino
Контакт дисплея LCD 1602 Описание Контакт на LCD Shield Пины LCD экрана GND Земля VDD Питание 5В Contrast Управление контрастом Потенциометр RS Команды/Данные 8 R/W Чтение/Запись Enable Включение (активирование) 9 DB0 Не используется DB1 Не используется DB2 Не используется DB3 Не используется DB4 Дата 1 4 DB5 Дата 2 5 DB6 Дата 3 6 DB7 Дата 4 7 Back LED + Включение подсветки 10 Back LED — Питание подсветки Пины для кнопок Кнопка UP Управляющая кнопка A0 Кнопка DOWN Управляющая кнопка A0 Кнопка LEFT Управляющая кнопка A0 Кнопка RIGHT Управляющая кнопка A0 Кнопка SELECT Управляющая кнопка A0 Reset Перезагрузка платы Reset ICSP ICSP для перепрошивки встроенного микроконтроллера HD44780U UART Контакты для UART соединения 0, 1 Дополнительные элементы шилда
Подключение платы LCD Shield к Arduino
Подключение шилда очень простое – нужно попасть ножками в соответствующие разъемы платы ардуино и аккуратно совместить их. Ничего дополнительно подсоединять или припаивать не надо. Нужно помнить и учитывать тот факт, что часть пинов зарезервированы для управления дисплеем и кнопками и не может быть использована для других нужд! Для удобства подключения дополнительного оборудования на плате выведены дополнительные разъемы 5В и GND к каждой контактной площадке аналоговых пинов. Это, безусловно, упрощает работу с датчиками. Также можно подключать цифровые устройства через свободные пины 0-3 и 11-13. Подключив шилд, мы можем работать с экраном и кнопками на нем так же, как с отдельными устройствами, учитывая только номера пинов, к которым припаяны соответствующие контакты.
Скетч для экрана на Arduino LCD shield
Для работы с LCD экранами обычно используют популярную библиотеку LiquidCrystal. На этапе инициализации создается объект класса LiquidCrystal, в конструкторе которого мы указываем пины с подключенными контактами экрана. Для нашего шилда требуется использовать такой вариант: LiquidCrystal lcd(8, 9, 4, 5, 6, 7).
Последовательность аргументов конструктора:
Ничего сложного в работе с объектом нет. В setup() мы инициализируем объект, указывая ему количество символов и строк:
Arduino.ru
Меню на LCD Keypad Shield
Точнее даже не 1-2 минуты, а 20 секунд постоянно, а потом скидываеь, как будето происходит рестарт.
Еще один вопрос: 3) Как можно вывести примерно такую конструкцию, вроде в c++ так работает, а тут нет:
Ну и еще один: 4) Можно ли среду ардуины подключить к MSVSC++? Существую ли отладчики, для прогонки кода ардуины на выявление косяков?
> 1) Почему выводит вместо «NaNaNaNaNa» 10 первых ячеек, весь дисплей заполняется этими буквами?
посмотрите на функцию printTimeToLCD(), там же этой проблемы нет. Сыграйте в игру «найди 10-ть отличий». Разберите построчно что происходит в этой функции.
Кстати ответ на этот вопрос поможет вам и с
> Как можно вывести примерно такую конструкцию
Только тут как раз наоборот нужно воспользоватся этим эффектом, а не устранять его.
> вроде в c++ так работает,
Нет у нас тут конкатенации сишных строк.
P.S. Отформатируйте код отступами, невозможно же читать где какой if начался, где закончился. Ну хотя-бы ctrl+T нажмите в ArdinoIDE
С этим понятно, разберусь. А вот почему выкидывает обратно на часы? это наверное главная для меня загадка
С этим понятно, разберусь. А вот почему выкидывает обратно на часы? это наверное главная для меня загадка
> А вот почему выкидывает обратно на часы
А хрен его знает. Может действитель перегружается.
Добавте в loop() что-то такое:
Можете еще попробовать
закоментить. возможно этот беконечный print сносит башню библиотеке, она где-то выскакивает за границу памяти своей и перетирает вам значение key_menu
Прикол получается в том, что добавив действие в loop (например, ваш счетчик выше) из меню перестает выкидывать. Возможно дело в том, что если в loop ничего не меняется, ардуина думает что повисла и перезагружается? Хотя бред..
Вот таким образом из меню не выкидывает, а надпись чуть заметно мерцает (добавил lcd.clear()):
А вот если без вашего кода, которые вызывает большую задержку (или я хз), надпись начинает мерцать очень сильно (что понятно из-за lcd.clear) и выкидыват на время:
Если например добавить задержку delay(100), то мерцание становится не таким сильным (почти как в первом случае, еле заметное), но из меню попрежнему выкидывает спустя 25 секунд.
надпись начинает мерцать очень сильно (что понятно из-за lcd.clear) и выкидыват на время:
Дак я например могу вообще заменять clear на допустим lcd.setCursor(0,0). Мерцать перестает. А вот из меню выкидыват точно также.
смысл лупить в индикатор одно и то же значение?
В этом смысла нету, но как иначе? Мне надо выводить на экран строки меню и ждать нжатий кнопки.
Дак я например могу вообще заменять clear на допустим lcd.setCursor(0,0). Мерцать перестает. А вот из меню выкидыват точно также.
В этом смысла нету, но как иначе? Мне надо выводить на экран строки меню и ждать нжатий кнопки.
Можно сказать хочу сделать часы с настройками. По дефолту на экране отображается только время. При нажатии на кнопку Select открывается текстовое меню. В нём хочу переключаться между пунктами и заходить в нужный.. Это цель.
Время выводит нормльно. Когда я жму кнопку Select меня как бы забрасывает в меню (в примере выше, просто на текстовое поле «Na..»), дальше мне нужно ждать дальнейших нажатий клавишь, попросту ничего не делать. Дак вот, отсюда меня и выкидывает обратно на время (по видемому рестартится ардуина).
А существуют ли функции ожидания ответа (нажатия клавиши)? т.е. цикл останавливается и ждет пока на пин придет заданное значение.
Возможно с помощью прерываний это делается?
Кнопы DOWN, UP и прочие навигационные изменять переменную, допустим, «menu» с «0» до «5»(если у вас шесть строк меню)
Это типо концептуальный набросок логики.
Вопрос не в логике (с ней думаю сам разберусь), а совсем в другом. Посмотрите повнимательнее.
А существуют ли функции ожидания ответа (нажатия клавиши)? т.е. цикл останавливается и ждет пока на пин придет заданное значение.
*Лешак раскритикует, но я это так понимаю.
> *Лешак раскритикует, но я это так понимаю.
> А существуют ли функции ожидания ответа (нажатия клавиши)?
Не существует. Зато существует прикрепленная ветка Работа с кнопками. В помощь новичку.
> А вот если без вашего кода, которые вызывает большую задержку
Не вызывает он большой задержки. Ну несколько микросекунд на вызов millis() и раз в секунду на выполенение println
Можете попробовыть выкинуть мой код еще сделать lcd.print(«RESET»); delaa(2000) в самом setup(). Тогда никаких «задержке» не будет, зато будет видно когда контроллер перегрузился.
> Можно сказать хочу сделать часы с настройками.
Хе-хе. я тоже тем же занимаюсь. с описанием процесса в блоге. Только ОЧЕНЬ медленно. Только по выходным, да и то не каждым удается продвинутся по чуть-чуть. 🙁 Мне вообще-то даже что-то знакомое/родное почудилось в функции printTimeToLCD() 😉
Вот кусок дальнейшей моей логики прикинул:
Имелось ввиду вот так:
Точно также рестарт происходит, раз в 20-30 секунд.. я так понимаю от бездействия..
Так и есть, у меня второй день знакомства с ардуиной пошел)
>Имелось ввиду вот так:
Нет. Смысл в таком коде? Что вы сделали: при включении задержку (вместо того что-бы запустить библиотеку). Вывели надпись. и все.
Какую дополнительную информацию, для размышления вы получили в результате этого кода? А никакой.
Что всётаки ардуина точно также рестартится, если ничего не происходит в лупе.
А вот как решить такую проблему, я хз.
Точно также рестарт происходит, раз в 20-30 секунд.. я так понимаю от бездействия..
Так и есть, у меня второй день знакомства с ардуиной пошел)
Ну значит «я не ошибся» 🙂 Но явно «чуток под себя подпилии» ее 😉
Я тоже буду делать (возможно сегодня) выставление времени с помощью кнопок.
Что всётаки ардуина точно также рестартится, если ничего не происходит в лупе.
А вот как решить такую проблему, я хз.
Учитывая что «рестартится» вы диагностировали не верно. Сделайте две вещи:
1. Дайте код с моей добавкой которую вы запускали
2. Постарайтесь детально описать «что вы видите/делаете»: «вывелась надпись. повисела 2 сек. исчезла. нажал кнопку. увидел то-то. через какое-то время. увидел то-то. «.Постарайтесь ничего не упускать, типа «открыл сериал монитор» и т.п.
Будет пропадать надпись на 2 секунды)) она это и делает.
3) Жду 20-30 сек и рестарт происходит (на время выкидывает)
Кароче, рестарт происходит даже когда время на экране идет.. не заходя в меню..
А вот при просмотре порта перезагрузка не происходит (об этом я уже писал выше):
Ахаха, да просто не допонимаем друг друга. Залей скетч этот и посмотри что будет.
ps: в 17 посте просмотрел строчку lcd.clear().. но даже так видно будет там..
Ахаха, да просто не допонимаем друг друга. Залей скетч этот и посмотри что будет.
Ну так это же еще модуль часов нужно подключать. лениво. эх, ну ладно.
Залил. Вообще в меню не выходит. Как выяснилось неправильно детектится кнопка SELECT. Опознается как LEFT.
Кароче, я вроде понял в чём у меня баг был. В питании, походу не хватает от usb. От внешнего блока запитал и перестало ресетится. Так что надо взять на заметку это дело.
Вообщем дайте не свою умозаключение «происходит рестарт», а симптомы дайте (у меня они не воспроизводятся).
Происходит у вас повторый вывод RST перед тем как «выкидывает на время» или нет?
100% это были рестарты и на 90% уверен что из-за питания. Т.к. переключил на чуть мощнее блок, чем usb и всё гладко. Так что вопрос снимается. Думаю стоит взять это на заметку, кто собирается работать на этом шилде.
Еслиб можно было залить видео для примера, показал бы.
Что там такого с плывущими параметрами интересно?
Что там такого с плывущими параметрами интересно?
Ну вот набросал часть меню, еще таймер доделать надо.. Жду советов, багов..
ps: кнопки конечно не очень мягко говоря, поэтому приходится нажимать четко, не торопясь.
Рулетка какая-то получается с кнопками на analogRead.
Ведь кнопка при таком подключении может отработать все значения в диапазоне подтяжки, заставляя срабатывать другие кнопки, попадающие в этот диапазон. даже, если считать, что ничего не плывёт.
Просто из-за неидеальности механического контакта, т.е.:
*может чего не понимаю, но не могу себе представить мгновенной телепортации из adc_key_in > 1000 в adc_key_in
*может чего не понимаю, но не могу себе представить мгновенной телепортации из adc_key_in > 1000 в adc_key_in
Как выяснилось неправильно детектится кнопка SELECT. Опознается как LEFT.
Кстати, возможно будет интерестно. Я тут нагрофоманил как эти кнопки работают, почему именно такие цифры в коде Леший в мире Ардуины: Читаем аналоговые кнопки. Часть 1, свои танцы с выяснением какая версия шилда, ну и описание альтернативного подхода к чтению этих кнопок. Не как «в примере от производителя», а максимально близко к тому как мы читаем обычные цифровые кнопки с помощью digitalRead()
Подключение шилда LCD Keypad Shield 1602 к Arduino
LCD Keypad Shield – одна из самых популярных плат расширения для ардуино. Она может существенно упростить работу с жидкокристаллическими экранами, позволяя разработчику сосредоточиться на других задачах. В этой статье мы рассмотрим шилд LCD Keypad Shield для дисплея TC 1602 со встроенными 5 управляющими кнопками. Узнаем, как работает эта плата, как ее можно подключить к ардуино, рассмотрим несколько примеров скетчей в реальных проектах. Если вы не знаете, что такое шилд, то можете предварительно прочитать статью о платах расширениях и шилдах ардуино.
Описание шилда LCD Keypad Shield
Рассматриваемый шилд представляет собой плату с встроенными модулями индикации и управления. Индикация осуществляется с помощью LCD-дисплея TC1602, управление – через встроенные кнопки. Есть возможность регулировки яркости дисплея прямо на плате с помощью подстроечного резистора. Плата снабжена разъемами, в которые могут быть подключены другие устройства, например, датчики. Для работы с экраном используются пины 4-10, для определения нажатия кнопок – только один аналоговый пин A0. Свободными являются цифровые пины 0-3, 11-13 и аналоговые пины A1-A5.
Основные области применения шилда: создание управляющих модулей, реализующих настройки устройства с помощью интерфейса меню. Экран шилда можно использовать для вывода информации, получаемой с датчиков, с возможностью выполнения пользователем каких-либо действий путем нажатия на встроенные кнопки. Естественно, можно найти и другие способы использования платы: например, реализовать игру типа тетрис.
Технические характеристики
Распиновка LCD shield для подключения к Arduino
Контакт дисплея LCD 1602 Описание Контакт на LCD Shield Пины LCD экрана GND Земля VDD Питание 5В Contrast Управление контрастом Потенциометр RS Команды/Данные 8 R/W Чтение/Запись Enable Включение (активирование) 9 DB0 Не используется DB1 Не используется DB2 Не используется DB3 Не используется DB4 Дата 1 4 DB5 Дата 2 5 DB6 Дата 3 6 DB7 Дата 4 7 Back LED + Включение подсветки 10 Back LED – Питание подсветки Пины для кнопок Кнопка UP Управляющая кнопка A0 Кнопка DOWN Управляющая кнопка A0 Кнопка LEFT Управляющая кнопка A0 Кнопка RIGHT Управляющая кнопка A0 Кнопка SELECT Управляющая кнопка A0 Reset Перезагрузка платы Reset ICSP ICSP для перепрошивки встроенного микроконтроллера HD44780U UART Контакты для UART соединения 0, 1 Дополнительные элементы шилда
Подключение платы LCD Shield к Arduino
Подключение шилда очень простое – нужно попасть ножками в соответствующие разъемы платы ардуино и аккуратно совместить их. Ничего дополнительно подсоединять или припаивать не надо. Нужно помнить и учитывать тот факт, что часть пинов зарезервированы для управления дисплеем и кнопками и не может быть использована для других нужд! Для удобства подключения дополнительного оборудования на плате выведены дополнительные разъемы 5В и GND к каждой контактной площадке аналоговых пинов. Это, безусловно, упрощает работу с датчиками. Также можно подключать цифровые устройства через свободные пины 0-3 и 11-13. Подключив шилд, мы можем работать с экраном и кнопками на нем так же, как с отдельными устройствами, учитывая только номера пинов, к которым припаяны соответствующие контакты.
Скетч для экрана на Arduino LCD shield
Ничего сложного в работе с объектом нет. В setup() мы инициализируем объект, указывая ему количество символов и строк:
Для вывода информации на дисплей используем метод print():
Кнопки 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:
В выбранном методе кодирования есть два главных недостатка:
Нужно учитывать эти ограничения, выбирая этот шлд в своих проектах, если вы планируете использовать устройство в системах с большим количеством помех, которые могут искажать сигнал на входе A0, из-за чего АЦП может сформировать ошибочное значение и скетч в результате выполнит другие инструкции.
Пример скетча для работы с экраном и кнопками меню
В данном примере мы определяем текущую нажатую кнопку и выводим ее название на экран. Обратите внимание, что для удобства мы выделили операцию определения кнопки в отдельную функцию. Также в скетче мы выделили отдельный метод для вывода текста на экран. В ней мы показываем сообщение (параметр message) и очищаем его через секунду. Нужно помнить, что в течение этой секунды нажатия кнопок не обрабатываются
Краткие выводы по плате расширения LCD keypad shield
Плата расширения LCD Keypad достаточно популярная, она проста и удобна для использования в проектах Arduino. Сегодня ее можно легко купить практически в любом интернет-магазине.