FLProg + Nextion HMI Enhanced

в 3:49, , рубрики: arduino, diy или сделай сам, flprog, nextion hmi, Блог компании FLProg, Интернет вещей, Программирование, программирование микроконтроллеров

FLProg + Nextion HMI Enhanced - 1

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

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

FLProg + Nextion HMI Enhanced - 2

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

FLProg + Nextion HMI Enhanced - 3

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

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

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

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

FLProg + Nextion HMI Enhanced - 5

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

FLProg + Nextion HMI Enhanced - 6

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

Событие 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, к виртуальным кнопкам на экране.

Подробнее о команде cfgpio - настройка физических входов - выходов панели (данная команда есть только у панелей линейки Enhanced).

Синтаксис:
cfgpio id,state,cmp
где:
id: номер входа/выхода (0-7)
state: режим работы (0-4)
cmp: имя привязываемого компонента (актуально только режиме работы 1, в остальных случаях — 0).
Обратите внимание на наличие пробелов. Обязательный пробел после команды cfgpio дальше в тексте команды пробелы не допустимы.

Возможные режима работы:

Номер режима Описание Пример
0 Вход с подтяжкой к + 5 вольтам (встроенный резистор 50 кОм). Текущее состояние можно прочитать из системной переменной pio0 – pio7 (для 0- 7 входа/выхода соответственно cfgpio 0,0,0
Вход/выход GPIO0 настраивается как вход, подтянутый к +5В. Текущее состояние можно прочитать так:
n0.val = pio0
1 Вход с подтяжкой к + 5 вольтам (встроенный резистор 50 кОм) и привязкой к виртуальному элементу. Текущее состояние прочитать из системной переменной pio0 – pio7 (для 0- 7 входа/выхода соответственно). Так же при состоянии входа в лог. 1 привязанному элементу присваивается нажатое состояние, при лог. 0 привязанному элементу присваивается отпущенное состояние. Данный режим необходимо включать в событии Preinitialilize Event окна, поскольку после инициализации страницы, привязка не происходит. cfgpio 2,1,b0
Вход/выход GPIO2 настраивается как вход, подтянутый к +5В с привязкой к виртуальной кнопке b0.
По переднему фронту на этом входе, кнопка b0 переводится в нажатое состояние, по заднему фронту – в отпущенное.
2 Двухтактный выход. Задать значение на выходе можно через системную переменную pio0 – pio7 (для 0- 7 входа/выхода соответственно). cfgpio 1,2,0
Вход/выход GPIO1 настраивается как двухтактный выход. Запись высокого выходного уровня:
pio1=1
3 Выход ШИМ. Только для 4-7 входа/выхода. Значения от 0 до 100. По умолчанию – 50. Значение задаётся с помощью системных переменных pwm4- pwm7 (для 4- 7 входа/выхода соответственно). Частота ШИМ для всех выходов задается с помощью системной переменной pwmf в герцах. Значения от 1 до 65536. По умолчанию – 1000. cfgpio 4,3,0
Вход/выход GPIO4 настраивается как выход ШИМ.
Запись значения:
pwm4=20
Задание частоты ШИМ – 2000 Гц.
pwmf=2000
4 Выход с открытым коллектором. Задать значение на выходе можно через системную переменную pio0 – pio7 (для 0- 7 входа/выхода соответственно). cfgpio 5,4,0
Вход/выход GPIO5 настраивается как двухтактный выход. Запись высокого выходного уровня:
pio5=1

Событие 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 для каждого из каналов соответственно.

Особенности в синтаксисе выражения if else

if(TempB.val==1) – пробелы нигде не допускаются.
Все открывающие и закрывающие скобки обязательно с новой строки. Никакие команды кроме скобок в этой строке не допускаются. Исключение составляет выражение
}else
Вот оно должно быть написано именно так, в одну строку и без пробелов. Осознание этого заняло у меня прилично времени, я всё время ставил пробел перед else и не мог понять, почему ругается компилятор.

Для остальных кнопок изменения состояния канала (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
}
Подробнее о команде click – имитация нажатия или отпускания элемента

Синтаксис:
click cmpID,event
где:
cmpID: имя или ID элемента.
event: событие 0 – отпускание; 1 – нажатие
Обратите внимание на наличие пробелов. Обязательный пробел после команды click дальше в тексте команды пробелы не допустимы.

Событие 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 этого таймера.

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

