Использование дисплеев Nextion с IoTmanager.
1. Дисплеи Nextion.
В отличие от традиционных, графические дисплеи Nextion HMI (Human Machine Interface) обладают собственным микроконтроллером, который используется для обработки графики, команд от сенсорного экрана, работы с памятью, SD-картой, UART. Дисплеи улучшенной версии оснащены также часами реального времени и контактами GPIO.
Подключение к MCU производится по последовательному порту. Двусторонний обмен происходит с помощью унифицированных инструкций, позволяющих определять события прикосновения к элементам экрана и устанавливать атрибуты созданных компонентов GUI. Это позволяет создать функциональный и эргономичный HMI работающий без увеличения нагрузки на основной MCU.
Модельный ряд представлен дисплеями с диагональю 2.4" - 7.0" с разрешением экрана от 320x240 до 800x480.
2. Концепция создания HMI Nextion.
Для создания HMI используется программа Nextion Editor, которая позволяет создавать интерфейс пользователя и прописать обработку событий Press/Release для элементов экрана. Вид интерфейса Nextion Editor представлен ниже:
Для создания HMI на странице (4) располагают компоненты GUI, которые доступны на панели компонентов (2). Страниц можно создать несколько, и реализовать навигацию по кнопкам или в виде меню.
Базовых компонентов 18 шт. (кнопки, слайдеры, окна ввода и т.д.). Каждый компонент имеет имя (objname) и список атрибутов (3). Часть атрибутов, выделенных зелёным цветом, можно изменять динамически. Кроме этого, есть доступ к системным параметрам дисплея. Например, яркость подсветки, параметры UART, и т.д.
Подавляющее большинство компонентов в редакторе Nextion Editor оснащены функциями обработки для нескольких возможных событий, таких как: момент касания экрана (Touch Press Event), момент отпускания экрана (Touch Release Event). Некоторые компоненты наделены событием перемещения - движением пальца без отрыва от экрана (Touch Move). Обработчик событий может быть описан в окне (6) с помощью скрипта. Результат выполнения скрипта может распространяться на любой компонент в пределах текущей страницы.
Доступ к атрибутам возможен как внутри Nextion с помощью скрипта так извне, по UART от MCU.
Доступ к атрибутам компонентов внутри Nextion :
· Компонент.атрибут=значение
· Компонент1.атрибут=Компонент2.атрибут
Доступ к атрибутам компонентов извне по UART:
· Компонент.атрибут=значение0xFF0xFF0xFF
· Системный параметр=значение0xFF0xFF0xFF
Для атрибута .txt значение берётся в кавычки.
Все инструкции от MCU в Nextion завершаются тремя байтами 0xFF0xFF0xFF.
Отправка инструкций от Nextion в MCU по UART формируется с помощью скрипта в обработчике событий (6) с использованием операторов print.
· Компонент.атрибут=значение\x0D\x0A
· “Текстовая команда” \x0D\x0A
Все инструкции от Nextion в MCU завершаются \x0D\x0A (Line Feed, Return)
На панели ресурсов HMI проекта (5) располагаются дизайнерские элементы: картинки, шрифты, медиа, которые используются для оформления страницы, кнопок, и т.д..
Концепция Nextion позволяет организовать HMI в стиле IoTmanager, где каждая страница будет эквивалентом вкладки, а дизайн виджетов оформлен с помощью скопированных дизайнерских элементов (5).
Более подробно по ссылке: интерфейс Nextion Editor
После создания HMI, есть возможность отладить его с помощью встроенного отладчика (1):
Можно не только эмулировать обмен инструкциями по UART(2)(3), но и подключиться к реальному MCU (4) и использовать отладчик в качестве дисплея Nextion.
Готовый проект HMI нужно скомпилировать и загрузить в дисплей Nextion с помощью microSD карты или переходника USB.
Более подробно по ссылкам:
· Подключение дисплеев Nextion, установка ПО, загрузка HMI в Nextion
· Руководство по дисплейным модулям Nextion (рус.)
· Среда разработки Nextion Editor
· Список операторов и инструкций по Nextion Editor (англ.)
3. Подключение дисплея Nextion к IoTmanager.
1) Подключите Nextion к UART порту ESP8266 или ESP32 по перекрёстной схеме: rxàtx, txàrx. Для ESP32 предпочтительнее использовать аппаратный UART2 (GPIO16, GPIO17)
2) В конфигураторе IoTmanager первым добавьте элемент UART.
3) Задайте номера GPIO (1) и id (4). Для ESP32 желательно использовать GPIO16, GPIO17.
4) Параметр line (2) назначьте по номеру выбранного UART. Для ESP32 UART2 line=2.
5) Задайте режим работы UART с помощью параметра eventFormat:
· eventFormat=0: можно отправлять/принимать текст через UART только из сценария.
· eventFormat=1: обмен событиями происходит автоматически, как при сетевом взаимодействии, т.е. можно связать проводом два MCU и они будет работать как через MQTT, т.е. видеть события друг друга.
· eventFormat=2: обмен так же автоматический, но в формате работы с Nextion. Сообщения от Nextion воспринимаются как ордеры в формате ID=Value.
В этом режиме так же можно отправлять/принимать текст через UART из сценария.
Если предполагается совместно с дисплеем Nextion использовать монитор электросети PZEM, то его следует подключить на другой UART: к GPIO1, GPIO3.
Элемент UART добавьте в конце списка конфигуратора, но перед элементами PZEM, line=1.
4. Обмен данными MCU c дисплеем Nextion.
Тестовый пример HMI: (здесь будет ссылка на исходники)
4.1. Обмен данными MCU c дисплеем Nextion из сценария.
1) Для передачи инструкций от MCU к дисплею Nextion из сценария используется функция: printFFF("строка", param);
где: "строка" – текст с инструкцией или значением атрибута; param – 0=исключить кавычки, 1=в кавычках.
Допустима составная конструкция: id.print("t5.txt="); id.printFFF(“C”,1);
Работает при eventFormat=0,1,2
Примеры:
# Отправка команды на кнопку bt1 Nextion
if bt1==1 then u2.printFFF("bt1.val=1",0);
if bt1==0 then u2.printFFF("bt1.val=0",0);
#Изменение цвета бара в зависимости от температуры
if tmp2_txt>27 then u2.printFFF("j0.pco=63488",0)
else u2.printFFF("j0.pco=2024",0);
#Изменение фона страницы
if page0==1 then u2.printFFF("page0.bco=0",0);
if page0==0 then u2.printFFF("page0.bco=33808",0);
2) Для получения инструкций от Nextion используется прием строки в значение элемента UART и реакция на событие: if id == "сообщение" then {};
Работает при eventFormat=0,1,2
Само сообщение формируется в дисплее Nextion по событию с помощью скрипта и отсылается в MCU оператором print.
Примеры:
# Проверка состояние кнопки bt1 на дисплее Nextion
if u2=="bt1-on" then bt1=1;
if u2=="bt1-off" then bt1=0;
Для формирования текстовой инструкции от Nextion для кнопки с двумя состояниями делаем в редакторе следующие:
1) Перетащите компонент кнопки с двумя состояниями (1) на страницу.
2) В атрибутах задайте выделенные параметры.
3) ID картинок для двух состояний кнопки возьмите из панели ресурсов HMI проекта (3). Запишите их в атрибуты pic, pic2 (выкл/вкл).
4) Создайте скрипт по событию «Нажатие кнопки» (Touch Press Event):
if(bt1.val==1)
{
print "bt1-on"
printh 0d 0a
}else
{
print "bt1-off"
printh 0d 0a
}
Теперь, при первом нажатии кнопки bt1 в UART будет отправлена текстовая инструкция “bt1-on”\x0D\x0A; при втором нажатии “bt1-on”\x0D\x0A
Для синхронизации HMI Nextion и IoTmanager необходимо организовать двухстороннюю обратную связь для управляющих элементов:
# Синхронизированное управление кнопкой bt1
if u2=="bt1-on" then bt1=1;
if u2=="bt1-off" then bt1=0;
if bt1==1 then u2.printFFF("bt1.val=1",0);
if bt1==0 then u2.printFFF("bt1.val=0",0);
Нажатие кнопки на дисплее Nextion приведёт к изменению положения переключателя в IoTmanager. И наоборот.
4.2. Автоматический обмен событиями MCU c дисплеем Nextion.
Данный режим не требует использования сценариев.
Для организации автоматического обмена событиями необходимо:
1) Задайте для UART: eventFormat=2.
2) При конфигурировании элемента в IoTmanager в качестве id укажите имя (objname) и атрибут разделяя их «_» (не точкой). Например: bt0_val (состояние кнопки bt0), tmp2_txt (сообщение в текстовое окно tmp2). Для системных параметров необходимо в конце добавить «_». Например: dim_ (яркость подсветки).
Примеры:
# Вывод показаний датчика температуры в текстовое окно:
# Вывод показаний датчика температуры в цифровое окно Xfloat.
Атрибут ws1 должен быть равен параметру элемента round:
# Задание яркости подсветки Nextion:
Для синхронизации HMI Nextion и IoTmanager необходимо организовать двухстороннюю обратную связь для управляющих элементов.
# Синхронизированное управление кнопкой bt0
Скрипт по событию «Нажатие кнопки» (Touch Press Event):
if(bt0.val==1)
{
print "bt0.val=1"
printh 0d 0a
}else
{
print "bt0.val=0"
printh 0d 0a
}
# Синхронизированное окно ввода text1 с кнопкой b2
В атрибуте key задаём тип клавиатуры для ввода:
Скрипт по событию «Нажатие кнопки» b2 (Touch Press Event) для:
print "text1.txt="
print text1.txt
printh 0d 0a