focus_menu: как на Arduino с библиотекой LiquidMenu настроить индикатор фокуса
Данный пример демонстрирует, как настроить индикатор фокуса.
Индикатор фокуса по умолчанию – это символ стрелки, показываемый справа от выделенной строки. Положение индикатора фокуса может быть изменено для строки, и он будет отображаться справа, слева или в указанной позиции. Символ фокуса также может быть изменен для каждой позиции. В данном примере определяется пользовательский символ фокуса (uint8_t rFocus[8]
). Затем он настраивается для использования в качестве правого символа индикатора фокуса с помощью метода bool LiquidMenu::set_focusSymbol(Position position, uint8_t symbol[8])
. Положение фокуса для разных строк настраивается с помощью метода bool set_focusPosition(Position position, uint8_t column = 0, uint8_t row = 0)
. Если "position
" – это "Position::CUSTOM
", должны быть переданы параметры column
и row
. Положение фокуса может быть задано для отдельной строки, для всего экрана, для всего меню или для всей системы меню с помощью соответствующих объектов.
Схема
Соединения:
- вывод 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 подсветки к корпусу;
- ----
- кнопка (left, влево) к выводу A0 Arduino и к корпусу;
- кнопка (right, вправо) к выводу 7 Arduino и к корпусу;
- кнопка (enter, ввод) к выводу 10 Arduino и к корпусу.
Код
Код класса Button
(файл Button.h).
#pragma once
class Button
{
public:
Button (uint8_t pin, bool pullup = false, uint16_t debounceDelay = 50)
: _pin(pin), _state(LOW), _lastState(LOW),
_lastMillis(0), _debounceDelay(debounceDelay),
_lastDebounceTime(0)
{
if (pullup == true)
{
pinMode(_pin, INPUT_PULLUP);
}
else
{
pinMode(_pin, INPUT);
}
}
// Устраняет дребезг кнопки и возвращает состояние, если оно только что изменилось.
bool check(bool triggerState = LOW)
{
bool reading = digitalRead(_pin);
// Проверить, изменилось ли состояние кнопки
if (reading != _lastState)
{
_lastDebounceTime = millis();
}
// Проверить, изменилось ли состояние кнопки за '_debounceDelay' миллисекунд.
if ((millis() - _lastDebounceTime) > _debounceDelay)
{
//Проверить, изменилось ли состояние кнопки
if (reading != _state)
{
_state = reading;
return _state;
}
}
_lastState = reading;
// Если этот код был достигнут, он возвращает нормальное состояние кнопки.
if (triggerState == HIGH)
{
return LOW;
}
else
{
return HIGH;
}
}
private:
const uint8_t _pin;
bool _state;
bool _lastState;
uint32_t _lastMillis;
uint16_t _debounceDelay;
uint32_t _lastDebounceTime;
};
Код скетча focus_menu.ino
#include <LiquidCrystal.h>
#include <LiquidMenu.h>
#include "Button.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);
// Инициализация объектов Button
const bool pullup = true;
Button left(A0, pullup);
Button right(7, pullup);
Button enter(10, pullup);
LiquidLine welcome_line1(1, 0, "LiquidMenu ", LIQUIDMENU_VERSION);
LiquidLine welcome_line2(1, 1, "Focus example");
LiquidScreen welcome_screen(welcome_line1, welcome_line2);
LiquidLine leftFocus_line(1, 0, "Left focus");
LiquidLine rightFocus_line(1, 1, "Right focus");
LiquidScreen leftright_screen(leftFocus_line, rightFocus_line);
LiquidLine customFocus_line(1, 0, "Custom focus");
LiquidScreen customFocus_screen(customFocus_line);
LiquidLine leftF1_line(6, 0, "Left");
LiquidLine leftF2_line(6, 1, "focus");
LiquidScreen leftF12_screen(leftF1_line, leftF2_line);
LiquidMenu menu(lcd);
// Проверить все кнопки
void buttonsCheck()
{
if (right.check() == LOW)
{
menu.next_screen();
}
if (left.check() == LOW)
{
menu.previous_screen();
}
if (enter.check() == LOW)
{
// Переключить фокус на следующую строку.
menu.switch_focus();
}
}
// Определение символа индикатора. Он заменит символ по умолчанию для правого фокуса.
// http://omerk.github.io/lcdchargen/
uint8_t rFocus[8] = {
0b00000,
0b00000,
0b00100,
0b01110,
0b00100,
0b00000,
0b00000,
0b00000
};
// Пустая функция, она прикреплена к строкам, чтобы они стали выделяемыми.
void func()
{
return;
}
void setup()
{
Serial.begin(250000);
lcd.begin(16, 2);
// Изменить символ правого фокуса.
menu.set_focusSymbol(Position::RIGHT, rFocus);
// Установить положение фокуса для данной строки в левое положение.
leftFocus_line.set_focusPosition(Position::LEFT);
rightFocus_line.set_focusPosition(Position::RIGHT);
// Позиция фокуса 'CUSTOM' требует указания параметров столбца и строки.
customFocus_line.set_focusPosition(Position::CUSTOM, 15, 0);
// Позиция фокуса может быть изменена одновременно для всего экрана или
// меню. Позиция 'CUSTOM' не может быть установлена, поскольку она требует
// индивидуальных координат.
leftF12_screen.set_focusPosition(Position::LEFT);
// Прикрепление функции к строке делает строку выделяемой.
leftFocus_line.attach_function(1, func);
rightFocus_line.attach_function(1, func);
customFocus_line.attach_function(1, func);
leftF1_line.attach_function(1, func);
leftF2_line.attach_function(1, func);
menu.add_screen(welcome_screen);
menu.add_screen(leftright_screen);
menu.add_screen(customFocus_screen);
menu.add_screen(leftright_screen);
menu.add_screen(leftF12_screen);
menu.update();
}
void loop()
{
buttonsCheck();
}
Для более подробной информации смотрите документацию на библиотеку LiquidMenu.