//Отображение текущего времени в поле CurrentTime1
//----Отображение текущего дня----
temp.val=rtc2 // Получаем значение текущего дня из системной переменной rtc2 - "день в часах реального времени"
tempText.txt="" //Во временную строковую переменную tempText кладём пустую строку
if(temp.val<10)// Если день меньше 10
{
  tempText.txt="0" // то во временную строковую переменную tempText кладём символ "0"
}
cov temp.val,TT1.txt,0 //конвертим значения дня (числовое) в строковое значение в строковую переменную TT1
CurrentTime1.txt=tempText.txt+TT1.txt //значение из переменной tempText и TT1 заносим в поле отображения CurrentTime1
//----Отображение текущего месяца----
temp.val=rtc1 // Получаем значение текущего месяца из системной переменной rtc1 - "месяц в часах реального времени"
tempText.txt="" //Во временную строковую переменную tempText кладём пустую строку
if(temp.val<10) // Если месяц меньше 10
{
  tempText.txt="0" // то во временную строковую переменную tempText кладём символ "0"
}
cov temp.val,TT1.txt,0 //конвертим значения месяца (числовое) в строковое значение в строковую переменную TT1
CurrentTime1.txt=CurrentTime1.txt+"-"+tempText.txt+TT1.txt // к тексту в поле отображения CurrentTime1 добавляем разделитель даты "-" и значения из переменных tempText и TT1
//----Отображение текущего года----
temp.val=rtc0 // Получаем значение текущего года из системной переменной rtc0 - "год в часах реального времени"
cov temp.val,TT1.txt,0 //конвертим значения года (числовое) в строковое значение в строковую переменную TT1
CurrentTime1.txt=CurrentTime1.txt+"-"+TT1.txt // к тексту в поле отображения CurrentTime1 добавляем разделитель даты "-" и значения из переменной TT1
//----Отображение текущего часа----
temp.val=rtc3 // Получаем значение текущего часа из системной переменной rtc3 - "час в часах реального времени"
tempText.txt="" //Во временную строковую переменную tempText кладём пустую строку
if(temp.val<10) // Если час меньше 10
{
  tempText.txt="0" // то во временную строковую переменную tempText кладём символ "0"
}
cov temp.val,TT1.txt,0 //конвертим значения часа (числовое) в строковое значение в строковую переменную TT1
CurrentTime1.txt=CurrentTime1.txt+" "+tempText.txt+TT1.txt  // к тексту в поле отображения CurrentTime1 добавляем разделитель даты и времени " " и значения из переменных tempText и TT1
//----Отображение текущей минуты----
temp.val=rtc4 // Получаем значение текущей минуты из системной переменной rtc4 - "минута в часах реального времени"
tempText.txt="" //Во временную строковую переменную tempText кладём пустую строку
if(temp.val<10) // Если минута меньше 10
{
  tempText.txt="0"// то во временную строковую переменную tempText кладём символ "0"
}
cov temp.val,TT1.txt,0 //конвертим значения минуты (числовое) в строковое значение в строковую переменную TT1
CurrentTime1.txt=CurrentTime1.txt+":"+tempText.txt+TT1.txt  // к тексту в поле отображения CurrentTime1 добавляем разделитель времени ":" и значения из переменных tempText и TT1
//----Отображение текущей секунды----
temp.val=rtc5 // Получаем значение текущей секунды из системной переменной rtc5 - "секунда в часах реального времени"
tempText.txt=""  //Во временную строковую переменную tempText кладём пустую строку
if(temp.val<10) // Если секунда меньше 10
{
  tempText.txt="0" // то во временную строковую переменную tempText кладём символ "0"
}
cov temp.val,TT1.txt,0 //конвертим значения секунды (числовое) в строковое значение в строковую переменную TT1
CurrentTime1.txt=CurrentTime1.txt+":"+tempText.txt+TT1.txt  // к тексту в поле отображения CurrentTime1 добавляем разделитель времени ":" и значения из переменных tempText и TT1
//Отрисовка времени срабатывания каналов и определение событий срабатывания/отключения каналов
for(i.val=0;i.val<5;i.val++)//перебор каналов. в переменной i находится номер обрабатываемого канала (счёт с нуля)
{
  temp.val=i.val*52 // определение стартового адреса в EEPROM для обрабатываемого канала
  //----Обработка дня включения----
  temp2.val=temp.val+4 //Определяем адрес в EEPROM уставки дня включения канала
  Var0txt.txt=""// в текстовую переменную  Var0txt записываем пустую строку
  repo temp1.val,temp2.val // вычитываем из EEPROM в переменную temp1.val уставку дня включения канала
  if(temp1.val==10000) // если уставка дня не учитываеся (значение 10000)
  {
    ts1.val=1 //считаем что уставка совпала с текущим днём
    tempText.txt="X" // в строковую переменную   tempText для отображения пишем символ "X"
  }else // Иначе
  {
    if(temp1.val==rtc2) //если  уставка совпала с текущим днём
    {
      ts1.val=1 //запоминаем что совпала в переменную  ts1
    }else //иначе
    {
      ts1.val=2 // запоминаем что не совпала в переменную  ts1
    }
    cov temp1.val,tempText.txt,0 //конвертим уставку дня включения канала (числовое значение) во  строковую переменную  tempText
    if(temp1.val<10)//Eсли значение уставки дня включения канала меньше 10
    {
      Var0txt.txt="0" //в текстовую переменную  Var0txt записываем символ "0"
    }
  }
  TT1.txt=Var0txt.txt+tempText.txt+"-"//в текстовую переменную TT1 записываем значения переменных Var0txt, tempText и разделитель даты "-"
  //----Обработка месяца включения----
  temp2.val=temp.val+8 //Определяем адрес в EEPROM уставки месяца включения канала
  Var0txt.txt="" // в текстовую переменную  Var0txt записываем пустую строку
  repo temp1.val,temp2.val // вычитываем из EEPROM в переменную temp1.val уставку месяца включения канала
  if(temp1.val==10000)// если уставка месяца не учитываеся (значение 10000)
  {
    ts2.val=1 //считаем что уставка совпала с текущим месяцем
    tempText.txt="X"// в строковую переменную   tempText для отображения пишем символ "X"
  }else // Иначе
  {
    if(temp1.val==rtc1)//если  уставка совпала с текущим месяцем
    {
      ts2.val=1 //запоминаем что совпала в переменную  ts2
    }else //иначе
    {
      ts2.val=2 // запоминаем что не совпала в переменную  ts2
    }
    cov temp1.val,tempText.txt,0 //конвертим уставку месяца включения канала (числовое значение) во  строковую переменную  tempText
    if(temp1.val<10) //Eсли значение уставки месяца включения канала меньше 10
    {
      Var0txt.txt="0" //в текстовую переменную  Var0txt записываем символ "0"
    }
  }
  TT1.txt=TT1.txt+Var0txt.txt+tempText.txt+"-" //К значению текстовой переменной TT1 добавляем значения переменных Var0txt, tempText и разделитель даты "-"
  //----Обработка года включения----
  temp2.val=temp.val+12 //Определяем адрес в EEPROM уставки года включения канала
  repo temp1.val,temp2.val// вычитываем из EEPROM в переменную temp1.val уставку года включения канала
  if(temp1.val==10000) // если уставка месяца не учитываеся (значение 10000)
  {
    ts3.val=1 //считаем что уставка совпала с текущим годом
    tempText.txt="X"// в строковую переменную   tempText для отображения пишем символ "X"
  }else // Иначе
  {
    if(temp1.val==rtc0) //если  уставка совпала с текущим годом
    {
      ts3.val=1 //запоминаем что совпала в переменную  ts3
    }else //иначе
    {
      ts3.val=0 // запоминаем что не совпала в переменную  ts3
    }
    cov temp1.val,tempText.txt,0 //конвертим уставку года включения канала (числовое значение) во  строковую переменную  tempText
  }
  TT1.txt=TT1.txt+tempText.txt+" " //К значению текстовой переменной TT1 добавляем значения переменной  tempText и разделитель даты и времени " "
  //----Обработка часа включения----
  temp2.val=temp.val+16 //Определяем адрес в EEPROM уставки часа включения канала
  Var0txt.txt=""  // в текстовую переменную  Var0txt записываем пустую строку
  repo temp1.val,temp2.val // вычитываем из EEPROM в переменную temp1.val уставку часа включения канала
  if(temp1.val==10000)// если уставка часа не учитываеся (значение 10000)
  {
    ts4.val=1 //считаем что уставка совпала с текущим часом
    tempText.txt="X" // в строковую переменную   tempText для отображения пишем символ "X"
  }else // Иначе
  {
    if(temp1.val==rtc3) //если  уставка совпала с текущим часом
    {
      ts4.val=1 //запоминаем что совпала в переменную  ts4
    }else //иначе
    {
      ts4.val=0  // запоминаем что не совпала в переменную  ts4
    }
    cov temp1.val,tempText.txt,0 //конвертим уставку часа включения канала (числовое значение) во  строковую переменную  tempText
    if(temp1.val<10) //Eсли значение уставки часа включения канала меньше 10
    {
      Var0txt.txt="0" //в текстовую переменную  Var0txt записываем символ "0"
    }
  }
  TT1.txt=TT1.txt+Var0txt.txt+tempText.txt+":" //К значению текстовой переменной TT1 добавляем значения переменных Var0txt, tempText и разделитель времени ":"
  //----Обработка минуты включения----
  temp2.val=temp.val+20 //Определяем адрес в EEPROM уставки минуты включения канала
  Var0txt.txt="" // в текстовую переменную  Var0txt записываем пустую строку
  repo temp1.val,temp2.val // вычитываем из EEPROM в переменную temp1.val уставку минуты включения канала
  if(temp1.val==10000)// если уставка минуты не учитываеся (значение 10000)
  {
    ts5.val=1 //считаем что уставка совпала с текущей минутой
    tempText.txt="X" // в строковую переменную   tempText для отображения пишем символ "X"
  }else // Иначе
  {
    if(temp1.val==rtc4) //если  уставка совпала с текущей минутой
    {
      ts5.val=1//запоминаем что совпала в переменную  ts5
    }else //иначе
    {
      ts5.val=0 // запоминаем что не совпала в переменную  ts5
    }
    cov temp1.val,tempText.txt,0 //конвертим уставку минуты включения канала (числовое значение) во  строковую переменную  tempText
    if(temp1.val<10) //Eсли значение уставки минуты включения канала меньше 10
    {
      Var0txt.txt="0"//в текстовую переменную  Var0txt записываем символ "0"
    }
  }
  TT1.txt=TT1.txt+Var0txt.txt+tempText.txt+":"//К значению текстовой переменной TT1 добавляем значения переменных Var0txt, tempText и разделитель времени ":"
  //----Обработка секунды включения----
  temp2.val=temp.val+24 //Определяем адрес в EEPROM уставки секунды включения канала
  Var0txt.txt="" // в текстовую переменную  Var0txt записываем пустую строку
  repo temp1.val,temp2.val // вычитываем из EEPROM в переменную temp1.val уставку секунды включения канала
  if(temp1.val==10000) // если уставка секунды не учитываеся (значение 10000)
  {
    ts6.val=1 //считаем что уставка совпала с текущей секундой
    tempText.txt="X" // в строковую переменную   tempText для отображения пишем символ "X"
  }else // Иначе
  {
    if(temp1.val==rtc5) //если  уставка совпала с текущей секундой
    {
      ts6.val=1 //запоминаем что совпала в переменную  ts6
    }else //иначе
    {
      ts6.val=0 // запоминаем что не совпала в переменную  ts6
    }
    cov temp1.val,tempText.txt,0 //конвертим уставку секунды включения канала (числовое значение) во  строковую переменную  tempText
    if(temp1.val<10) //Eсли значение уставки секунды включения канала меньше 10
    {
      Var0txt.txt="0" //в текстовую переменную  Var0txt записываем символ "0"
    }
  }
  TT1.txt=TT1.txt+Var0txt.txt+tempText.txt+" / " //К значению текстовой переменной TT1 добавляем значения переменных Var0txt, tempText и разделитель уставки включения и выключения "/"
  //----Обработка дня отключения----
  temp2.val=temp.val+28 //Определяем адрес в EEPROM уставки дня отключения  канала
  Var0txt.txt=""  // в текстовую переменную  Var0txt записываем пустую строку
  repo temp1.val,temp2.val // вычитываем из EEPROM в переменную temp1.val уставку дня отключения канала
  if(temp1.val==10000) // если уставка дня не учитываеся (значение 10000)
  {
    ts7.val=1 //считаем что уставка совпала с текущим днём
    tempText.txt="X" // в строковую переменную   tempText для отображения пишем символ "X"
  }else // Иначе
  {
    if(temp1.val==rtc2) //если  уставка совпала с текущим днём
    {
      ts7.val=1  //запоминаем что совпала в переменную  ts7
    }else //иначе
    {
      ts7.val=0 // запоминаем что не совпала в переменную  ts7
    }
    cov temp1.val,tempText.txt,0 //конвертим уставку дня выключения канала (числовое значение) во  строковую переменную  tempText
    if(temp1.val<10)//Eсли значение уставки дня выключения канала меньше 10
    {
      Var0txt.txt="0"//в текстовую переменную  Var0txt записываем символ "0"
    }
  }
  TT1.txt=TT1.txt+Var0txt.txt+tempText.txt+"-" //К значению текстовой переменной TT1 добавляем значения переменных Var0txt, tempText и разделитель даты "-"
  //----Обработка месяца отключения----
  temp2.val=temp.val+32 //Определяем адрес в EEPROM уставки дня отключения  канала
  Var0txt.txt="" // в текстовую переменную  Var0txt записываем пустую строку
  repo temp1.val,temp2.val// вычитываем из EEPROM в переменную temp1.val уставку месяца отключения канала
  if(temp1.val==10000)// если уставка месяца не учитываеся (значение 10000)
  {
    ts8.val=1//считаем что уставка совпала с текущим месяцем
    tempText.txt="X" // в строковую переменную   tempText для отображения пишем символ "X"
  }else // Иначе
  {
    if(temp1.val==rtc1) //если  уставка совпала с текущим месяцем
    {
      ts8.val=1 //запоминаем что совпала в переменную  ts8
    }else //иначе
    {
      ts8.val=0 // запоминаем что не совпала в переменную  ts8
    }
    cov temp1.val,tempText.txt,0 //конвертим уставку месяца выключения канала (числовое значение) во  строковую переменную  tempText
    if(temp1.val<10) //Eсли значение уставки месяца выключения канала меньше 10
    {
      Var0txt.txt="0"//в текстовую переменную  Var0txt записываем символ "0"
    }
  }
  TT1.txt=TT1.txt+Var0txt.txt+tempText.txt+"-"//К значению текстовой переменной TT1 добавляем значения переменных Var0txt, tempText и разделитель даты "-"
  //----Обработка года отключения----
  temp2.val=temp.val+36 //Определяем адрес в EEPROM уставки дня отключения  канала
  repo temp1.val,temp2.val // вычитываем из EEPROM в переменную temp1.val уставку года отключения канала
  if(temp1.val==10000)// если уставка года не учитываеся (значение 10000)
  {
    ts9.val=1 //считаем что уставка совпала с текущим месяцем
    tempText.txt="X" // в строковую переменную   tempText для отображения пишем символ "X"
  }else // Иначе
  {
    if(temp1.val==rtc0) //если  уставка совпала с текущим годом
    {
      ts9.val=1 //запоминаем что совпала в переменную  ts9
    }else //иначе
    {
      ts9.val=0 // запоминаем что не совпала в переменную  ts9
    }
    cov temp1.val,tempText.txt,0 //конвертим уставку года выключения канала (числовое значение) во  строковую переменную  tempText
  }
  TT1.txt=TT1.txt+Var0txt.txt+tempText.txt+" " //К значению текстовой переменной TT1 добавляем значения переменной tempText и разделитель даты и времени " "
  //----Обработка часа отключения----
  temp2.val=temp.val+40 //Определяем адрес в EEPROM уставки часа отключения  канала
  Var0txt.txt="" // в текстовую переменную  Var0txt записываем пустую строку
  repo temp1.val,temp2.val // вычитываем из EEPROM в переменную temp1.val уставку часа отключения канала
  if(temp1.val==10000) // если уставка часа не учитываеся (значение 10000)
  {
    ts10.val=1//считаем что уставка совпала с текущим часом
    tempText.txt="X" // в строковую переменную   tempText для отображения пишем символ "X"
  }else // Иначе
  {
    if(temp1.val==rtc3)  //если  уставка совпала с текущим часом
    {
      ts10.val=1 //запоминаем что совпала в переменную  ts10
    }else  //иначе
    {
      ts10.val=0 // запоминаем что не совпала в переменную  ts10
    }
    cov temp1.val,tempText.txt,0  //конвертим уставку часа выключения канала (числовое значение) во  строковую переменную  tempText
    if(temp1.val<10) //Eсли значение уставки часа выключения канала меньше 10
    {
      Var0txt.txt="0" //в текстовую переменную  Var0txt записываем символ "0"
    }
  }
  TT1.txt=TT1.txt+Var0txt.txt+tempText.txt+":"//К значению текстовой переменной TT1 добавляем значения переменных Var0txt, tempText и разделитель времени ":"
 //----Обработка минуты отключения----
  temp2.val=temp.val+44 //Определяем адрес в EEPROM уставки минуты отключения  канала
  Var0txt.txt="" // в текстовую переменную  Var0txt записываем пустую строку
  repo temp1.val,temp2.val  // вычитываем из EEPROM в переменную temp1.val уставку минуты отключения канала
  if(temp1.val==10000)  // если уставка минуты не учитываеся (значение 10000)
  {
    ts11.val=1 //считаем что уставка совпала с текущей минутой
    tempText.txt="X" // в строковую переменную   tempText для отображения пишем символ "X"
  }else // Иначе
  {
    if(temp1.val==rtc4) //если  уставка совпала с текущей минутой
    {
      ts11.val=1  //запоминаем что совпала в переменную  ts11
    }else //иначе
    {
      ts11.val=0 // запоминаем что не совпала в переменную  ts11
    }
    cov temp1.val,tempText.txt,0 //конвертим уставку минуты выключения канала (числовое значение) во  строковую переменную  tempText
    if(temp1.val<10) //Eсли значение уставки минуты выключения канала меньше 10
    {
      Var0txt.txt="0"//в текстовую переменную  Var0txt записываем символ "0"
    }
  }
  TT1.txt=TT1.txt+Var0txt.txt+tempText.txt+":" //К значению текстовой переменной TT1 добавляем значения переменных Var0txt, tempText и разделитель времени ":"
  //----Обработка секунды отключения----
  temp2.val=temp.val+48 //Определяем адрес в EEPROM уставки секунды отключения  канала
  Var0txt.txt="" // в текстовую переменную  Var0txt записываем пустую строку
  repo temp1.val,temp2.val // вычитываем из EEPROM в переменную temp1.val уставку секунды отключения канала
  if(temp1.val==10000)  // если уставка секунды не учитываеся (значение 10000)
  {
    ts12.val=1 //считаем что уставка совпала с текущей секундой
    tempText.txt="X" // в строковую переменную   tempText для отображения пишем символ "X"
  }else // Иначе
  {
    if(temp1.val==rtc5) //если  уставка совпала с текущей минутой
    {
      ts12.val=1 //запоминаем что совпала в переменную  ts12
    }else //иначе
    {
      ts12.val=0 // запоминаем что не совпала в переменную  ts12
    }
    cov temp1.val,tempText.txt,0 //конвертим уставку секунды выключения канала (числовое значение) во  строковую переменную  tempText
    if(temp1.val<10)  //Eсли значение уставки секунды выключения канала меньше 10
    {
      Var0txt.txt="0" //в текстовую переменную  Var0txt записываем символ "0"
    }
  }
  TT1.txt=TT1.txt+Var0txt.txt+tempText.txt //К значению текстовой переменной TT1 добавляем значения переменных Var0txt, tempText
  //----Определение события включения----
  repo temp1.val,temp.val // вычитываем из EEPROM в переменную temp1.val состояние активности канала
  tsrOn.val=0 //в переменную tsrOn (произошло событие включения) записываем 0 (нет события)
  if(temp1.val==1)// Если канал активен
  {
    if(ts1.val==1)// и если совпал день включения
    {
      if(ts2.val==1)// и если совпал месяц включения
      {
        if(ts3.val==1)// и если совпал год включения
        {
          if(ts4.val==1)// и если совпал час включения
          {
            if(ts5.val==1)// и если совпала минута включения
            {
              if(ts6.val==1)// и если совпала секунда включения
              {
                tsrOn.val=1//в переменную tsrOn (произошло событие включения) записываем 1 (естьсобытие включения)
              }
            }
          }
        }
      }
    }
  }
  //----Определение события выключения----
  tsrOf.val=0 //в переменную tsrOf (произошло событие выключения) записываем 0 (нет события)
  if(temp1.val==1)// Если канал активен
  {
    if(ts7.val==1)// и если совпал день выключения
    {
      if(ts8.val==1)// и если совпал месяц выключения
      {
        if(ts9.val==1)// и если совпал год выключения
        {
          if(ts10.val==1)// и если совпал час выключения
          {
            if(ts11.val==1)// и если совпала минута выключения
            {
              if(ts12.val==1)// и если совпала секунда выключения
              {
                tsrOf.val=1//в переменную tsrOf (произошло событие выключения) записываем 1 (есть событие отключения)
              }
            }
          }
        }
      }
    }
  }else//Иначе
  {
    tsrOf.val=1//в переменную tsrOf (произошло событие выключения) записываем 1 (есть событие отключения)
  }
  //----Обработка событий для канала 1----
  if(i.val==0)// если обрабатывается канал 1
  {
    if(tsr1.val==1)//если текущее состояние канала - включён (состояние канала 1 - переменная tsr1)
    {
      if(tsrOf.val==1)// и если произошло событие отключения
      {
        tsr1.val=2 //переводим канал в отключённое состояние 
      }
    }else //Иначе (если состояние канала отключенное )
    {
      if(tsrOn.val==1) // и если произошло событие включения
      {
        tsr1.val=1  //переводим канал во включенное состояние состояние 
      }
    }
    if(tsr1.val==1)//если текущее состояние канала - включён (состояние канала 1 - переменная tsr1)
    {
      TimerText1.pco=63488// тектовому полю  TimerText1 задаём цвет текста - красный 
    }else //иначе
    {
      if(temp1.val==1) // если канал активен
      {
        TimerText1.pco=65504 // тектовому полю  TimerText1 задаём цвет текста - жёлтый
      }else // иначе(если канал не активен)
      {
        TimerText1.pco=50712 // тектовому полю  TimerText1 задаём цвет текста - серый
      }
    }
    TimerText1.txt=TT1.txt //в текстовое поле TimerText1 в качестве текста задаем значение текстовой переменной TT1
  }
   //----Обработка событий для канала 2----
  if(i.val==1) // если обрабатывается канал 2
  {
    if(tsr2.val==1)//если текущее состояние канала - включён (состояние канала 2 - переменная tsr2)
    {
      if(tsrOf.val==1)// и если произошло событие отключения
      {
        tsr2.val=2 //переводим канал в отключённое состояние 
      }
    }else //Иначе (если состояние канала отключенное )
    {
      if(tsrOn.val==1)// и если произошло событие включения
      {
        tsr2.val=1 //переводим канал во включенное состояние состояние 
      }
    }
    if(tsr2.val==1)//если текущее состояние канала - включён (состояние канала 2 - переменная tsr2)
    {
      TimerText2.pco=63488// тектовому полю  TimerText2 задаём цвет текста - красный 
    }else //иначе
    {
      if(temp1.val==1) // если канал активен
      {
        TimerText2.pco=65504 // тектовому полю  TimerText2 задаём цвет текста - жёлтый
      }else  // иначе(если канал не активен)
      {
        TimerText2.pco=50712 // тектовому полю  TimerText2 задаём цвет текста - серый
      }
    }
    TimerText2.txt=TT1.txt //в текстовое поле TimerText2 в качестве текста задаем значение текстовой переменной TT1
  }
  //----Обработка событий для канала 3----
  if(i.val==2) // если обрабатывается канал 3
  {
    if(tsr3.val==1)//если текущее состояние канала - включён (состояние канала 3 - переменная tsr3)
    {
      if(tsrOf.val==1)// и если произошло событие отключения
      {
        tsr3.val=2  //переводим канал в отключённое состояние 
      }
    }else //Иначе (если состояние канала отключенное )
    {
      if(tsrOn.val==1)// и если произошло событие включения
      {
        tsr3.val=1 //переводим канал во включенное состояние состояние 
      }
    }
    if(tsr3.val==1)//если текущее состояние канала - включён (состояние канала 3 - переменная tsr3)
    {
      TimerText3.pco=63488 // тектовому полю  TimerText3 задаём цвет текста - красный 
    }else //иначе
    {
      if(temp1.val==1) // если канал активен
      {
        TimerText3.pco=65504  // тектовому полю  TimerText3 задаём цвет текста - жёлтый
      }else // иначе(если канал не активен)
      {
        TimerText3.pco=50712// тектовому полю  TimerText3 задаём цвет текста - серый
      }
    }
    TimerText3.txt=TT1.txt //в текстовое поле TimerText3 в качестве текста задаем значение текстовой переменной TT1
  }
  //----Обработка событий для канала 4----
  if(i.val==3) // если обрабатывается канал 4
  {
    if(tsr4.val==1)//если текущее состояние канала - включён (состояние канала 4 - переменная tsr4)
    {
      if(tsrOf.val==1)// и если произошло событие отключения
      {
        tsr4.val=2//переводим канал в отключённое состояние 
      }
    }else //Иначе (если состояние канала отключенное )
    {
      if(tsrOn.val==1)// и если произошло событие включения
      {
        tsr4.val=1//переводим канал во включенное состояние состояние 
      }
    }
    if(tsr4.val==1)//если текущее состояние канала - включён (состояние канала 4 - переменная tsr4)
    {
      TimerText4.pco=63488 // тектовому полю  TimerText4 задаём цвет текста - красный 
    }else//иначе
    {
      if(temp1.val==1)// если канал активен
      {
        TimerText4.pco=65504 // тектовому полю  TimerText4 задаём цвет текста - жёлтый
      }else // иначе(если канал не активен)
      {
        TimerText4.pco=50712// тектовому полю  TimerText4 задаём цвет текста - серый
      }
    }
    TimerText4.txt=TT1.txt //в текстовое поле TimerText4 в качестве текста задаем значение текстовой переменной TT1
  }
  //----Обработка событий для канала 5----
  if(i.val==4) // если обрабатывается канал 5
  {
    if(tsr5.val==1)//если текущее состояние канала - включён (состояние канала 5 - переменная tsr5)
    {
      if(tsrOf.val==1)// и если произошло событие отключения
      {
        tsr5.val=2//переводим канал в отключённое состояние 
      }
    }else //Иначе (если состояние канала отключенное )
    {
      if(tsrOn.val==1)// и если произошло событие включения
      {
        tsr5.val=1 //переводим канал во включенное состояние состояние 
      }
    }
    if(tsr5.val==1)//если текущее состояние канала - включён (состояние канала 5 - переменная tsr5)
    {
      TimerText5.pco=63488 // тектовому полю  TimerText5 задаём цвет текста - красный 
    }else //иначе
    {
      if(temp1.val==1)// если канал активен
      {
        TimerText5.pco=65504 // тектовому полю  TimerText5 задаём цвет текста - жёлтый
      }else // иначе(если канал не активен)
      {
        TimerText5.pco=50712 // тектовому полю  TimerText5 задаём цвет текста - серый
      }
    }
    TimerText5.txt=TT1.txt //в текстовое поле TimerText5 в качестве текста задаем значение текстовой переменной TT1
  }
}
//Отрисовка значка выбранного канала
if(SelTim.val==1) //если выбран канал 1 (переменная SelTim)
{
  b1.txt="+" // на кнопке переключения состояния канала 1 (b1) рисуем "+"
}else //иначе
{
  b1.txt="" // на кнопке переключения состояния канала 1 (b1) стираем "+"
}
if(SelTim.val==2) //если выбран канал 2 (переменная SelTim)
{
  b2.txt="+" // на кнопке переключения состояния канала 2 (b2) рисуем "+"
}else//иначе
{
  b2.txt="" // на кнопке переключения состояния канала 2 (b2) стираем "+"
}
if(SelTim.val==3)//если выбран канал 3 (переменная SelTim)
{
  b3.txt="+" // на кнопке переключения состояния канала 3 (b3) рисуем "+"
}else//иначе
{
  b3.txt="" // на кнопке переключения состояния канала 3 (b3) стираем "+"
}
if(SelTim.val==4)//если выбран канал 4 (переменная SelTim)
{
  b4.txt="+" // на кнопке переключения состояния канала 4 (b4) рисуем "+"
}else//иначе
{
  b4.txt="" // на кнопке переключения состояния канала 4 (b4) стираем "+"
}
if(SelTim.val==5)//если выбран канал 5 (переменная SelTim)
{
  b5.txt="+" // на кнопке переключения состояния канала 5 (b5) рисуем "+"
}else//иначе
{
  b5.txt="" // на кнопке переключения состояния канала 5 (b5) стираем "+"
}

