FLProg + Nextion HMI Enhanced

HMI_1

Компания ITEAD выпустила новую линейку Enhanced своих панелей Nextion HMI. Представители компании предоставили мне экземпляр этой линейки для интеграции новых возможностей панели в программу FLProg. В версии 2.2 это было реализовано. В данном уроке мы рассмотрим новые возможности панели, и для примера создадим программируемый таймер на пять каналов.

Для начала рассмотрим характеристики панели. В линейке Enhanced появились встроенные часы реального времени, 1024 байта энергонезависимой памяти, 8 цифровых входов/выходов. Каждый них может быть настроен как вход, так и как выход. Четыре из них (с 4-го по 7) могут быть настроены как выходы ШИМ.

HMI_2

Кроме непосредственно самой линейки «Nextion HMI Enhanced» была выпущена плата «Expansion Board»

HMI_3

На ней установлены органы управления и индикации, привязанные к GPIO панели.

HMI_4

Такие возможности позволяют на базе этой панели сделать практически законченное устройство. В данном уроке я основной упор сделаю на программирование самой панели, поскольку информации по этому поводу мало, а подводных камней много. Ссылка на проект для программы Nextion Editor есть в конце поста.

Начало работы с редактором Nextion Editor, его запуск, начальный выбор кодировки, типа панели рассмотрено в моих предыдущих постах тыц, тыц , и тыц. Поэтому не будем на этом останавливаться.
Программа панели состоит из трёх экранов Главного (Main), Настройка таймера (SetTimer) и Установка времени (SetCurrentTime).

Начнём с главного экрана.

HMI_6

На этом экране отображаются уставки включения, выключения, состояния каждого канала, кнопки изменения состояния каналов, и кнопка перехода на экран настройки текущего времени. При клике на текст, отображающий уставки канала, происходит переход на настройку данного канала. Кроме того на этом экране находятся четыре скрытые кнопки необходимые для привязки к физическим кнопкам находящихся на Expansion Board..

HMI_7

Рассмотрим код, содержащийся на главном экране.

Событие Preinitialilize Event (вызывается перед инициализацией экрана).

cfgpio 0,1,b0 //Кнопка Esc (IO0) привязывается к виртуальной кнопке b0 "Установить время"
cfgpio 2,1,b8 //Кнопка Right (IO2) привязывается к виртуальной кнопке b8 -"Редактировать выбранный канал"
cfgpio 3,1,b7 //Кнопка Down (IO3) привязывается к виртуальной кнопке b7 -"Перейти на следующий канал"
cfgpio 4,1,b6 //Кнопка Up (IO4) привязывается к виртуальной кнопке b6 -"Перейти на предыдущий канал"
cfgpio 5,1,b9 //Кнопка Left (IO5) привязывается к виртуальной кнопке b9 -"Переключить состояние канала"
SelTim.val=1 //Выбор первого канала

Здесь мы привязываем физические кнопки, находящиеся на Expansion Board, к виртуальным кнопкам на экране.

Событие Touch Press Event кнопки b0 – «Установить время»

page 2 // Переход на страницу установки текущего времени

Тут всё понятно без объяснений

Событие Touch Press Event кнопки b1 – «Переключить состояние первого канала»

repo TempB.val,0 // Читаем из EEPROM в переменную TempB активность канала 1
if(TempB.val==1) // Если канал активен - переключаем его состояние
{
  if(tsr1.val==1)// если канал включён
  {
    tsr1.val=2 // выключаем его
  }else
  {
    tsr1.val=1 // иначе - включаем
  }
}

Сначала мы читаем из EEPROM активность канала. Каждый канал можно выключить из работы на странице настройки канала. Команду repo – «чтение из EEPROM» мы рассмотрим поподробнее ниже. Затем, если канал активен, переключаем его состояние. Текущее состояние каналов хранится в переменных tsr1 – tsr5 для каждого из каналов соответственно.

Для остальных кнопок изменения состояния канала (b2 — b5) код события Touch Press Event аналогичны. Изменяется только адрес в EEPROM и переменная состояния канала.

