LiquidMenu: Arduino библиотека для создания меню на LCD дисплее
Библиотека LiquidMenu обертывает Arduino библиотеку LiquidCrystal с возможностью создания меню. Она упрощает процесс создания меню, абстрагируя элементы меню в иерархически организованные классы.
Содержание
Особенности
- Быстрое и простое создание меню.
- Выбираемые пункты меню.
- Функции обратного вызова.
- Связь I2C.
Требования
- Arduino библиотека LiquidCrystal или аналог.
- LCD дисплей, поддерживающий LiquidCrystal (на чипсете Hitachi HD44780 или совместимом).
- Плата Arduino или совместимый микроконтроллер.
- Устройство ввода рекомендуется (кнопки, поворотный энкодер и т.п.). Например, плата расширения с дисплеем и кнопками.
Загрузка
Скачать библиотеку можно по ссылке ниже:
Или на github: ссылка.
Быстрый старт
Организация классов
Для представления различных элементов меню данная библиотека использует иерархически структурированные классы.
Класс LiquidLine
представляет собой строку текста/чисел на дисплее. Чтобы создать новый объект LiquidLine
используйте конструктор.
Класс LiquidScreen
представляет собой набор строк, которые одновременно отображаются на дисплее (т.е. "текущий экран").
Класс LiquidMenu
объединяет экраны для формирования меню. Данный класс используется для управления меню (переключение экранов, выбор строк, вызов функций и т.д.).
LiquidSystem
– это необязательный класс, который объединяет меню для формирования системы меню (например, главное меню, настройки и т.д.). У него такой же публичный интерфейс, что и у LiquidMenu
.
Создание меню
Создание меню – это всё, что касается структуры. Сначала у нас есть переменные/константы, которые входят в состав объектов LiquidLine
. Затем объекты LiquidLine
входят в состав объектов LiquidScreen
. Затем объекты LiquidScreen
входят в состав объекта(ов) LiquidMenu
. И, необязательно, объекты LiquidMenu
входят в состав объекта LiquidSystem
. Данная структура может быть реализована при создании объекта или позже с помощью публичных методов классов.
// Принимает столбец и строку в качестве позиции и от 1 до 4 ссылок на переменные.
// Эти ссылки на переменные – это то, что необходимо напечатать на дисплее. Они могут быть
// целыми числами, используемыми в программе, строковыми литералами, переданными напрямую,
// или char* для изменяемого текста.
LiquidLine(byte column, byte row, A &variableA...);
// Принимает от 0 до 4 объектов LiquidLine.
LiquidScreen(LiquidLine &liquidLine1...);
// Принимает ссылку на объект LiquidCrystal, от 0 до 4 объектов LiquidScreen и
// номер экрана, который будет показан первым.
LiquidMenu(LiquidCrystal &liquidCrystal, LiquidScreen &liquidScreen1..., byte startingScreen = 1);
// Принимает от 0 до 4 объектов LiquidMenu и номер меню, которое будет показано первым.
LiquidSystem(LiquidMenu &liquidMenu1..., byte startingMenu = 1);
Навигация по меню
Навигация по меню осуществляется из объекта LiquidMenu или, если имеется несколько меню, из объекта LiquidSystem. Экраны могут быть зациклены вперед и назад или конкретный экран может быть указан его объектом или номером:
void LiquidMenu::next_screen();
void LiquidMenu::previous_screen();
bool LiquidMenu::change_screen(LiquidScreen &liquidScreen);
Фокус и функции обратного вызова
Строки текста/чисел, показанные на дисплее, могут быть интерактивными. Каждая строка обладает прикрепленными к ней функциями обратного вызова (по умолчанию до 8 штук). Они прикрепляются с помощью числа, указанного пользователем:
bool LiquidLine::attach_function(byte number, void (*function)(void));
Чтобы вызвать прикрепленную к строке функцию, необходимо, чтобы на строку был наведен фокус (строка была выбрана). Для циклического перемещения фокуса по строкам, показанным на экране, используйте метод:
void LiquidMenu::switch_focus(bool forward = true);
Когда строка выбрана, может быть вызвана одна из прикрепленных функций с помощью:
void LiquidMenu::call_function(byte number);
number
указывает, какая из прикрепленных функций дожна быть вызвана.
Схожие функции могут быть присоединены под одним и тем же номером к разным строкам, а затем вызваны по похожим событиям. Например, если мы печатаем на дисплее состояние четырех светодиодов. Четыре светодиода показываются в четырех объектах LiquidLine
с помощью имени и состояния. Функции, используемые для их включения, можно прикрепить под номером 1, а функции для выключения – под номером 2. Затем, если у нас 3 кнопки, первая может использоваться для переключения фокуса , вторая кнопка (например, кнопка "ВВЕРХ") может использоваться для вызова функции 1, а третья кнопка (например, кнопка "ВНИЗ") может использоваться для вызова функции 2.
Базовый пример
// Сначала нам необходимо создать объект LiquidCrystal.
LiquidCrystal lcd(LCD_RS, LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7);
// ----- Экран приветствия -----
/// Создание строки с одним строковым литералом.
LiquidLine welcome_line1(1, 0, "Hello Menu");
/// Создание строки с целочисленной переменной.
byte oneTwoThree = 123;
LiquidLine welcome_line2(2, 1, oneTwoThree);
/// Формирование экрана из приведенных выше строк.
LiquidScreen welcome_screen(welcome_line1, welcome_line2);
// --------------------------
// ----- Экран 2 -----
LiquidLine some_line(0, 0, "Some line");
LiquidScreen some_screen(some_line);
// --------------------
// Теперь скомпонуем экраны в меню.
LiquidMenu my_menu(lcd, welcome_screen, some_screen);
void setup() {
lcd.begin(16, 2);
...
}
void loop() {
if (rightButton) {
my_menu.next_screen();
}
if (leftButton) {
my_menu.previous_screen();
}
if (somethingElse) {
oneTwoThree++;
my_menu.update;
}
...
}
Описание API
- Класс
LiquidLine
– представляет собой отдельные строки, напечатанные на дисплее. - Класс
LiquidScreen
– представляет собой экран, показанный на дисплее. - Класс
LiquidMenu
– представляет собой коллекцию экранов, формирующих меню. - Класс
LiquidSystem
– представляет собой коллекцию меню, формирующих систему меню.
Примеры
- hello_menu: как на Arduino с библиотекой LiquidMenu создавать меню из экранов с динамически изменяющейся информацией
- serial_menu: как на Arduino с библиотекой LiquidMenu использовать последовательную связь для выполнения команд
- functions_menu: как на Arduino с библиотекой LiquidMenu прикреплять функции, срабатывающие по событиям в меню
- buttons_menu: как на Arduino с библиотекой LiquidMenu использовать кнопки, функции обратного вызова и переменные, меняющие текст
- progmem_menu: как на Arduino с библиотекой LiquidMenu отображать строки, сохраненные во флеш-памяти
- focus_menu: как на Arduino с библиотекой LiquidMenu настроить индикатор фокуса
- glyph_menu: как на Arduino с библиотекой LiquidMenu создать пользовательский символ и использовать его в меню
- system_menu: как на Arduino с библиотекой LiquidMenu построить систему меню
- I2C_menu: как на Arduino с библиотекой LiquidMenu построить меню на LCD дисплее, подключенном через шину I2C