Особенности в синтаксисе выражения for

for(n0.val=0; n0.val<100; n0.val++) — пробелы нигде не допускаются.
Все открывающие и закрывающие скобки обязательно с новой строки. Никакие команды кроме скобок в этой строке не допускаются.

Подробнее о команде cov – конвертация между строковыми и числовыми данными.

Синтаксис:
cov att1,att2,lenth
где:
att1: исходное значение
att2: целевое значение
lenth: длинна строки ( 0 – авто определение)
Пример:
cov number.val,text.txt,0
Значение числовой переменной number будет преобразовано в строку и занесено в значение строковой переменной text.
cov text.txt,number.val,5
Обратное преобразование первых пяти символов из строковой переменной text.
Обратите внимание на наличие пробелов. Обязательный пробел после команды cov дальше в тексте команды пробелы не допустимы.

Рассмотрим расположение данных в 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)

FLProg + Nextion HMI Enhanced - 7

Событие 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

Подробнее о командах wepo – запись в EEPROM и repo – чтение из EEPROM (данные команды есть только у панелей линейки Enhanced).

wepo
Синтаксис:
wepo att,add
где:
att: Значение
add: Адрес в EEPROM
Пример:
wepo number.val,10
Запись значения числовой переменной number в EEPROM начиная с байта 10. Адреса байтов в EEPROM начинаются с 0.
Обратите внимание на наличие пробелов. Обязательный пробел после команды wepo дальше в тексте команды пробелы не допустимы.