Событие Touch Press Event кнопки b6 – «Выбрать предыдущий канал». Кнопка невидимая. Режим отрисовки (sta) – crop image (вырезанное изображение). В качестве картинки в не нажатом состоянии (picc) и нажатом состоянии (picc2) выбрано фоновое изображение окна. За счёт этого кнопка не отображается, но работает. Эта кнопка на этом экране привязана к физической кнопке Up (IO4) на Expansion Board.

if(SelTim.val<2)//Если выбран канал 1
{
  SelTim.val=5 // выбираем канал 5
}else
{
  SelTim.val=SelTim.val-1 //иначе переходим на предыдущий канал
}

В переменной SelTim находится номер выбранного текущий момент таймера. Всё остальное, думаю понятно из комментариев.

Событие Touch Press Event кнопки b7 – «Выбрать следующий канал». Кнопка невидимая. Эта кнопка на этом экране привязана к физической кнопке Down (IO3) на Expansion Board.

if(SelTim.val>4) //Если выбран канал 5
{
  SelTim.val=1 //переходим на канал 1
}else
{
  SelTim.val=SelTim.val+1 // иначе переходим на следующий
}

Тут я думаю то же всё понятно.

Событие Touch Press Event кнопки b8 – «Редактировать выбранный канал». Кнопка невидимая. Эта кнопка на этом экране привязана к физической кнопке Right (IO2) на Expansion Board.

if(SelTim.val==1) // Если выбран канал 1
{
  click TimerText1,1 // то имитируем нажатие на поле отображения состояния канала 1
}
if(SelTim.val==2) // Если выбран канал 2
{
  click TimerText2,1 // то имитируем нажатие на поле отображения состояния канала 2
}
if(SelTim.val==3) // Если выбран канал 3
{
  click TimerText3,1 // то имитируем нажатие на поле отображения состояния канала 3
}
if(SelTim.val==4) // Если выбран канал 4
{
  click TimerText4,1 // то имитируем нажатие на поле отображения состояния канала 4
}
if(SelTim.val==5) // Если выбран канал 5
{
  click TimerText5,1 // то имитируем нажатие на поле отображения состояния канала 1
}

Событие Touch Press Event кнопки b9 – «Переключить состояние выбранного канала». Кнопка невидимая. Эта кнопка на этом экране привязана к физической кнопке Left (IO5) на Expansion Board.

if(SelTim.val==1) // Если выбран канал 1
{
  click b1,1 // Имитируем нажатие на кнопку b1
}
if(SelTim.val==2) // Если выбран канал 2
{
  click b2,1 // Имитируем нажатие на кнопку b2
}
if(SelTim.val==3) // Если выбран канал 3
{
  click b3,1 // Имитируем нажатие на кнопку b3
}
if(SelTim.val==4) // Если выбран канал 4
{
  click b4,1 // Имитируем нажатие на кнопку b4
}
if(SelTim.val==5) // Если выбран канал 5
{
  click b5,1 // Имитируем нажатие на кнопку b5
}

Событие Touch Press Event текстового поля TimerText1 – «Отображение состояния канала 1».

sys0=1 // заносим в системную переменную sys0  номер редактируемого канала
sys1=1 // заносим в системную переменную sys1  стартовый номер для выделения необходимого поля редактирования
page 1 //переходим на страницу редактирования канала (SetTimer - ID = 1).

Для других текстовых полей (TimerText2 – TimerText5) код события Touch Press Event аналогичен. Только в системную переменную sys0 заносится соответствующий номер канала.
sys0, sys1, sys2-глобальные числовые переменные, которые не нужно создавать или определять. Их можно использовать на любом экране. Значение по умолчанию для этих трех переменных равны 0, их можно читать и писать, их диапазон значений 0~4294967295. Рекомендуется для передачи значений между страницами.

На этом экране установлен таймер tm0. Этот таймер срабатывает каждые 200 миллисекунд (параметр tim), при активности страницы. Код контроля состояния таймеров и перерисовки компонентов, находящихся на странице находится в событии Timer Event этого таймера.

