FLProg + Nextion HMI. Урок 3

FLProg + Nextion HMI. Урок 3

На предыдущих уроках (урок 1, урок 2) я рассказал, как рисовать интерфейс панели Nextion HMI, как управлять панелью с помощью Arduino. В этом уроке я расскажу, как решать обратную задачу – управлять платой Arduino с помощью панели Nextion HMI.
На уроке мы расширим проект предыдущего урока, добавим управление вентилятором, который будет включатся при превышении температуры выше заданного предела, и выключаться при снижении температуры ниже второго предела. Уставки будут задаваться с панели, и сохраняться в энергонезависимой памяти контроллера Arduino. Кроме того сделаем на панели выключатель света (двухпозиционный) и кнопку при помощи которой будем включать фонарь (например что бы подавать сигнал инопланетянам).

Доработанная схема с прошлого урока. Фонарь, свет и вентилятор будут имитировать светодиоды.

Так же доработан проект панели. Добавлены две страницы. Кроме того был заменён шрифт загруженный в панель. Проект для панели находится в архиве, ссылка на который дана в конце статьи. В комментариях к прошлому уроку меня совершенно справедливо пожурили за отсутствие дизайнерских талантов. Я полностью с этим согласен, поэтому новые страницы не имеют никакого дизайна, чистый функционал.
Рассмотрим новые страницы.

Страница управления (“page3”, ID=3).

Рассмотрим элементы, находящиеся на странице.

  1. Просто текстовые поля. Ничего интересного.
  2. Поле отображения уставки включения вентилятора. Как я уже писал, панель не умеет работать с дробными числами. Поэтому это текстовые поля. Строку для отображения будем готовить на ардуинке. Параметры элемента.

    Поскольку значение в это поле будем отправлять с контроллера, делаем его глобальным (атрибут “vscope” значение “global”). При нажатии на это поле будет происходить открытие страницы редактирования значения. Поэтому в событии “Touch Press Event” записан следующий код.

    При нажатии на элемент сначала в поле редактируемого значения на странице 4 заносим текущее значение.
    page4.evtemp.txt=onV.txt

    Затем в переменную хранящую идентификатор редактируемого поля на странице 4 заносим идентификатор поля, по которому нажали.

    page4.varN.val=0

    Ну и переходим на страницу редактирования значения.

    page page4
  3. Поле отображения уставки выключения вентилятора. Практически идентично предыдущему полю. Параметры элемента.

    Код в событии “Touch Press Event”.

    В этом коде отличие от предыдущего только в идентификаторе поля.
    page4.varN.val=1
  4. Кнопка назад. Скопирована с прошлого урока. Параметры элемента.

    Код в событии “Touch Press Event”.
  5. Переключатель на два положения (“Dual-state button”) – управление светом.
    Параметры элемента.

    Значение состояния данного элемента будем считывать из контроллера, поэтому элемент глобальный (атрибут “vscope” значение “global”). В качестве режима отображения фона выбран режим картинки (атрибут “sta” значение “image”). Картинки задаются в атрибутах “pic0” для состояния 0 и “pic1” для состояния 1.
  6. Кнопка (“Button”) – включение фонаря. Параметры элемента.

    Здесь остановимся поподробнее. За нажатиями этой кнопки будем следить из контроллера, для управления фонарём. К сожалению, в Arduino нельзя установить прерывание на получение байта из UART (по крайней мере, стандартами средствами). Поэтому пришлось реализовывать запоминание факта нажатия и отпускания кнопки с помощью двух переменных (7 и 8). Напрямую к кнопке обращаться не будем, поэтому её можно делать как локальной, так и глобальной (я сделал глобальной на всякий случай). В обработчике нажатия кнопки (“Touch Press Event”) написан следующий код.

    А в обработчике отпускания кнопки (“Touch Release Event”) такой.

    Эти переменные нам понадобятся в блоке отслеживания нажатий в проекте FLProg.

Окно редактирования значений (“page4”, ID=4).

