hello_menu: как на Arduino с библиотекой LiquidMenu создавать меню из экранов с динамически изменяющейся информацией

Добавлено7 мая 2018 в 00:21

Это стартовый пример, демонстрирующий, как создавать меню из двух экранов с динамически изменяющейся информацией.

Первый экран показывает некоторый статический текст. Второй экран показывает показания с аналогового вывода A1. Чтобы отобразить изменяющуюся переменную на LCD, просто поместите переменную в конструктор LiquidLine. В этом случае объект LiquidLine – это "analogReading_line", а переменная – это "analogReading". Эта строка находится на втором экране. Значение аналогового вывода считывается каждую секунду, и, если оно изменилось, дисплей обновится с новым значением. Меню циклически переключается между двумя своими экранами каждые пять секунд.

Схема

Схема для примера hello_menu
Схема для примера hello_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 подсветки к корпусу;
  • какой-либо аналоговый вход к выводу A1 Arduino (неподключенный тоже работает).

Код

// Библиотека LCD
#include <LiquidCrystal.h>
// Библиотека оборачивания меню
#include <LiquidMenu.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);

/*
 * Переменная 'analogReading' конфигурируется позже
 * для печати на дисплее. 'lastAnalogReading'
 * используется для проверки, изменилась ли переменная.
 */
const byte analogPin = A1;
unsigned short analogReading = 0;
unsigned short lastAnalogReading = 0;

/*
 * Переменные, используемые для периодического выполнения кода. Первая - это период
 * в миллисекундах, а вторая - время последнего выполнения кода.
 */
unsigned int period_check = 1000;
unsigned long lastMs_check = 0;

unsigned int period_nextScreen = 5000;
unsigned long lastMs_nextScreen = 0;

/*
 * Объекты LiquidLine представляют собой отдельные строки текста и/или переменных
 * на дисплее. Первые два параметра - это столбец и строка, с которых
 * строка начинается, остальные параметры - это текст и/или переменные,
 * которые будут напечатаны на дисплее. Их количество может составлять до четырех.
 */
// Здесь строка устанавливается в столбец 1, строку 0, и будут напечатаны
// переданные строка и переменная.
LiquidLine welcome_line1(1, 0, "LiquidMenu ", LIQUIDMENU_VERSION);
// Здесь столбец равен 3, а строка - 1, и строка "Hello Menu".
LiquidLine welcome_line2(3, 1, "Hello Menu");

/*
 * Объекты LiquidScreen представляют собой отдельные экраны. Экран формируется
 * из одного или более объектов LiquidLine. Отсюда может быть вставлено до четырех
 * объектов LiquidLine, но больше может быть добавлено позже в setup() с помощью
 * welcome_screen.add_line(someLine_object);.
 */
// Здесь два объекта LiquidLine, созданных выше.
LiquidScreen welcome_screen(welcome_line1, welcome_line2);

// Здесь не только строка текста, но еще и изменяющаяся целочисленная переменная.
LiquidLine analogReading_line(0, 0, "Analog: ", analogReading);
LiquidScreen secondary_screen(analogReading_line);

/*
 * Объект LiquidMenu объединяет объекты LiquidScreen, чтобы сформировать меню. 
 * Здесь он только инициализируется, а экраны добавляются позже с помощью
 * using menu.add_screen(someScreen_object);. Этот объект используется для
 * управления меню, например: menu.next_screen(), menu.switch_focus()...
 */
LiquidMenu menu(lcd);


void setup() 
{
  Serial.begin(250000);

  pinMode(analogPin, INPUT);

  lcd.begin(16, 2);

  // Это метод, используемый для добавления объекта экрана в меню.
  menu.add_screen(welcome_screen);
  menu.add_screen(secondary_screen);
}

void loop() 
{
  // Периодическое считывание аналогового вывода.
  if (millis() - lastMs_check > period_check) 
  {
    lastMs_check = millis();
    analogReading = analogRead(analogPin);
    /*
     * Проверить, изменилось ли аналоговое значение,
     * и обновить экран, если это так.
     */
    if (analogReading != lastAnalogReading) 
    {
      lastAnalogReading = analogReading;
      menu.update();
    }
  }

  // Периодическое переключение на следующий экран. 
  if (millis() - lastMs_nextScreen > period_nextScreen) 
  {
    lastMs_nextScreen = millis();
    menu.next_screen();
  }
}

Для более подробной информации смотрите документацию на библиотеку LiquidMenu.

Теги

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