Рассмотрим расположение данных в EEPROM панели. На каждый канал отведено 52 байта. На каждое значение – 4 байта.

Адрес в EEPROM
Стартовое смещение = (номер канала начиная с 0)*52
Значение
Стартовое смещение Активность канала (0 – канал отключен, 1- канал включён)
Стартовое смещение + 4 День включения канала. Если не учитывается — 10000
Стартовое смещение + 8 Месяц включения канала. Если не учитывается — 10000
Стартовое смещение + 12 Год включения канала. Если не учитывается — 10000
Стартовое смещение + 16 Час включения канала. Если не учитывается — 10000
Стартовое смещение + 20 Минута включения канала. Если не учитывается -10000
Стартовое смещение + 24 Секунда включения канала. Если не учитывается – 10000
Стартовое смещение + 28 День выключения канала. Если не учитывается — 10000
Стартовое смещение + 32 Месяц выключения канала. Если не учитывается – 10000
Стартовое смещение + 36 Год выключения канала. Если не учитывается -10000
Стартовое смещение + 40 Час выключения канала. Если не учитывается -10000
Стартовое смещение + 44 Минута выключения канала. Если не учитывается -10000
Стартовое смещение + 48 Секунда выключения канала. Если не учитывается -10000

С главным экраном закончили, перейдём к экрану настройки таймера (SetTimer ID=1)

HMI_8

Событие Preinitialilize Event (вызывается перед инициализацией экрана).

cfgpio 0,1,b2  //Кнопка Esc (IO0) привязывается к виртуальной кнопке b2 ( "Активировать/Дезактивировать канал" или "Выход" (удержание 2 сек))
cfgpio 1,1,BYE  //Кнопка Enter (IO1) привязывается к виртуальной кнопке BYE ("Включение/Oтключение учёта при срабатывании" выбранного поля)
cfgpio 2,1,b0 //Кнопка Right (IO2) привязывается к виртуальной кнопке b0 -"Переход к следующему полю"
cfgpio 3,1,BYM //Кнопка Down (IO3) привязывается к виртуальной кнопке BYM -"Отнять еденичку у выбранного поля"
cfgpio 4,1,BYP //Кнопка Up (IO4) привязывается к виртуальной кнопке BYP -"Добавить еденичку к выбранному полю"
cfgpio 5,1,b1 //Кнопка Left (IO5) привязывается к виртуальной кнопке b1 -"Переход к предыдущему полю"
StAddr.val=sys0-1 // Переносим номер выбранного канала в счёт с 0
StAddr.val=StAddr.val*52 // определяем стартоый адрес выбранного канала в EEPROM
repo Enable.val,StAddr.val // В переменную Enable заносим вычитываемую из EEPROM активность канала

Здесь мы переопределяем привязку физических кнопок расположенных на Expansion Board под нужды данного экрана, и производим предварительное считывание данных.

Событие Touch Press Event кнопки b0 – «Переход к следующему полю». Кнопка невидимая. Эта кнопка на этом экране привязана к физической кнопке Right (IO2) на Expansion Board.

if(sys1>11) // Если активно поле 12 (Секунды уставки отключения)
{
  sys1=1 //Активируем поле 1 (День уставки включения )
}else //Иначе
{
  sys1=sys1+1 //Переходим на следующее поле
}

Событие Touch Press Event кнопки b1 – «Переход к предыдущему полю». Кнопка невидимая. Эта кнопка на этом экране привязана к физической кнопке Left (IO5) на Expansion Board.

if(sys1<2) //Если активно поле 1 (День уставки включения )
{
  sys1=12 // Активируем поле 12 (Секунды уставки отключения)
}else //иначе
{
  sys1=sys1-1 //Переходим на предыдущее поле
}

Событие Touch Press Event кнопки b2 – «Активировать/Дезактивировать канал» или «Выход» (удержание 2 сек). Кнопка невидимая. Эта кнопка на этом экране привязана к физической кнопке Esc (IO0) на Expansion Board.

tm1.en=1 //Запускаем таймер tm1

