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

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

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


  • 2019-11-28antzol

    Ответил здесь http://disq.us/p/25tjvn7

  • 2019-11-28Michal

    строка в программе LiquidLine liq_ln5(0, 0, "F:", freq, " L:", sethod," ",bat,"%");
    дает ошибку

    no matching function for call to 'LiquidLine::LiquidLine(int, int, const char [3], int&, const char [4], int&, const char [3], int&, const char [2])';


    пробовал изменить в LiquidMenu_config.hMAX_VARIABLES на 8, все равно выдает ошибку.

  • 2018-06-03antzol

    Библиотека LiquidCrystal_I2C установлена?
    Использование I2C в LiquidMenu_config.h включено?

  • 2018-06-03lekaakela

    Скетч из этого примера не компилируется в Arduino IDE 1.8.10
    строчка 61
    no matching function for call to 'LiquidMenu::LiquidMenu(LiquidCrystal_I2C&)'