repo
Синтаксис:
repo att,add
где:
att: Куда читать
add: Адрес в EEPROM
Пример:
repo number.val,10
В значение числовой переменной number запишется прочитанное из EEPROM значение, начиная с байта 10. При чтении числового значения, прочитается 4 байта, начиная с заданного адреса. При чтении текстового значения – количество байт равное значению параметра txt_maxl элемента указанного как att +1 начиная с заданного адреса
Обратите внимание на наличие пробелов. Обязательный пробел после команды repo дальше в тексте команды пробелы не допустимы.

Событие 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 этого таймера происходит обновление значений полей уставок.

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


//Отрисовка поля 1 - (День уставки включения)
temp1.val=StAddr.val+4 //Oпределяем адрес в EEPROM для значения поля
repo temp.val,temp1.val // В переменную temp вычитываем из EEPROM значение для поля
cov temp.val,tempStr.txt,0 // преобразуем числовое значение из переменной temp в строчное значчение в переменную tempStr
if(temp.val<10)// Если значение поля меньше 10 
{
  tempStr1.txt="0"+tempStr.txt // то в строчную переменную tempStr1 заносим строчное значение поля (переменная tempStr) добавив перед ним символ "0"
}else // Иначе
{
  tempStr1.txt=tempStr.txt // в строчную переменную tempStr1 заносим только строчное значение поля (переменная tempStr)
}
if(temp.val==10000) //Если значение поля не учитываеся при обработке событий (значение = 10000)
{
  if(sys1==1)// и если выбранно поле 1
  {
    vis BYP,0 //скрываем кнопку "Добавить еденицу"
    vis BYM,0 // скрываем кнопку  "Отнять еденицу"
  }
  StartD.txt="X"// В поле отображаем символ "Х"
}else //Иначе (значение поля  учитываеся при обработке событий (значение не равно 10000))
{
  if(sys1==1) // и если выбранно поле 1
  {
    vis BYP,1 //показываем кнопку "Добавить еденицу"
    vis BYM,1 //показываем кнопку  "Отнять еденицу"
  }
  StartD.txt=tempStr1.txt // В поле отображаем значение поля из переменной tempStr1
}
//Отрисовка поля 2 - (Месяц уставки включения)
temp1.val=StAddr.val+8 //Oпределяем адрес в EEPROM для значения поля
repo temp.val,temp1.val // В переменную temp вычитываем из EEPROM значение для поля
cov temp.val,tempStr.txt,0 // преобразуем числовое значение из переменной temp в строчное значчение в переменную tempStr
if(temp.val<10)// Если значение поля меньше 10 
{
  tempStr1.txt="0"+tempStr.txt // то в строчную переменную tempStr1 заносим строчное значение поля (переменная tempStr) добавив перед ним символ "0"
}else // Иначе
{
  tempStr1.txt=tempStr.txt // в строчную переменную tempStr1 заносим только строчное значение поля (переменная tempStr)
}
if(temp.val==10000) //Если значение поля не учитываеся при обработке событий (значение = 10000)
{
  if(sys1==2) // и если выбранно поле 2
  {
    vis BYP,0//скрываем кнопку "Добавить еденицу"
    vis BYM,0 // скрываем кнопку  "Отнять еденицу"
  }
  StartMo.txt="X" // В поле отображаем символ "Х"
}else //Иначе (значение поля  учитываеся при обработке событий (значение не равно 10000))
{
  if(sys1==2)  // и если выбранно поле 2
  {
    vis BYP,1  //показываем кнопку "Добавить еденицу"
    vis BYM,1 //показываем кнопку  "Отнять еденицу"
  }
  StartMo.txt=tempStr1.txt // В поле отображаем значение поля из переменной tempStr1
}
//Отрисовка поля 3 - (Год уставки включения)
temp1.val=StAddr.val+12 //Oпределяем адрес в EEPROM для значения поля
repo temp.val,temp1.val // В переменную temp вычитываем из EEPROM значение для поля
cov temp.val,tempStr.txt,0 // преобразуем числовое значение из переменной temp в строчное значчение в переменную tempStr
if(temp.val<10) // Если значение поля меньше 10 
{
  tempStr1.txt="0"+tempStr.txt // то в строчную переменную tempStr1 заносим строчное значение поля (переменная tempStr) добавив перед ним символ "0"
}else // Иначе
{
  tempStr1.txt=tempStr.txt // в строчную переменную tempStr1 заносим только строчное значение поля (переменная tempStr)
}
if(temp.val==10000) //Если значение поля не учитываеся при обработке событий (значение = 10000)
{
  if(sys1==3) // и если выбранно поле 3
  {
    vis BYP,0 //скрываем кнопку "Добавить еденицу"
    vis BYM,0 // скрываем кнопку  "Отнять еденицу"
  }
  StartY.txt="X" // В поле отображаем символ "Х"
}else  //Иначе (значение поля  учитываеся при обработке событий (значение не равно 10000))
{
  if(sys1==3)  // и если выбранно поле 3
  {
    vis BYP,1  //показываем кнопку "Добавить еденицу"
    vis BYM,1 //показываем кнопку  "Отнять еденицу"
  }
  StartY.txt=tempStr1.txt // В поле отображаем значение поля из переменной tempStr1
}
//Отрисовка поля 4 - (Час уставки включения)
temp1.val=StAddr.val+16 //Oпределяем адрес в EEPROM для значения поля
repo temp.val,temp1.val // В переменную temp вычитываем из EEPROM значение для поля
cov temp.val,tempStr.txt,0 // преобразуем числовое значение из переменной temp в строчное значчение в переменную tempStr
if(temp.val<10) // Если значение поля меньше 10 
{
  tempStr1.txt="0"+tempStr.txt // то в строчную переменную tempStr1 заносим строчное значение поля (переменная tempStr) добавив перед ним символ "0"
}else // Иначе
{
  tempStr1.txt=tempStr.txt // в строчную переменную tempStr1 заносим только строчное значение поля (переменная tempStr)
}
if(temp.val==10000) //Если значение поля не учитываеся при обработке событий (значение = 10000)
{
  if(sys1==4)  // и если выбранно поле 4
  {
    vis BYP,0 //скрываем кнопку "Добавить еденицу"
    vis BYM,0  // скрываем кнопку  "Отнять еденицу"
  }
  StartH.txt="X" // В поле отображаем символ "Х"
}else  //Иначе (значение поля  учитываеся при обработке событий (значение не равно 10000))
{
  if(sys1==4) // и если выбранно поле 3
  {
    vis BYP,1  //показываем кнопку "Добавить еденицу"
    vis BYM,1 //показываем кнопку  "Отнять еденицу"
  }
  StartH.txt=tempStr1.txt  // В поле отображаем значение поля из переменной tempStr1
}
//Отрисовка поля 5 - (Минута уставки включения)
temp1.val=StAddr.val+20 //Oпределяем адрес в EEPROM для значения поля
repo temp.val,temp1.val // В переменную temp вычитываем из EEPROM значение для поля
cov temp.val,tempStr.txt,0 // преобразуем числовое значение из переменной temp в строчное значчение в переменную tempStr
if(temp.val<10)  // Если значение поля меньше 10 
{
  tempStr1.txt="0"+tempStr.txt // то в строчную переменную tempStr1 заносим строчное значение поля (переменная tempStr) добавив перед ним символ "0"
}else  // Иначе
{
  tempStr1.txt=tempStr.txt // в строчную переменную tempStr1 заносим только строчное значение поля (переменная tempStr)
}
if(temp.val==10000) //Если значение поля не учитываеся при обработке событий (значение = 10000)
{
  if(sys1==5) // и если выбранно поле 5
  {
    vis BYP,0 //скрываем кнопку "Добавить еденицу"
    vis BYM,0  // скрываем кнопку  "Отнять еденицу"
  }
  StartMi.txt="X" // В поле отображаем символ "Х"
}else  //Иначе (значение поля  учитываеся при обработке событий (значение не равно 10000))
{
  if(sys1==5)  // и если выбранно поле 5
  {
    vis BYP,1  //показываем кнопку "Добавить еденицу"
    vis BYM,1 //показываем кнопку  "Отнять еденицу"
  }
  StartMi.txt=tempStr1.txt // В поле отображаем значение поля из переменной tempStr1
}
//Отрисовка поля 6 - (Секунда уставки включения)
temp1.val=StAddr.val+24 //Oпределяем адрес в EEPROM для значения поля
repo temp.val,temp1.val // В переменную temp вычитываем из EEPROM значение для поля
cov temp.val,tempStr.txt,0 // преобразуем числовое значение из переменной temp в строчное значчение в переменную tempStr
if(temp.val<10) // Если значение поля меньше 10
{
  tempStr1.txt="0"+tempStr.txt // то в строчную переменную tempStr1 заносим строчное значение поля (переменная tempStr) добавив перед ним символ "0"
}else  // Иначе
{
  tempStr1.txt=tempStr.txt // в строчную переменную tempStr1 заносим только строчное значение поля (переменная tempStr)
}
if(temp.val==10000) //Если значение поля не учитываеся при обработке событий (значение = 10000)
{
  if(sys1==6) // и если выбранно поле 6
  {
    vis BYP,0 //скрываем кнопку "Добавить еденицу"
    vis BYM,0 // скрываем кнопку  "Отнять еденицу"
  }
  StartS.txt="X" // В поле отображаем символ "Х"
}else//Иначе (значение поля  учитываеся при обработке событий (значение не равно 10000))
{
  if(sys1==6)  // и если выбранно поле 6
  {
    vis BYP,1  //показываем кнопку "Добавить еденицу"
    vis BYM,1 //показываем кнопку  "Отнять еденицу"
  }
  StartS.txt=tempStr1.txt // В поле отображаем значение поля из переменной tempStr1
}
//Отрисовка поля 7 - (День уставки выключения)
temp1.val=StAddr.val+28//Oпределяем адрес в EEPROM для значения поля
repo temp.val,temp1.val // В переменную temp вычитываем из EEPROM значение для поля
cov temp.val,tempStr.txt,0 // преобразуем числовое значение из переменной temp в строчное значчение в переменную tempStr
if(temp.val<10) // Если значение поля меньше 10
{
  tempStr1.txt="0"+tempStr.txt  // то в строчную переменную tempStr1 заносим строчное значение поля (переменная tempStr) добавив перед ним символ "0"
}else // Иначе
{
  tempStr1.txt=tempStr.txt // в строчную переменную tempStr1 заносим только строчное значение поля (переменная tempStr)
}
if(temp.val==10000) //Если значение поля не учитываеся при обработке событий (значение = 10000)
{
  if(sys1==7) // и если выбранно поле 7
  {
    vis BYP,0 //скрываем кнопку "Добавить еденицу"
    vis BYM,0 // скрываем кнопку  "Отнять еденицу"
  }
  StopD.txt="X" // В поле отображаем символ "Х"
}else //Иначе (значение поля  учитываеся при обработке событий (значение не равно 10000))
{
  if(sys1==7) // и если выбранно поле 7
  {
    vis BYP,1  //показываем кнопку "Добавить еденицу"
    vis BYM,1 //показываем кнопку  "Отнять еденицу"
  }
  StopD.txt=tempStr1.txt // В поле отображаем значение поля из переменной tempStr1
}
//Отрисовка поля 8 - (Месяц уставки выключения)
temp1.val=StAddr.val+32 //Oпределяем адрес в EEPROM для значения поля
repo temp.val,temp1.val // В переменную temp вычитываем из EEPROM значение для поля
cov temp.val,tempStr.txt,0 // преобразуем числовое значение из переменной temp в строчное значчение в переменную tempStr
if(temp.val<10)  // Если значение поля меньше 10
{
  tempStr1.txt="0"+tempStr.txt // то в строчную переменную tempStr1 заносим строчное значение поля (переменная tempStr) добавив перед ним символ "0"
}else // Иначе
{
  tempStr1.txt=tempStr.txt // в строчную переменную tempStr1 заносим только строчное значение поля (переменная tempStr)
}
if(temp.val==10000) //Если значение поля не учитываеся при обработке событий (значение = 10000)
{
  if(sys1==8) // и если выбранно поле 8
  {
    vis BYP,0 //скрываем кнопку "Добавить еденицу"
    vis BYM,0  // скрываем кнопку  "Отнять еденицу"
  }
  StopMo.txt="X"  // В поле отображаем символ "Х"
}else //Иначе (значение поля  учитываеся при обработке событий (значение не равно 10000))
{
  if(sys1==8) // и если выбранно поле 8
  {
    vis BYP,1  //показываем кнопку "Добавить еденицу"
    vis BYM,1 //показываем кнопку  "Отнять еденицу"
  }
  StopMo.txt=tempStr1.txt // В поле отображаем значение поля из переменной tempStr1
}
//Отрисовка поля 9 - (Год уставки выключения)
temp1.val=StAddr.val+36 //Oпределяем адрес в EEPROM для значения поля
repo temp.val,temp1.val // В переменную temp вычитываем из EEPROM значение для поля
cov temp.val,tempStr.txt,0 // преобразуем числовое значение из переменной temp в строчное значчение в переменную tempStr
if(temp.val<10) // Если значение поля меньше 10
{
  tempStr1.txt="0"+tempStr.txt // то в строчную переменную tempStr1 заносим строчное значение поля (переменная tempStr) добавив перед ним символ "0"
}else // Иначе
{
  tempStr1.txt=tempStr.txt // в строчную переменную tempStr1 заносим только строчное значение поля (переменная tempStr)
}
if(temp.val==10000) //Если значение поля не учитываеся при обработке событий (значение = 10000)
{
  if(sys1==9) // и если выбранно поле 9
  {
    vis BYP,0  //скрываем кнопку "Добавить еденицу"
    vis BYM,0 // скрываем кнопку  "Отнять еденицу"
  }
  StopY.txt="X" // В поле отображаем символ "Х"
}else //Иначе (значение поля  учитываеся при обработке событий (значение не равно 10000))
{
  if(sys1==9) // и если выбранно поле 9
  { 
    vis BYP,1 //показываем кнопку "Добавить еденицу"
    vis BYM,1 //показываем кнопку  "Отнять еденицу"
  }
  StopY.txt=tempStr1.txt // В поле отображаем значение поля из переменной tempStr1
}
//Отрисовка поля 10 - (Час уставки выключения)
temp1.val=StAddr.val+40 //Oпределяем адрес в EEPROM для значения поля
repo temp.val,temp1.val  // В переменную temp вычитываем из EEPROM значение для поля
cov temp.val,tempStr.txt,0 // преобразуем числовое значение из переменной temp в строчное значчение в переменную tempStr
if(temp.val<10) // Если значение поля меньше 10
{
  tempStr1.txt="0"+tempStr.txt // то в строчную переменную tempStr1 заносим строчное значение поля (переменная tempStr) добавив перед ним символ "0"
}else // Иначе
{
  tempStr1.txt=tempStr.txt // в строчную переменную tempStr1 заносим только строчное значение поля (переменная tempStr)
}
if(temp.val==10000) //Если значение поля не учитываеся при обработке событий (значение = 10000)
{
  if(sys1==10) // и если выбранно поле 10
  {
    vis BYP,0  //скрываем кнопку "Добавить еденицу"
    vis BYM,0 // скрываем кнопку  "Отнять еденицу"
  }
  StopH.txt="X" // В поле отображаем символ "Х"
}else //Иначе (значение поля  учитываеся при обработке событий (значение не равно 10000))
{
  if(sys1==10)  // и если выбранно поле 10
  {
    vis BYP,1 //показываем кнопку "Добавить еденицу"
    vis BYM,1 //показываем кнопку  "Отнять еденицу"
  }
  StopH.txt=tempStr1.txt // В поле отображаем значение поля из переменной tempStr1
}
//Отрисовка поля 11 - (Минута уставки выключения)
temp1.val=StAddr.val+44 //Oпределяем адрес в EEPROM для значения поля
repo temp.val,temp1.val  // В переменную temp вычитываем из EEPROM значение для поля
cov temp.val,tempStr.txt,0 // преобразуем числовое значение из переменной temp в строчное значчение в переменную tempStr
if(temp.val<10) // Если значение поля меньше 10
{
  tempStr1.txt="0"+tempStr.txt // то в строчную переменную tempStr1 заносим строчное значение поля (переменная tempStr) добавив перед ним символ "0"
}else // Иначе
{
  tempStr1.txt=tempStr.txt // в строчную переменную tempStr1 заносим только строчное значение поля (переменная tempStr)
}
if(temp.val==10000)  //Если значение поля не учитываеся при обработке событий (значение = 10000)
{
  if(sys1==11) // и если выбранно поле 11
  {
    vis BYP,0 //скрываем кнопку "Добавить еденицу"
    vis BYM,0 // скрываем кнопку  "Отнять еденицу"
  }
  StopMi.txt="X" // В поле отображаем символ "Х"
}else //Иначе (значение поля  учитываеся при обработке событий (значение не равно 10000))
{
  if(sys1==11) // и если выбранно поле 11
  {
    vis BYP,1 //показываем кнопку "Добавить еденицу"
    vis BYM,1 //показываем кнопку  "Отнять еденицу"
  }
  StopMi.txt=tempStr1.txt // В поле отображаем значение поля из переменной tempStr1
}
//Отрисовка поля 12 - (Секунда уставки выключения)
temp1.val=StAddr.val+48 //Oпределяем адрес в EEPROM для значения поля
repo temp.val,temp1.val // В переменную temp вычитываем из EEPROM значение для поля
cov temp.val,tempStr.txt,0 // преобразуем числовое значение из переменной temp в строчное значчение в переменную tempStr
if(temp.val<10) // Если значение поля меньше 10
{
  tempStr1.txt="0"+tempStr.txt // то в строчную переменную tempStr1 заносим строчное значение поля (переменная tempStr) добавив перед ним символ "0"
}else // Иначе
{
  tempStr1.txt=tempStr.txt // в строчную переменную tempStr1 заносим только строчное значение поля (переменная tempStr)
}
if(temp.val==10000)  //Если значение поля не учитываеся при обработке событий (значение = 10000)
{
  if(sys1==12) // и если выбранно поле 12
  {
    vis BYP,0 //скрываем кнопку "Добавить еденицу"
    vis BYM,0  // скрываем кнопку  "Отнять еденицу"
  }
  StopS.txt="X" // В поле отображаем символ "Х"
}else //Иначе (значение поля  учитываеся при обработке событий (значение не равно 10000))
{
  if(sys1==12) // и если выбранно поле 12
  {
    vis BYP,1 //показываем кнопку "Добавить еденицу"
    vis BYM,1 //показываем кнопку  "Отнять еденицу"
  }
  StopS.txt=tempStr1.txt // В поле отображаем значение поля из переменной tempStr1
}
//Задание цвета полям
if(sys1==1) //Если выбранно поле 1 - (День уставки включения)
{
  StartD.pco=63488 //Полю 1 задаём цвет - красный
}else //иначе
{
  StartD.pco=65535 //Полю 1 задаём цвет - белый
}
if(sys1==2) //Если выбранно поле 2 - (Месяц уставки включения)
{
  StartMo.pco=63488 //Полю 2 задаём цвет - красный
}else //иначе
{
  StartMo.pco=65535 //Полю 2 задаём цвет - белый
}
if(sys1==3) //Если выбранно поле 3 - (Год уставки включения)
{
  StartY.pco=63488 //Полю 3 задаём цвет - красный
}else //иначе
{
  StartY.pco=65535 //Полю 3 задаём цвет - белый
}
if(sys1==4) //Если выбранно поле 4 - (Час уставки включения)
{
  StartH.pco=63488 //Полю 4 задаём цвет - красный
}else //иначе
{
  StartH.pco=65535 //Полю 4 задаём цвет - белый
}
if(sys1==5) //Если выбранно поле 5 - (Минута уставки включения)
{
  StartMi.pco=63488 //Полю 5 задаём цвет - красный
}else //иначе
{
  StartMi.pco=65535 //Полю 5 задаём цвет - белый
}
if(sys1==6) //Если выбранно поле 6 - (Секунда уставки включения)
{
  StartS.pco=63488 //Полю 6 задаём цвет - красный
}else //иначе
{
  StartS.pco=65535 //Полю 6 задаём цвет - белый
}
if(sys1==7) //Если выбранно поле 7 - (День уставки выключения)
{
  StopD.pco=63488 //Полю 7 задаём цвет - красный
}else //иначе
{
  StopD.pco=65535 //Полю 7 задаём цвет - белый
}
if(sys1==8)  //Если выбранно поле 8 - (Месяц уставки выключения)
{
  StopMo.pco=63488 //Полю 8 задаём цвет - красный
}else //иначе
{
  StopMo.pco=65535 //Полю 8 задаём цвет - белый
}
if(sys1==9) //Если выбранно поле 9 - (Год уставки выключения)
{
  StopY.pco=63488 //Полю 9 задаём цвет - красный
}else //иначе
{
  StopY.pco=65535 //Полю 9 задаём цвет - белый
}
if(sys1==10) //Если выбранно поле 10 - (Час уставки выключения)
{
  StopH.pco=63488 //Полю 10 задаём цвет - красный
}else //иначе
{
  StopH.pco=65535 //Полю 10 задаём цвет - белый
}
if(sys1==11) //Если выбранно поле 11 - (Минута уставки выключения)
{
  StopMi.pco=63488 //Полю 11 задаём цвет - красный
}else //иначе
{
  StopMi.pco=65535 //Полю 11 задаём цвет - белый
}
if(sys1==12) //Если выбранно поле 12 - (Секунда уставки выключения)
{
  StopS.pco=63488 //Полю 12 задаём цвет - красный
}else //иначе
{
  StopS.pco=65535 //Полю 12 задаём цвет - белый
}