Здесь мы запускаем вспомогательный таймер. Если удерживать физическую кнопку Esc (IO0) на Expansion Board в течение 2 секунд (свойство tim таймера), то произойдёт сработка таймера (вызов события Timer Event таймера tm1), если отпустить кнопку раньше, то будет вызвано событие Touch Release Event кнопки b2

tm1.en=0 // Cбрасываем и останавливаем таймер tm1
if(Enable.val==1) // Если текущее состояние элемента Enable ("Активировать/Дезактивировать канал") включённое
{
  Enable.val=0 //то переводим его в выключенное состояние
}else //иначе
{
  Enable.val=1 //переводим его во включенное состояние
}

Событие Timer Event таймера tm1

click b11,1 //Имитируем нажатие на виртуальную кнопку b11 ("Выход")

Событие Touch Press Event кнопки BYE – «Включение/Отключение учёта при срабатывании» выбранного поля

if(sys1==1) // Если выбрано поле 1(День уставки включения)
{
  temp2.val=rtc2 // В качестве значения по умолчанию выбираем текущий день из часов реального времени
}
if(sys1==2) // Если выбрано поле 2(Месяц уставки включения)
{
  temp2.val=rtc1  // В качестве значения по умолчанию выбираем текущий месяц из часов реального времени
}
if(sys1==3) // Если выбрано поле 3(Год уставки включения)
{
  temp2.val=rtc0  // В качестве значения по умолчанию выбираем текущий год из часов реального времени
}
if(sys1==4) // Если выбрано поле 4 (Час уставки включения)
{
  temp2.val=rtc3 // В качестве значения по умолчанию выбираем текущий час из часов реального времени
}
if(sys1==5) // Если выбрано поле 5 (Минута уставки включения)
{
  temp2.val=rtc4 // В качестве значения по умолчанию выбираем текущую минуту из часов реального времени
}
if(sys1==6) // Если выбрано поле 6 (Секунда уставки включения)
{
  temp2.val=rtc5 // В качестве значения по умолчанию выбираем текущую секунду из часов реального времени
}
if(sys1==7) // Если выбрано поле 7 (День уставки выключения)
{
  temp2.val=rtc2 // В качестве значения по умолчанию выбираем текущий день из часов реального времени
}
if(sys1==8) // Если выбрано поле 8 (Месяц уставки выключения)
{
  temp2.val=rtc1  // В качестве значения по умолчанию выбираем текущий месяц из часов реального времени
}
if(sys1==9) // Если выбрано поле 9 (Год уставки выключения)
{
  temp2.val=rtc0  // В качестве значения по умолчанию выбираем текущий год из часов реального времени
}
if(sys1==10)// Если выбрано поле 10 (Час уставки выключения)
{
  temp2.val=rtc3 // В качестве значения по умолчанию выбираем текущий час из часов реального времени
}
if(sys1==11) // Если выбрано поле 11 (Минута уставки выключения)
{
  temp2.val=rtc4 // В качестве значения по умолчанию выбираем текущую минуту из часов реального времени
}
if(sys1==12) // Если выбрано поле 12 (Секунда уставки выключения)
{
  temp2.val=rtc5 // В качестве значения по умолчанию выбираем текущую секунду из часов реального времени
}
temp3.val=sys1*4 // определяем смещение адреса в EEPROM для значения выбранного поля
temp.val=StAddr.val+temp3.val// определяем абсолютный адрес в EEPROM для значения выбранного поля
repo temp1.val,temp.val // вычитываем значение данного для выбранного поля в переменную temp1
if(temp1.val==10000)//Если поле не учитывается при определении события (значение равно 10000)
{
  temp1.val=temp2.val // заносим в переменную temp1 ранее определённое значение по умолчанию (включаем учитывание поля при определении события)
}else //Иначе (Если учитывается при определении события)
{
  temp1.val=10000 // заносим в переменную temp1 значение 10000 (отключаем учитывание поля при определении события)
}
wepo temp1.val,temp.val//Cохраняем новое значение в EEPROM

