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.

Теги

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