Рассмотрим что в него входит.

  1. Поле редактируемого значения. Параметры элемента.

    Значение данного поля будем читать из контроллера, соответственно делаем его глобальным (атрибут “vscope” значение “global”).
  2. Кнопки ввода значения. Все эти кнопки практически идентичны, и отличаются надписью и кодом в обработчике события “Touch Press Event”. При нажатии на одну из этих кнопок к текущему значению поля редактируемого значения добавляется соответствующий символ.
    Код в событии “Touch Press Event” для каждой из кнопок.

    “0”

    evtemp.txt=evtemp.txt+"0"

    “1”

    evtemp.txt=evtemp.txt+"1"

    “2”

    evtemp.txt=evtemp.txt+"2"

    “3”

    evtemp.txt=evtemp.txt+"3"

    “4”

    evtemp.txt=evtemp.txt+"4"

    “5”

    evtemp.txt=evtemp.txt+"5"

    “6”

    evtemp.txt=evtemp.txt+"6"

    “7”

    evtemp.txt=evtemp.txt+"7"

    “8”

    evtemp.txt=evtemp.txt+"8"

    “9”

    evtemp.txt=evtemp.txt+"9"

    “.”

    evtemp.txt=evtemp.txt+"."

  3. Кнопка очистки поля. При её нажатии удаляется значение поля.
    Код в событии “Touch Press Event”
    evtemp.txt=""

  4. Кнопка удаления последнего символа.
    Код в событии “Touch Press Event”
    evtemp.txt=evtemp.txt-1

    Это не задокументированная функция. Она удаляет последний символ в строке. Я её подсмотрел на одном из видео на сайте производителя. Вообще я не нашёл практически никакой информации по работе со строками на панели.

  5. Кнопка завершения редактирования значения.
    Нажатие этой кнопки будет отслеживаться на контроллере, так что для неё созданы две переменные (“endPress” и “ endRel”) и в обработчиках событий написан код.
    Код в событии “Touch Press Event”
    page4.endPress.val=1

    Код в событии “Touch Release Event”

    page4.endRel.val=1
  6. Кнопка отмены редактирования. По нажатию этой кнопки мы просто возвращаемся на страницу управления.
    Код в событии “Touch Press Event”
    page page3

С панелью закончили, переходим к программе FLProg. В ней так же используется проект из прошлого урока немного доработанный. Файл проекта находится в архиве, ссылка на который дана в конце поста.
Как и в прошлом уроке, я буду показывать готовые схемы плат и рассказывать, что на них происходит.
Плата 7 – «Управление фонарём»

Здесь всё просто. Блок В46 – «Отслеживание нажатий» (библиотека элементов, папка «Панель Nextion HMI»). На своем выходе имеет значение соответствующее состоянию отслеживаемой кнопки или другого элемента имеющего события “Touch Press Event” и “Touch Release Event” на панели. Это значение напрямую прописывается в выход, привязанный к фонарю. Блок параметрируется с помощью редактора блоков.

В редакторе блоков необходимо выбрать панель, а затем создадим новую страницу и пропишем на ней необходимые элементы. Как это сделать я рассказывал на предыдущем уроке.

Должна получится такая картина.

В качестве переменной нажатия выбираем ту переменную, в которую мы пишем единичку в событии “Touch Press Event” кнопки, а в качестве переменой отпускания, переменную из события “Touch Release Event” кнопки.

Плата 8 – «Управление светом».

То же очень простая плата. Здесь мы считываем положение переключателя с помощью блока В47 – «Получить параметр» (библиотека элементов -> папка «Панель Nextion HMI» -> папка «Элементы»). Затем это значение отправляется непосредственно в блок выхода, привязанный к освещению. Блок параметрируется с помощью редактора блоков.

Для снижения нагрузки на контроллер запрос состояния переключателя будем делать раз в секунду.

Плата 9 – «Окончание редактирования параметров».
На этой плате мы будем обрабатывать нажатие кнопки «Готово» на странице редактирования параметров.

С помощью блока В48 – «Отслеживание нажатий» (библиотека элементов, папка «Панель Nextion HMI») мы определяем момент нажатия. В редакторе этого блока мы создадим страницу 4 и заполним её интересующими нас элементами.

И настроим блок.

С помощью блока В49 – “Rtrig” (библиотека элементов, папка «Триггеры») выделим передний фронт сигнала о нажатии кнопки «Готово» и запишем в переменную «Окончание редактирования».
Так же по этому фронту прочитаем значение переменной хранящей идентификатор редактируемого поля с помощью блока В54 — «Получить параметр» (библиотека элементов -> папка «Панель Nextion HMI» -> папка «Элементы»). Настройки блока.

