focus_menu: как на Arduino с библиотекой LiquidMenu настроить индикатор фокуса

Добавлено9 мая 2018 в 15:58

Данный пример демонстрирует, как настроить индикатор фокуса.

Индикатор фокуса по умолчанию – это символ стрелки, показываемый справа от выделенной строки. Положение индикатора фокуса может быть изменено для строки, и он будет отображаться справа, слева или в указанной позиции. Символ фокуса также может быть изменен для каждой позиции. В данном примере определяется пользовательский символ фокуса (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. Положение фокуса может быть задано для отдельной строки, для всего экрана, для всего меню или для всей системы меню с помощью соответствующих объектов.

Схема

Схема для примера focus_menu
Схема для примера focus_menu

Соединения:

  • вывод 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.

Теги

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