hello_menu: как на Arduino с библиотекой LiquidMenu создавать меню из экранов с динамически изменяющейся информацией
Это стартовый пример, демонстрирующий, как создавать меню из двух экранов с динамически изменяющейся информацией.
Первый экран показывает некоторый статический текст. Второй экран показывает показания с аналогового вывода A1. Чтобы отобразить изменяющуюся переменную на LCD, просто поместите переменную в конструктор LiquidLine
. В этом случае объект LiquidLine
– это "analogReading_line
", а переменная – это "analogReading
". Эта строка находится на втором экране. Значение аналогового вывода считывается каждую секунду, и, если оно изменилось, дисплей обновится с новым значением. Меню циклически переключается между двумя своими экранами каждые пять секунд.
Схема
Соединения:
- вывод RS LCD к выводу 12 Arduino;
- вывод E LCD к выводу 11 Arduino;
- вывод D4 LCD к выводу 5 Arduino;
- вывод D5 LCD к выводу 4 Arduino;
- вывод D6 LCD к выводу 3 Arduino;
- вывод D7 LCD к выводу 2 Arduino;
- вывод R/W LCD на корпус;
- вывод VSS LCD на корпус;
- вывод VCC LCD к +5В;
- потенциометр 10 кОм: концы к корпусу и +5В, средний вывод к выводу V0 LCD;
- резистор 150 Ом между +5В и анодом LCD подсветки;
- катод LCD подсветки к корпусу;
- какой-либо аналоговый вход к выводу A1 Arduino (неподключенный тоже работает).
Код
// Библиотека LCD
#include <LiquidCrystal.h>
// Библиотека оборачивания меню
#include <LiquidMenu.h>
// Выводы, подключенные к дисплею:
const byte LCD_RS = 12;
const byte LCD_E = 11;
const byte LCD_D4 = 5;
const byte LCD_D5 = 4;
const byte LCD_D6 = 3;
const byte LCD_D7 = 2;
//LCD R/W вывод на корпус
//Средний вывод потенциометра 10кОм к VO
LiquidCrystal lcd(LCD_RS, LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7);
/*
* Переменная 'analogReading' конфигурируется позже
* для печати на дисплее. 'lastAnalogReading'
* используется для проверки, изменилась ли переменная.
*/
const byte analogPin = A1;
unsigned short analogReading = 0;
unsigned short lastAnalogReading = 0;
/*
* Переменные, используемые для периодического выполнения кода. Первая - это период
* в миллисекундах, а вторая - время последнего выполнения кода.
*/
unsigned int period_check = 1000;
unsigned long lastMs_check = 0;
unsigned int period_nextScreen = 5000;
unsigned long lastMs_nextScreen = 0;
/*
* Объекты LiquidLine представляют собой отдельные строки текста и/или переменных
* на дисплее. Первые два параметра - это столбец и строка, с которых
* строка начинается, остальные параметры - это текст и/или переменные,
* которые будут напечатаны на дисплее. Их количество может составлять до четырех.
*/
// Здесь строка устанавливается в столбец 1, строку 0, и будут напечатаны
// переданные строка и переменная.
LiquidLine welcome_line1(1, 0, "LiquidMenu ", LIQUIDMENU_VERSION);
// Здесь столбец равен 3, а строка - 1, и строка "Hello Menu".
LiquidLine welcome_line2(3, 1, "Hello Menu");
/*
* Объекты LiquidScreen представляют собой отдельные экраны. Экран формируется
* из одного или более объектов LiquidLine. Отсюда может быть вставлено до четырех
* объектов LiquidLine, но больше может быть добавлено позже в setup() с помощью
* welcome_screen.add_line(someLine_object);.
*/
// Здесь два объекта LiquidLine, созданных выше.
LiquidScreen welcome_screen(welcome_line1, welcome_line2);
// Здесь не только строка текста, но еще и изменяющаяся целочисленная переменная.
LiquidLine analogReading_line(0, 0, "Analog: ", analogReading);
LiquidScreen secondary_screen(analogReading_line);
/*
* Объект LiquidMenu объединяет объекты LiquidScreen, чтобы сформировать меню.
* Здесь он только инициализируется, а экраны добавляются позже с помощью
* using menu.add_screen(someScreen_object);. Этот объект используется для
* управления меню, например: menu.next_screen(), menu.switch_focus()...
*/
LiquidMenu menu(lcd);
void setup()
{
Serial.begin(250000);
pinMode(analogPin, INPUT);
lcd.begin(16, 2);
// Это метод, используемый для добавления объекта экрана в меню.
menu.add_screen(welcome_screen);
menu.add_screen(secondary_screen);
}
void loop()
{
// Периодическое считывание аналогового вывода.
if (millis() - lastMs_check > period_check)
{
lastMs_check = millis();
analogReading = analogRead(analogPin);
/*
* Проверить, изменилось ли аналоговое значение,
* и обновить экран, если это так.
*/
if (analogReading != lastAnalogReading)
{
lastAnalogReading = analogReading;
menu.update();
}
}
// Периодическое переключение на следующий экран.
if (millis() - lastMs_nextScreen > period_nextScreen)
{
lastMs_nextScreen = millis();
menu.next_screen();
}
}
Для более подробной информации смотрите документацию на библиотеку LiquidMenu.