Событие Touch Press Event кнопки BYP – «Добавить 1 к выбранному полю».

if(sys1==1) // Если выбрано поле 1(День уставки включения)
{
  temp2.val=31 // то в переменную temp2 записываем  максимальное значение для поля 1 - 31
}
if(sys1==2)// Если выбрано поле 2(Месяц уставки включения)
{
  temp2.val=12 // то в переменную temp2 записываем  максимальное значение для поля 2 - 12
}
if(sys1==3) // Если выбрано поле 3 (Год уставки включения)
{
  temp2.val=9999 // то в переменную temp2 записываем  максимальное значение для поля 2 - 9999
}
if(sys1==4) // Если выбрано поле 4 (Час уставки включения)
{
  temp2.val=23 // то в переменную temp2 записываем  максимальное значение для поля 4 - 23
}
if(sys1==5)  // Если выбрано поле 5 (Минута уставки включения)
{
  temp2.val=59 // то в переменную temp2 записываем  максимальное значение для поля 5 - 59
}
if(sys1==6)  // Если выбрано поле 6 (Секунда уставки включения)
{
  temp2.val=59 // то в переменную temp2 записываем  максимальное значение для поля 6 - 59
}
if(sys1==7)// Если выбрано поле 7 (День уставки выключения)
{
  temp2.val=31 // то в переменную temp2 записываем  максимальное значение для поля 7 - 31
}
if(sys1==8) // Если выбрано поле 8 (Месяц уставки выключения)
{
  temp2.val=12 // то в переменную temp2 записываем  максимальное значение для поля 8 - 12
}
if(sys1==9) // Если выбрано поле 9 (Год уставки выключения)
{
  temp2.val=9999 // то в переменную temp2 записываем  максимальное значение для поля 9 - 9999
}
if(sys1==10) // Если выбрано поле 10 (Час уставки выключения)
{
  temp2.val=23 // то в переменную temp2 записываем  максимальное значение для поля 10 - 23
}
if(sys1==11) // Если выбрано поле 11 (Минута уставки выключения)
{
  temp2.val=59 // то в переменную temp2 записываем  максимальное значение для поля 11 - 59
}
if(sys1==12) // Если выбрано поле 12 (Секунда уставки выключения)
{
  temp2.val=59 // то в переменную temp2 записываем  максимальное значение для поля 12 - 59
}
temp3.val=sys1*4  // определяем смещение адреса в EEPROM для значения выбранного поля
temp.val=StAddr.val+temp3.val // определяем абсолютный адрес в EEPROM для значения выбранного поля
repo temp1.val,temp.val  // вычитываем значение данного для выбранного поля в переменную temp1
if(temp1.val!=10000)//Если поле учитывается при определении события (значение не равно 10000)
{
  if(temp1.val!=temp2.val)// если значение уставки не равно ранее определённому максимальному значению
  {
    temp1.val=temp1.val+1 // добавляем к значению еденицу
    wepo temp1.val,temp.val //Cохраняем новое значение в EEPROM
  }
}

Событие Touch Press Event кнопки BYM – «Вычесть 1 из выбранного поля».

temp2.val=0 // записываем в переменную temp2 минимальное значение для полей 4, 5, 6,10,11,12 - 0
if(sys1==1)// Если выбрано поле 1(День уставки включения)
{
  temp2.val=1 // то в переменную temp2 записываем  минимальное значение для поля 1 - 1
}
if(sys1==2)// Если выбрано поле 2(Месяц уставки включения)
{
  temp2.val=1 // то в переменную temp2 записываем  минимальное значение для поля 2 - 1
}
if(sys1==3)// Если выбрано поле 3(Год уставки включения)
{
  temp2.val=2016  // то в переменную temp2 записываем  минимальное значение для поля 3 - 2016
}
if(sys1==7) // Если выбрано поле 7(День уставки выключения)
{
  temp2.val=1 // то в переменную temp2 записываем  минимальное значение для поля 7 - 1
}
if(sys1==8) // Если выбрано поле 8(Месяц уставки выключения)
{
  temp2.val=1 // то в переменную temp2 записываем  минимальное значение для поля 8 - 1
}
if(sys1==9) // Если выбрано поле 9(Год уставки выключения)
{
  temp2.val=2016 // то в переменную temp2 записываем  минимальное значение для поля 9 - 2016
}
temp3.val=sys1*4//определяем смещение адреса в EEPROM для значения выбранного поля
temp.val=StAddr.val+temp3.val // определяем абсолютный адрес в EEPROM для значения выбранного поля
repo temp1.val,temp.val // вычитываем значение данного для выбранного поля в переменную temp1
if(temp1.val!=10000) //Если поле учитывается при определении события (значение не равно 10000)
{
  if(temp1.val!=temp2.val)// если значение уставки не равно ранее определённому минимальному значению
  {
    temp1.val=temp1.val-1 // отнимаем от значения еденицу
    wepo temp1.val,temp.val //Cохраняем новое значение в EEPROM
  }
}

