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

  • Класс LiquidLine – представляет собой отдельные строки, напечатанные на дисплее.
  • Класс LiquidScreen – представляет собой экран, показанный на дисплее.
  • Класс LiquidMenu – представляет собой коллекцию экранов, формирующих меню.
  • Класс LiquidSystem – представляет собой коллекцию меню, формирующих систему меню.

Примеры

  1. hello_menu: как на Arduino с библиотекой LiquidMenu создавать меню из экранов с динамически изменяющейся информацией
  2. serial_menu: как на Arduino с библиотекой LiquidMenu использовать последовательную связь для выполнения команд
  3. functions_menu: как на Arduino с библиотекой LiquidMenu прикреплять функции, срабатывающие по событиям в меню
  4. buttons_menu: как на Arduino с библиотекой LiquidMenu использовать кнопки, функции обратного вызова и переменные, меняющие текст
  5. progmem_menu: как на Arduino с библиотекой LiquidMenu отображать строки, сохраненные во флеш-памяти
  6. focus_menu: как на Arduino с библиотекой LiquidMenu настроить индикатор фокуса
  7. glyph_menu: как на Arduino с библиотекой LiquidMenu создать пользовательский символ и использовать его в меню
  8. system_menu: как на Arduino с библиотекой LiquidMenu построить систему меню
  9. I2C_menu: как на Arduino с библиотекой LiquidMenu построить меню на LCD дисплее, подключенном через шину I2C

Теги

ArduinoLCD дисплейМенюПрограммирование

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

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.


  • 2022-01-07ale

    На экране монитора строки ledState_text - "ON" "OFF" выводятся правильно.
    Что за 3 года никто не ответил?

  • 2018-08-22AndreB.

    На экране монитора строки ledState_text - "ON" "OFF" выводятся правильно.
    На LCD 2004 на I2C выводятся "кракозябры".
    Нет ли ошибки в скетче или библиотеке?