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

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

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