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 дисплейМенюПрограммирование

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

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