Событие Touch Press Event кнопки b11 – «Возврат на главную страницу».

wepo Enable.val,StAddr.val// сохраняем в EEPROM значение активности канала
sys0=0 //сбрасываем системную переменную sys0 
sys1=0 //сбрасываем системную переменную sys1 
page 0 // Переходим на главную страницу

Событие Touch Press Event текстового поля StartD – «День уставки срабатывания».

sys1=1 //выбираем поле 1

Для текстовых полей других значений уставок код события Touch Press Event аналогичен за исключением номера поля.
Номера полей значений уставок:
StartMo – 2 («Месяц уставки срабатывания»).
StartY – 3 («Год уставки срабатывания»).
StartH – 4 («Час уставки срабатывания»).
StartMi – 5 («Минута уставки срабатывания»).
StartS – 6 («Секунда уставки срабатывания»).
StopD – 7 («День уставки отключения»).
StopMo – 8 («Месяц уставки отключения „).
StopY – 9 (“Год уставки отключения „).
StopH – 10 (“Час уставки отключения „).
StopMi – 11 (“Минута уставки отключения „).
StopS – 12 (“Сеунда уставки отключения „).

На этом экране так же установлен таймер tm0 с периодом срабатывания в 200 миллисекунд. В событии Timer Event этого таймера происходит обновление значений полей уставок.

С экраном настройки канала закончили, переходим на экран настройки текущего времени (SetCurrentTime ID=2).

HMI_9

Здесь, как и на других экранах в событии Preinitialilize Event (вызывается перед инициализацией экрана) перепривязываем физические кнопки, к находящимся на этом экране виртуальным кнопкам.

cfgpio 0,1,b11 //Кнопка Esc (IO0) привязывается к виртуальной кнопке b1 ("Выход")
cfgpio 1,1,b10 //Кнопка Enter (IO1) привязывается к виртуальной кнопке b10 ("сброс секунд в 0")
cfgpio 2,1,b14 //Кнопка Right (IO2) привязывается к виртуальной кнопке b14 ("Добавить 1 к значению выбранного полю")
cfgpio 3,1,b13 //Кнопка Down (IO3) привязывается к виртуальной кнопке b13 ("Перейти к следующему полю")
cfgpio 4,1,b12 //Кнопка Up (IO4) привязывается к виртуальной кнопке b12 ("Перейти к предыдущему полю")
cfgpio 5,1,b15 //Кнопка Left (IO5) привязывается к виртуальной кнопке b15 ("Отнять 1 от значения выбранного поля")
sel.val=1 // Устанавливаем выбранным поле 1 (День)

Событие Touch Press Event кнопки b0 – «Добавить день к текущему времени».

if(rtc2<31)// если значение текущего дня в часах реального времени меньше 31
{
  rtc2=rtc2+1 // то добавляем к текущему значению день
}

Событие Touch Press Event кнопки b2 – «Добавить месяц к текущему времени».

if(rtc1<12) // если значение текущего месяца в часах реального времени меньше 12
{
  rtc1=rtc1+1 // то добавляем к текущему значению ещё месяц
}

Событие Touch Press Event кнопки b4 – «Добавить год к текущему времени».