Подробнее о команде vis – изменение видимости элемента

Синтаксис:
vis obj,state
где:
obj: имя или ID элемента.
state: состояние 1- видимый, 0 – не видимый
Обратите внимание на наличие пробелов. Обязательный пробел после команды vis дальше в тексте команды пробелы не допустимы.

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

FLProg + Nextion HMI Enhanced - 8

Здесь, как и на других экранах в событии 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 этого таймера происходит обновление значений текстовых полей.

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


//Обновление отображения текущего времени 
temp.val=rtc2 //в переменную temp вычитываем значения текущего дня из часов реального времени (системная переменная rtc2)
tempText.txt=""//в строковую переменную tempText записываем пустую строку
if(temp.val<10)//если значение текущего дня меньше 10
{
  tempText.txt="0" //в строковую переменную tempText записываем символ "0"
}
cov temp.val,TT1.txt,0 // преобразуем числовое значение дня в строковое значение и записываем в строковую переменную TT1
CurrentTime1.txt=tempText.txt+TT1.txt //в поле отображения текущего времени CurrentTime1 записываем значения переменных tempText и TT1
temp.val=rtc1 //в переменную temp вычитываем значения текущего месяца из часов реального времени (системная переменная rtc1)
tempText.txt="" //в строковую переменную tempText записываем пустую строку
if(temp.val<10) //если значение текущего месяца меньше 10
{
  tempText.txt="0" //в строковую переменную tempText записываем символ "0"
}
cov temp.val,TT1.txt,0 //преобразуем числовое значение месяца в строковое значение и записываем в строковую переменную TT1
CurrentTime1.txt=CurrentTime1.txt+"-"+tempText.txt+TT1.txt  //к значению в поле отображения текущего времени CurrentTime1добавляем символ разделителя даты "-" а затем значения переменных tempText и TT1
temp.val=rtc0 //в переменную temp вычитываем значения текущего года из часов реального времени (системная переменная rtc0)
tempText.txt=""//в строковую переменную tempText записываем пустую строку
if(temp.val<10)//если значение текущего года меньше 10
{
  tempText.txt="0"//в строковую переменную tempText записываем символ "0"
}
cov temp.val,TT1.txt,0 //преобразуем числовое значение года в строковое значение и записываем в строковую переменную TT1
CurrentTime1.txt=CurrentTime1.txt+"-"+tempText.txt+TT1.txt //к значению в поле отображения текущего времени CurrentTime1добавляем символ разделителя даты "-" а затем значения переменных tempText и TT1
temp.val=rtc3 //в переменную temp вычитываем значения текущего часа из часов реального времени (системная переменная rtc3)
tempText.txt="" //в строковую переменную tempText записываем пустую строку
if(temp.val<10) //если значение текущего часа меньше 10
{
  tempText.txt="0" //в строковую переменную tempText записываем символ "0"
}
cov temp.val,TT1.txt,0 //преобразуем числовое значение часа в строковое значение и записываем в строковую переменную TT1
CurrentTime1.txt=CurrentTime1.txt+" "+tempText.txt+TT1.txt  //к значению в поле отображения текущего времени CurrentTime1добавляем символ разделителя даты и времени " " а затем значения переменных tempText и TT1
temp.val=rtc4 //в переменную temp вычитываем значения текущей минуты из часов реального времени (системная переменная rtc4)
tempText.txt=""  //в строковую переменную tempText записываем пустую строку
if(temp.val<10) //если значение текущей минуты меньше 10
{
  tempText.txt="0" //в строковую переменную tempText записываем символ "0"
}
cov temp.val,TT1.txt,0 //преобразуем числовое значение минуты в строковое значение и записываем в строковую переменную TT1
CurrentTime1.txt=CurrentTime1.txt+":"+tempText.txt+TT1.txt  //к значению в поле отображения текущего времени CurrentTime1добавляем символ разделителя времени ":" а затем значения переменных tempText и TT1
temp.val=rtc5  //в переменную temp вычитываем значения текущей сеунды из часов реального времени (системная переменная rtc4)
tempText.txt="" //в строковую переменную tempText записываем пустую строку
if(temp.val<10)  //если значение текущей секунды меньше 10
{
  tempText.txt="0" //в строковую переменную tempText записываем символ "0"
}
cov temp.val,TT1.txt,0 //преобразуем числовое значение секунды в строковое значение и записываем в строковую переменную TT1
CurrentTime1.txt=CurrentTime1.txt+":"+tempText.txt+TT1.txt //к значению в поле отображения текущего времени CurrentTime1добавляем символ разделителя времени ":" а затем значения переменных tempText и TT1
//Задание цвета для идентификаторов полей (t1 - t5)
if(sel.val==1) //Если выбрано поле 1 (День)
{
  t1.pco=63488 //Идентификатору поля дня (t1) задаём цвет текста - красный
}else//Иначе
{
  t1.pco=65535 //Идентификатору поля дня (t1) задаём цвет текста - белый
}
if(sel.val==2) //Если выбрано поле 2 (Месяц)
{
  t2.pco=63488 //Идентификатору поля месяца (t2) задаём цвет текста - красный
}else //Иначе
{
  t2.pco=65535 //Идентификатору поля месяца (t2) задаём цвет текста - белый
}
if(sel.val==3)//Если выбрано поле 3 (Год)
{
  t3.pco=63488  //Идентификатору поля года (t3) задаём цвет текста - красный
}else //Иначе
{
  t3.pco=65535  //Идентификатору поля года (t3) задаём цвет текста - белый
}
if(sel.val==4)//Если выбрано поле 4 (Час)
{
  t4.pco=63488  //Идентификатору поля часа (t4) задаём цвет текста - красный
}else //Иначе
{
  t4.pco=65535 //Идентификатору поля часа (t4) задаём цвет текста - белый
}
if(sel.val==5)//Если выбрано поле 5(Минута)
{
  t5.pco=63488  //Идентификатору поля минуты (t5) задаём цвет текста - красный
}else //Иначе
{
  t5.pco=65535 //Идентификатору поля минуты (t5) задаём цвет текста - белый
}

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

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

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

FLProg + Nextion HMI Enhanced - 9

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

Приложения:

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

Автор: FLProg

Источник

Поделиться

* - обязательные к заполнению поля