меню на ардуино lcd 1602 i2c с энкодером
Энкодер управление меню на дисплее
Рассмотрим, как сделать меню с энкодером Ардуино на дисплее LCD 1602 I2C. Мы представим два примера: меню для включения светодиодов и меню на дисплее с управлением от энкодера яркостью светодиодов. Рекомендуем вам ознакомиться с подключением к Arduino дисплея LCD 1602 Arduino и модуля энкодер Ардуино. Если вы уже подключали данные модули, то можно приступать к этому мини проекту.
Меню на Ардуино LCD 1602 с энкодером
Примеры меню с модулем энкодера и жк дисплеем, размещенные на этой странице, вы сможете адаптировать под свои нужды. Во многих проектах на Ардуино требуется для пользователя создать возможность для настройки или управления устройством на микроконтроллере. Энкодер позволяет сделать простое и нативное меню на LCD дисплее для управления светодиодами, микро серво Ардуино или для других задач.
Как сделать меню с энкодером на дисплее
Для этого проекта нам потребуется:
Скетч. Управление энкодером меню дисплея LCD
В первом, более простом примере, в меню дисплея имеется три пункта которые можно менять с помощью вращения ручки энкодера. При нажатии на тактовую кнопку энкодера, включается выбранный цвет RGB светодиода. В зависимости от положения курсора на дисплее, при помощи условного оператора if включается нужный цвет. Соберите схему, как показано на картинке выше и загрузите следующую программу.
Пояснения к коду:
Скетч. Двухуровневое меню с энкодером Ардуино
В следующем примере меню имеет второй уровень для регулировки яркости каждого светодиода отдельно. Переход из одного меню в другое происходит при нажатии кнопки энкодера, при котором меняется значение глобальной переменной w в скетче. Схема подключения светодиодов и модулей к микроконтроллеру остается прежней, как на картинке выше, следует лишь загрузить в плату следующий код программы.
Пояснения к коду:
Заключение. Мы рассмотрели два примера создания меню с энкодером на дисплее 1602 IIC Arduino. Если вы уловили всю суть управления меню с помощью энкодера (датчик угла поворота), то легко сможете использовать представленные примеры в своих собственных проектах с дисплеем на Ардуино. Если у вас еще остались вопросы по данной теме, то вы можете их оставлять в комментариях к этой записи.
Простое меню на Arduino и ЖК дисплее
В разнообразных проектах на основе платы Arduino достаточно часто возникает задача создания меню, отображаемого на экране ЖК дисплея 16х2 и управляемого с помощью кнопок. В данной статье мы рассмотрим один из самых простых способов создания подобного меню (какой я только нашел в интернете). В этом проекте мы с помощью данного меню будем управлять светодиодом, но его легко можно адаптировать под любые другие электронные проекты на основе платы Arduino.
Необходимые компоненты
Внешний вид компонентов, необходимых для сборки проекта, показан на следующем рисунке.
Схема проекта
Схема проекта меню на основе платы Arduino и ЖК дисплея 16х2 представлена на следующем рисунке.
На следующем рисунке эта схема показана применительно к ее сборке на макетной плате.
Далее на нескольких рисунках последовательно представлен процесс сборки этой схемы на макетной плате.
Сначала подключаем ЖК дисплей – питание и общий провод.
Затем подключаем контакты для передачи данных ЖК дисплея. Здесь использован 8-битный способ подключения ЖК дисплея к плате Arduino, но можно упростить схему, использовав 4-битный режим.
Подключаем контакт 16 ЖК дисплея на землю, а к контакту 15 дисплея подключаем резистор сопротивлением 1 Ом. Автор проекта (ссылка на оригинал приведена в конце статьи) рассчитал сопротивление данного резистора исходя из даташита на используемую им модель ЖК дисплея (LMB 162ABC). Если фоновая подсветка дисплея (Backlight) вам не нужна, то эти контакты можно оставить неиспользованными.
Далее подключаем светодиод к контакту 9 платы Arduino через токоограничивающий резистор 220 Ом.
Далее подключаем кнопочную панель согласно ранее представленной схемы, либо же вместо нее вы можете использовать 3 обычные кнопки. В результате получаем следующий внешний вид собранной конструкции проекта.
Исходный код программы (скетча)
Автор проекта разработал его код таким образом, чтобы его можно было легко адаптировать (изменять) под другие проекты. Схема меню, реализуемая кодом программы, показана на следующем рисунке.
При первоначальном нажатии кнопки вы можете выбрать пункт Navigate (навигация) или Execute (исполнение).
Пункт Execute (исполнение) : в этом пункте мы будем управлять светодиодом – включать/выключать, плавно угасать или мигать.
Пункт Navigate (навигация) : этот пункт меню мы будем использовать для навигации с помощью кнопок.
На следующем рисунке видно как автор проекта с помощью ленты подписал названия кнопок для упрощения навигации по меню.
Далее представлен исходный код программы для реализации меню.
Про Ардуино и не только
четверг, 4 января 2018 г.
Текстовое меню на Ардуино
Меню верхнего уровня в данном скетче содержит 2 элемента: первый для решения квадратных уравнений, второй просто как пример построения многоуровнего меню. Параметр ReturnFromMenu установлен в 0 и при выборе пунктов меню вызываются соответствующие обработчики. Так осуществляется задание коэффициентов квадратного уравнения и нахождение его корней (функции InputA, InputB, InputC, Solve). В обработчиках следует помнить об управлении подсветкой дисплея, для этого регулярно вызывается функция LCDBacklight. Функция loop содержит единственный вызов DrawMenu. Вся дальнейшая работа будет заключаться в отрисовке меню и выполнении функций-обработчиков.
Вот в общем-то и всё, остальное должно быть понятно из примера. Ну и в заключение дочитавшим до конца предлагаю видео работы этого меню:
90 комментариев:
Здравствуйте тёзка. Я «полный новичок» в ардуино, самостоятельно накидать менюшку с управлением энкодером, для меня, как-то сложновато. Поиск дал кучу вариантов.
Но Ваша работа наиболее качественная, и фишки в виде бегущего текста, вообще супер.
Но, сходу использовать скетч, не прокатило.
На версии IDE 1.6.7 (Uno R3) заругалась на строку «eMenuKey DrawMenu(eMenuKey Key)» словами «does not name a type». Подскажите, что можно сделать? И ой, чувствую, вопросов будет куча.
Попробовал оба варианта путей к скетчу, и с «C:\Новая папка\Arduino_KY040_Menu» и просто из корневухи С:\Arduino_KY040_Menu. Не выходит. Выдает целый список «недовольств»:
Arduino: 1.6.7 (Windows 7), Плата:»Arduino/Genuino Uno»
Arduino_KY040_Menu:192: error: ‘eMenuKey’ does not name a type
eMenuKey DrawMenu(eMenuKey Key) < // Отрисовка указанного уровня меню и навигация по нему
^
Arduino_KY040_Menu:172: error: invalid conversion from ‘void* (*)()’ to ‘void (*)()’ [-fpermissive]
>;
^
Arduino_KY040_Menu:172: error: invalid conversion from ‘void* (*)()’ to ‘void (*)()’ [-fpermissive]
Arduino_KY040_Menu:172: error: invalid conversion from ‘void* (*)()’ to ‘void (*)()’ [-fpermissive]
Arduino_KY040_Menu:172: error: invalid conversion from ‘void* (*)()’ to ‘void (*)()’ [-fpermissive]
Arduino_KY040_Menu:172: error: invalid conversion from ‘void* (*)()’ to ‘void (*)()’ [-fpermissive]
Arduino_KY040_Menu:172: error: invalid conversion from ‘void* (*)()’ to ‘void (*)()’ [-fpermissive]
Arduino_KY040_Menu:172: error: invalid conversion from ‘void* (*)()’ to ‘void (*)()’ [-fpermissive]
Arduino_KY040_Menu:172: error: invalid conversion from ‘void* (*)()’ to ‘void (*)()’ [-fpermissive]
Arduino_KY040_Menu:172: error: invalid conversion from ‘void* (*)()’ to ‘void (*)()’ [-fpermissive]
C:\Users\foto\AppData\Local\Temp\arduino_0e105e996471fbde0dc2a2dfa2384703\Arduino_KY040_Menu.ino: In function ‘void LCDBacklight(byte)’:
Arduino_KY040_Menu:175: error: default argument given for parameter 1 of ‘void LCDBacklight(byte)’ [-fpermissive]
^
Arduino_KY040_Menu:30: error: after previous specification in ‘void LCDBacklight(byte)’ [-fpermissive]
void LCDBacklight(byte v = 2);
^
exit status 1
‘eMenuKey’ does not name a type
Я использую версию 1.6.12. Она таких ошибок не выдавала, как и web редактор create.arduino.cc.
Скачал 1.6.7, немного изменил скетч, скомпилировалось без ошибок. Пробуйте.
Но это всё так, навскидку.
Разумеется, заголовок прокручиваться не будет, это надо учитывать. Добавить прокрутку можно, но, мне кажется, это перегрузит меню.
LiquidMenu: Arduino библиотека для создания меню на LCD дисплее
Библиотека LiquidMenu обертывает Arduino библиотеку LiquidCrystal с возможностью создания меню. Она упрощает процесс создания меню, абстрагируя элементы меню в иерархически организованные классы.
Пример использования библиотеки LiquidMenu
Содержание
Особенности
Требования
Загрузка
Скачать библиотеку можно по ссылке ниже:
Быстрый старт
Организация классов
Для представления различных элементов меню данная библиотека использует иерархически структурированные классы.
Базовая схема иерархии классов Полная схема иерархии классов
Класс LiquidLine представляет собой строку текста/чисел на дисплее. Чтобы создать новый объект LiquidLine используйте конструктор.
Класс LiquidScreen представляет собой набор строк, которые одновременно отображаются на дисплее (т.е. «текущий экран»).
Класс LiquidMenu объединяет экраны для формирования меню. Данный класс используется для управления меню (переключение экранов, выбор строк, вызов функций и т.д.).
Создание меню
Навигация по меню
Навигация по меню осуществляется из объекта LiquidMenu или, если имеется несколько меню, из объекта LiquidSystem. Экраны могут быть зациклены вперед и назад или конкретный экран может быть указан его объектом или номером:
Фокус и функции обратного вызова
Строки текста/чисел, показанные на дисплее, могут быть интерактивными. Каждая строка обладает прикрепленными к ней функциями обратного вызова (по умолчанию до 8 штук). Они прикрепляются с помощью числа, указанного пользователем:
Чтобы вызвать прикрепленную к строке функцию, необходимо, чтобы на строку был наведен фокус (строка была выбрана). Для циклического перемещения фокуса по строкам, показанным на экране, используйте метод:
Когда строка выбрана, может быть вызвана одна из прикрепленных функций с помощью:
number указывает, какая из прикрепленных функций дожна быть вызвана.
Про Ардуино и не только
пятница, 12 октября 2018 г.
Я обратил внимание, что тема создания меню на Ардуино и ЖК дисплее весьма популярна. И ей уже посвящена одна из моих публикаций. Но я понимаю, что для новичков адаптация моего скетча может показаться нетривиальной задачей. Поэтому я решил написать библиотеку для создания меню на Ардуино и ЖК дисплее с I2C управлением, которую было бы легко использовать даже начинающему ардуинщику.
В моем распоряжении имеется ЖК дисплей 20×4 с I2C интерфейсом, к сожалению, без поддержки кириллицы. Для работы с ним нужна библиотека, я использую LiquidCrystal_I2C. И, чтобы моя библиотека не была отдельной надстройкой, завязанной на LiquidCrystal_I2C, я решил доработать последнюю, добавив в нее новые функции. И речь не только о создании меню: я добавил в библиотеку различные наработки, накопившиеся у меня за время работы с данным дисплеем.
Как и прежде для навигации по меню необходим инкрементный энкодер с кнопкой, например, KY-040. Код для работы с ним был помещен непосредственно в библиотеку. Необходимо лишь указать к каким выводам Ардуино подключен энкодер.
printAt, printf, printfAt
Функция printAt поддерживает те же типы данных, что и print: вы можете выводить на дисплей целые и дробные числа, текстовые строки (будь то массив символов или переменная типа String). А при работе с функциями форматированного вывода не забывайте, что они не поддерживают тип String и передавать им нужно указатель на строку в стиле Си. Для этого достаточно вызвать функцию c_str() класса String, в примере выше это показано.
Говоря о форматированном выводе, хочу отметить еще один момент. Реализация функций семейства printf на Ардуино поддерживает не все команды форматирования. Это было сделано с целью уменьшить размер библиотеки. Лично я столкнулся с невозможностью указать в формате printf значения width и precision через переменную (т.е. через символ *).
attachEncoder, getEncoderState
В данном примере выполняется подключение энкодера и опрос его состояния в цикле. При вращении энкодера изменяется значение переменной x и выводится на дисплей. Нажатие на кнопку приводит к обнулению переменной.
printMultiline
Еще один вариант размещения строки в памяти программ – это использование макроса F() непосредственно в функции printMultiline. В примере это также показано.
inputVal, inputValAt
inputValBitwise
В данном скетче для ввода значения используется функция inputValBitwise. В параметрах функции присутствует заголовок, переменная, в которую будет помещено введенное значение, и количество разрядов для ввода. При подтверждении ввода на дисплей выводится соответствующее сообщение.
inputStrVal
Здесь функция inputStrVal используется для ввода IP адреса. При вызове функции содержимое переданного буфера рассматривается как значение по умолчанию и выводится на дисплей. Последний параметр функции определяет разрешенные для ввода символы, в данном случае только цифры. Если буфер содержит символы, которые не могут быть введены, то их не удастся изменить. Таким образом можно реализовать маскированный ввод.
selectVal
Функция selectVal очень полезна при выборе значения из списка. Эта задача может быть решена и с использованием меню, но преимущество функции selectVal состоит в том, что она не только позволяет выбрать значение, но еще и показывает текущее выбранное значение. Функция работает с массивами значений типа char*, String или int и возвращает индекс выбранного элемента.
showMenu
Ну и, наконец, последняя функция – showMenu, которая берет на себя отрисовку меню и навигацию по нему. Работу с ней можно разделить на 3 этапа. Сначала нужно описать меню. Для этого в библиотеке определена структура sMenuItem:
Параметры parent и key служат для задания иерархии, caption – указатель на название элемента меню. В примере показано, как описывается меню в виде массива элементов sMenuItem.
В качестве parent и key могут быть использованы целочисленные значения, начиная с 1. Но гораздо удобнее определить для них символьные имена, т.е. работать с перечислением. Обратите внимание на то, что первым в перечислении определено значение mkBack, ему соответствует значение 0. Данное значение является служебным и используется для пунктов меню, отвечающих за возврат на уровень выше.
Следующий этап – вызов функции showMenu. Ее параметрами являются описанное ранее меню, его длина и признак отвечающий за вывод заголовка.
При выборе пункта меню, не имеющего подменю, функция возвращает соответствующее ему значение key. И остается последний этап – проанализировать вернувшееся значение при помощи if или case и выполнить соответствующее выбранному элементу действие.
По-моему, получилась интересная библиотека. Есть некоторые вещи, которые хотелось бы доработать (например, в меню нет прокрутки длинных названий), но я решил их пока отложить, т.к. сейчас занимаюсь другими проектами. В общем скачивайте, пробуйте, оставляйте комментарии.