rtc0=rtc0+1 //добавляем к текущему значению года в часах реального времени ещё год

Событие Touch Press Event кнопки b6 – «Добавить час к текущему времени».

if(rtc3<23) // если значение текущего часа в часах реального времени меньше 23
{
  rtc3=rtc3+1 // то добавляем к текущему значению ещё час
}

Событие Touch Press Event кнопки b8 – «Добавить минуту к текущему времени».

if(rtc4<59) // если значение текущей минуты в часах реального времени меньше 59
{
  rtc4=rtc4+1 // то добавляем к текущему значению ещё минуту
}

Событие Touch Press Event кнопки b1 – «Отнять день из текущего времени».

if(rtc2>1)// если значение текущего дня в часах реального времени больше 1
{
  rtc2=rtc2-1 // то отнимаем от текущего значения день
}

Событие Touch Press Event кнопки b3 – «Отнять месяц из текущего времени».

if(rtc1>1) // если значение текущего месяца в часах реального времени больше 1
{
  rtc1=rtc1-1 // то отнимаем от текущего значения месяц
}

Событие Touch Press Event кнопки b5 – «Отнять год из текущего времени».

if(rtc0>2016) // если значение текущего года в часах реального времени больше 2016
{
  rtc0=rtc0-1 // то отнимаем от текущего значения год
}

Событие Touch Press Event кнопки b7 – «Отнять час из текущего времени».

if(rtc3>0)// если значение текущего часа в часах реального времени больше 0
{
  rtc3=rtc3-1 // то отнимаем от текущего значения час
}

Событие Touch Press Event кнопки b9 – «Отнять минуту из текущего времени».

if(rtc4>0) // если значение текущей минуты в часах реального времени больше 0
{
  rtc4=rtc4-1 // то отнимаем от текущего значения минуту
}

Событие Touch Press Event кнопки b10 – «Установка секунд в 0».

rtc5=0 // в значения секунд в часах реального времени записываем 0

Событие Touch Press Event кнопки b11 – «Выход».

page 0 // переходим на главное окно

Событие Touch Press Event кнопки b12 – «Переход к предыдущему полю». Кнопка невидимая. Эта кнопка на этом экране привязана к физической кнопке Up (IO4) на Expansion Board.

if(sel.val<2)//Если выбранное поле равно 1 (День)
{
  sel.val=5 // Переходим на поле 5 (Минуты)
}else //Иначе
{
  sel.val=sel.val-1 //переходим на предыдущее поле
}

Событие Touch Press Event кнопки b13 – «Перейти к следующему полю». Кнопка невидимая. Эта кнопка на этом экране привязана к физической кнопке Down (IO3) на Expansion Board.

if(sel.val>4)//Если выбранное поле - 5 (Минуты)	
{
  sel.val=1 //Переходим на поле 1 (День)
}else //Иначе
{
  sel.val=sel.val+1 //переходим на следующее поле
}

Событие Touch Press Event кнопки b14 – «Добавить 1 к значению выбранного полю». Кнопка невидимая. Эта кнопка на этом экране привязана к физической кнопке Right (IO2) на Expansion Board.

if(sel.val==1)//Если выбранно поле 1(День)
{
  click b0,1 //Имитируем нажатие на кнопке b0 (Добавить день)
}
if(sel.val==2) //Если выбранно поле 2(Месяц)
{
  click b2,1 //Имитируем нажатие на кнопке b2 (Добавить месяц)
}
if(sel.val==3)//Если выбранно поле 3(Год)
{
  click b4,1 //Имитируем нажатие на кнопке b4 (Добавить год)
}
if(sel.val==4)//Если выбранно поле 4(Часы)
{
  click b6,1 //Имитируем нажатие на кнопке b6 (Добавить час)
}
if(sel.val==5)//Если выбранно поле 5(Минуты)
{
  click b8,1 //Имитируем нажатие на кнопке b8 (Добавить минуту)
}

Событие Touch Release Event кнопки b14

