LiquidMenu: Arduino библиотека для создания меню на LCD дисплее

Добавлено 14 апреля 2018 в 17:13

Библиотека LiquidMenu обертывает Arduino библиотеку LiquidCrystal с возможностью создания меню. Она упрощает процесс создания меню, абстрагируя элементы меню в иерархически организованные классы.

Библиотека LiquidMenu
Пример использования библиотеки LiquidMenu
Пример использования библиотеки LiquidMenu

Содержание

Особенности

  • Быстрое и простое создание меню.
  • Выбираемые пункты меню.
  • Функции обратного вызова.
  • Связь I2C.

Требования

Загрузка

Скачать библиотеку можно по ссылке ниже:

Или на 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

Примеры

Будут добавлены.


На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.


Сообщить об ошибке