I2C_menu: как на Arduino с библиотекой LiquidMenu построить меню на LCD дисплее, подключенном через шину I2C

Добавлено15 мая 2018 в 22:01

Это пример "hello_menu", настроенный для соединения с LCD дисплеем через шину I2C.

Чтобы использовать соединение I2C, вам необходимо в файле "LiquidMenu_config.h" установить I2C как "true".

Проверено с LiquidCrystal_I2C.

Разница при использовании I2C библиотеки дисплея, вместо официальной библиотеки LiquidCrystal, состоит в том, что метод void LiquidMenu::init() необходимо вызвать в setup() после инициализации I2C библиотеки дисплея. Другое отличие состоит в том, что I2C требует определения как "true" в файле "LiquidMenu_config.h".

Схема

Схема для примера i2c_menu
Схема для примера i2c_menu

Соединения:

  • вывод SDA модуля PCF8574 к выводу A5 Arduino;
  • вывод SDL модуля PCF8574 к выводу A4 Arduino;
  • вывод VCC модуля PCF8574 к выводу 5V Arduino;
  • вывод GND модуля PCF8574 к выводу GND Arduino.

Код

Код скетча i2c_menu.ino

#include <Wire.h>
// Библиотека I2C LCD
#include <LiquidCrystal_I2C.h>
// Библиотека обертывания меню
#include <LiquidMenu.h>

// Объект I2C LCD
LiquidCrystal_I2C lcd(0x3F, 16, 2);


 /*
 * Переменная '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(1, 1, "Hello Menu I2C");

/*
 * Объекты 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);

  // Инициализация объекта I2C LCD.
  lcd.init();
  lcd.backlight();

  // Данный метод необходимо вызывать при использовании I2C библиотеки дисплея.
  menu.init();

  // Это метод, используемый для добавления объекта экрана в меню.
  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.

 

Теги

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