if(sel.val==1) //Если выбранно поле 1(День)
{
  click b0,0 //Имитируем отпускание  кнопки b0 (Добавить день)
}
if(sel.val==2) //Если выбранно поле 2(Месяц)
{
  click b2,0 //Имитируем отпускание  кнопки b2 (Добавить месяц)
}
if(sel.val==3) //Если выбранно поле 3(Год)
{
  click b4,0 //Имитируем отпускание  кнопки b4 (Добавить год)
}
if(sel.val==4) //Если выбранно поле 4(Час)
{
  click b6,0 //Имитируем отпускание  кнопки b6 (Добавить час)
}
if(sel.val==5) //Если выбранно поле 5(Минута)
{
  click b8,0 //Имитируем отпускание  кнопки b8 (Добавить минуту)
}

Событие Touch Press Event кнопки b15 – «Отнять 1 от значения выбранного поля». Кнопка невидимая. Эта кнопка на этом экране привязана к физической кнопке Left (IO5) на Expansion Board.

if(sel.val==1) //Если выбранно поле 1(День)
{
  click b1,1 //Имитируем нажатие на кнопке b1 (Минус день)
}
if(sel.val==2) //Если выбранно поле 2(Месяц)
{
  click b3,1 //Имитируем нажатие на кнопке b3 (Минус месяц)
}
if(sel.val==3)//Если выбранно поле 3(Год)
{
  click b5,1 //Имитируем нажатие на кнопке b5 (Минус год)
}
if(sel.val==4)//Если выбранно поле 4(час)
{
  click b7,1 //Имитируем нажатие на кнопке b7 (Минус час)
}
if(sel.val==5)//Если выбранно поле 5(Минута)
{
  click b9,1//Имитируем нажатие на кнопке b9 (Минус минута)
}

Событие Touch Release Event кнопки b15

if(sel.val==1) //Если выбранно поле 1(День)
{
  click b1,0 //Имитируем отпускание  кнопки b1 (Минус день)
}
if(sel.val==2) //Если выбранно поле 2(Месяц)
{
  click b3,0 //Имитируем отпускание  кнопки b3 (Минус месяц)
}
if(sel.val==3)//Если выбранно поле 3(Год)
{
  click b5,0 //Имитируем отпускание  кнопки b5 (Минус год)
}
if(sel.val==4)//Если выбранно поле 4(Час)
{
  click b7,0 //Имитируем отпускание  кнопки b7 (Минус час)
}
if(sel.val==5) //Если выбранно поле 5(Минута)
{
  click b9,0 //Имитируем отпускание  кнопки b9 (Минус минута)
}

Ну и как в остальных окнах в этом окне установлен таймер tm0 с периодом срабатывания 200 миллисекунд. В событии Timer Event этого таймера происходит обновление значений текстовых полей.

Код под спойлером

На этом мы закончили с панелью. В принципе получилась автономная система, которая может работать без дополнительного оборудования. Но использовать срабатывания каналов мы не сможем. У нас осталось всего два свободных входа – выхода. Тут на помощь придёт ардуинка.
В версии 2.2 программы FLProg обновилась поддержка панелей Nextion HMI. Появились новые блоки для неё.

  1. Блок «Нажатие на элемент» — позволяет сымитировать нажатие и отпускание на любой элемент на экране панели.
  2. Блоки «Получить значение системной переменной» и «Установить значение системной переменной» — позволяют читать и записывать значения практически всех системных переменных панели
  3. Блок «Настройка GPIO» — пзволяет в любой момент времени произвести конфигурирование режимов работы входов/выходов панели

Ну а в данном уроке (поскольку он всё таки больше посвящён программированию самой панели) мы просто прочитаем состояние каналов таймера (переменные tsr1 — tsr5) и выведем его на светодиоды.
Схема проекта для Arduino в программе FLProg.

HMI_10

Небольшое видео работы устройства (Это всё-таки учебный проект, поэтому он собран по временной схеме)

Приложения:

  1. Проект для программы Nextion Editor (прошивка для панели)
  2. Проект для программы FLProg (прошивка для ардуино)

 

Источник: geektimes.ru