I2C_menu: как на Arduino с библиотекой LiquidMenu построить меню на LCD дисплее, подключенном через шину I2C
Это пример "hello_menu", настроенный для соединения с LCD дисплеем через шину I2C.
Чтобы использовать соединение I2C, вам необходимо в файле "LiquidMenu_config.h" установить I2C как "true
".
Проверено с LiquidCrystal_I2C.
Разница при использовании I2C библиотеки дисплея, вместо официальной библиотеки LiquidCrystal
, состоит в том, что метод void LiquidMenu::init()
необходимо вызвать в setup()
после инициализации I2C библиотеки дисплея. Другое отличие состоит в том, что I2C требует определения как "true
" в файле "LiquidMenu_config.h".
Схема
Соединения:
- вывод 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.