serial_menu: как на Arduino с библиотекой LiquidMenu использовать последовательную связь для выполнения команд

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

Данный пример использует последовательную связь для выполнения команд. Доступные команды будут напечатаны в мониторе последовательного порта. Данный пример использует прикрепленные функции обратного вызова, которые объяснены в примере functions_menu.

Схема

Схема для примера serial_menu
Схема для примера serial_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 подсветки к корпусу.

Код

#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);


LiquidLine welcome_line1(1, 0, "LiquidMenu ", LIQUIDMENU_VERSION);
LiquidLine welcome_line2(1, 1, "Serial example");
LiquidScreen welcome_screen(welcome_line1, welcome_line2);

LiquidLine line21(4, 0, "Screen 2");
LiquidLine type_line(4, 1, "type...");
LiquidScreen screen2(line21, type_line);

LiquidLine line31(4, 0, "Screen 3");
LiquidScreen screen3(line31, type_line);

LiquidLine line41(4, 0, "Screen 4");
LiquidScreen screen4(line41, type_line);

LiquidMenu menu(lcd, welcome_screen, screen2, screen3, screen4);

/*
 * Данная функция будет прикреплена к одному или более объекту LiquidLine
 * и будет вызываться, когда строка будет выделена и 
 * bool LiquidMenu::call_function(byte number) будет вызвана с
 * number - номер, указанный при прикреплении функции.
 * Более подробно в примере function_menu.ino.
*/
void callback_function() 
{
  Serial.println(F("You called the callback function."));
}

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

  lcd.begin(16, 2);

  // Здесь мы прикрепляем функцию, объявленную ранее к четырем объектам LiquidLine.
  line21.attach_function(1, callback_function);
  line31.attach_function(1, callback_function);
  line41.attach_function(1, callback_function);
  type_line.attach_function(1, callback_function);

  menu.update();

  Serial.print(F("LiquidMenu ")); Serial.print(LIQUIDMENU_VERSION); Serial.println(F(" - Serial example:"));
  Serial.println(F("To navigate the menu type 'menu.next_screen()' or 'menu.previous_screen()'."));
  Serial.println(F("To switch focus type 'menu.switch_focus()'."));
  Serial.println(F("To call the callback function type 'menu.call_function(1)'."));
  Serial.println(F("To adjust the focus position type 'menu.set_focusPosition(Position::LEFT)'"));
  Serial.println(F("  or 'menu.set_focusPosition(Position::RIGHT)'."));
  Serial.println(F("To update the display type 'menu.update()'.")); Serial.println();
}

void loop() 
{
  // Обработка ввода с последовательного порта
  while (Serial.available() > 0) 
  {
    String command = Serial.readStringUntil('\0');
    if (command == "menu.next_screen()") 
    {
      Serial.println(command);
      menu.next_screen();
    } 
    else if (command == "menu.previous_screen()") 
    {
      Serial.println(command);
      menu.previous_screen();
    } 
    else if (command == "menu.switch_focus()") 
    {
      Serial.println(command);
      menu.switch_focus(); // переключает фокус на следующую строку
      // фокус используется функциями (смотрите пример 'functions_menu')
    } 
    else if (command == "menu.call_function(1)") 
    {
      Serial.println(command);
      // вызывается прикрепленная функция
      menu.call_function(1);
    } 
    else if (command == "menu.set_focusPosition(Position::LEFT)") 
    {
      Serial.println(command);
      // данная функция устанавливает положение фокуса
      menu.set_focusPosition(Position::LEFT);
    } 
    else if (command == "menu.set_focusPosition(Position::RIGHT)") 
    {
      Serial.println(command);
      menu.set_focusPosition(Position::RIGHT);
    } 
    else if (command == "menu.update()") 
    {
      Serial.println(command);
      menu.update();
    } 
    else 
    {
      Serial.print(command); Serial.println(F(" - unknown command"));
    }
    menu.update();
  }
}

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


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


Сообщить об ошибке