Полученное значение положим в переменную «Номер редактируемого поля».
И по тому же импульсу прочитаем непосредственно новое значение из текстового поля с помощью блока В50 — — «Получить параметр» (библиотека элементов -> папка «Панель Nextion HMI» -> папка «Элементы»). Настройки блока.

Новое значение из строки превратим в число в формате Float с помощью блока В51 – «Преобразование строк» (библиотека элементов, папка «Конвертация типов»). Настройки блока.

Число умножим на 10 с помощью блока В52 – “MUL(*)” (библиотека элементов, папка «Математика»), сменим тип на Integer с помощью блока В53 – «Преобразование Float в Integer» (библиотека элементов, папка «Конвертация типов») и положим в переменную «Новое значение».

Плата 10 — «Обработка результатов редактирования значения»

С помощью блока В55 — “Comparator” (библиотека элементов, папка «Сравнение») определяем, какое поле редактировалось, и в зависимости от результата записываем величину из переменной «Новое значение» по импульсу в переменной «Окончание редактирования» в одну из двух переменных, в «Уставка выключения вентилятора х10» или в «Уставка включения вентилятора х10». Так же по тому же импульсу даём команду панели перейти на страницу управления с помощью блока В58 – «Перейти на страницу» (библиотека элементов, папка «Панель Nextion HMI» -> папка «Страница»). Настройки блока.

Плата 11 – «Запись значений уставок в панель и EEProm»

С помощью блока В59 – «Детектор изменения числа» (библиотека элементов, папка «Базовые элементы») определяем факт изменения значения переменой «Уставка включения вентилятора х10». На выходе блока формируется короткий импульс в момент изменения значения на входе «Value». По этому импульсу происходит запись значения в энергонезависимую память контроллера. Это происходить при помощи блока В65 — «Запись в EEPROM» (библиотека элементов, папка «EEPROM»). Блок настраивается при помощи редактора блока.

Прежде чем записать переменную в EEPROM необходимо её там создать. Для этого нажимаем кнопку «Создать» в редакторе блока. Открывается окно создания переменной.

В нём задаём имя переменной и её тип. После нажатия кнопки готово блок окажется, привязан к этой переменной.

Так же по сигналу об изменении переменной, её значение делится на константу типа Float равную 10 при помощи блока В61 – “DIV(/)” (библиотека элементов, папка «Математика»), превращается в строку с помощью блока В62 –«Преобразование строк» (библиотека элементов, папка «конвертация типов»), и отправляется на панель в соответствующее поле с помощью блока В63 – «Задать параметр» (библиотека элементов, папка «Панель Nextion HMI» -> папка «Элементы»). Настройки этого блока.

Логика контроля переменой «Уставка выключения вентилятора х10» аналогична, Настройки блоков такие.

Блок B65.

Блок В68.

Теперь обеспечим чтение уставок из EEPROM в момент старта контроллера. Для этого вставим новую плату в самый верх проекта для того что бы схема расположенная на ней выполнялась а первую очередь. Для этого выделяем первую плану и нажимаем кнопку «Вставить плату перед выделенной».

Назовём новую плату «Чтение уставок из EEPROM».

Плата 1.

С помощью блока В72 – “Rtrig” (библиотека элементов, папка «Триггеры») мы создаём один короткий импульс при включении контроллера. По этому импульсу происходит запись в переменные «Уставка включения вентилятора х10» и «Уставка выключения вентилятора х10» значений прочитанных из энергонезависимой памяти. Это происходит при помощи блоков В71 и В73 – «Чтение из EEPROM» (библиотека элементов, папка «EEPROM»). Блоки параметрируются с помощью редактора блоков.

Параметры блока В71.

Выбор читаемой переменной в EEPROM производится нажатием кнопки «Выбрать». Открывается окно выбора переменной.

Параметры блока В73.

Ну и последняя плата в проекте.

Плата 12. «Управление вентилятором»

Если текущая температура превысила уставку «Уставка включения вентилятора х10» это обнаружит блок сравнения В69 и установит триггер В70 в состояние 1, а при снижении температуры ниже уставки «Уставка выключения вентилятора х10» это будет обнаружено блоком В71, который установит триггер В70 в состояние 0. Состояние триггера подаётся на блок выхода связанного с вентилятором.

Архив с исходниками проектов.

Видеодемонстрация

Источник

arduino, diy или сделай сам, flprog, nextion hmi

Читайте также