Документация Engee
Notebook

Генерация кода для ESP 8266 ("Умная" розетка)

В этом демонстрационном примере разрабатывается модель Engee для управления цифровым выходом в зависимости от значений текущего времени, получаемого от NTP-сервера с последующей генерацией кода для микроконтроллера ESP 8266.

Введение

Цель этого примера - ознакомиться с работой условной конструкции в модели Engee на базе блока If и атомарной подсистемы с блоком порта управления исполнением Action Port.
Суть алгоритма, воспроизводимого в модели, заключается в следующем. Контроллер в каждом цикле расчета модели опрашивает NTP-сервер, получая от него данные о текущем времени. При достижении определенного времени (в примере это 15 часов) контроллер переводит один из своих цифровых выходов в состояние логической "1", тем самым включая силовые контакты электромеханического реле, воспроизводя работу "умной" розетки.
Эпитет "умная" в этом примере не несёт коннотацию "интеллектуальная", а лишь кратко характеризует автоматическую коммутацию по заданной уставке времени, что и встречается в большинстве случаев среди представленных на рынке устройств подобного класса.

Аппаратная часть

Целевым устройством, которое используется в этом примере, является отладочная плата NodeMCU v1.0 с WiFi-модулем ESP12E на микроконтроллере ESP8266. Для коммутации силовой цепи применяется модуль электромеханического реле JCQ-3FF (10А 250В).
Уровень опорного напряжения микроконтроллера составляет 3.3 Вольта, а реле - 5 Вольт, и, кроме того, для коммутации реле требуется управляющий сигнал низкого уровня. Для согласования уровней напряжения и инвертирования управляющего сигнала используется микросхема с триггерами Шмитта SN74HC14N.
Силовые нормально открытые контакты реле коммутируют фазу сетевого напряжения 220 Вольт, тем самым обеспечивая питание "умной" розетки. Переменное напряжение поступает от входа 220 Вольт.
Схема соединения элементов данного примера представлена на рисунке ниже.

esp_smart_socket_bb.png

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

Описание модели

В модели данного примера esp8266_smart_socket.engee используются 4 блока C Function для взаимодействия с периферией:

  • WiFiConnect - устанавливает WiFi-подключение по SSID и паролю, которые указываются в пользовательском скетче. Если соединение не устанавливается в течение Resp_Time_ms = 15000 мс перезагружает WiFi-модуль.
  • NTP_Client - инициализирует и опрашивает NTP-сервер, передаёт на выходы HH, MM и SS целочисленные значения текущих часов, минут, секунд. В процессе моделирования блок NTP_Client формирует циклическое изменение времени, что позволяет протестировать работу алгоритма.
  • ToSerial - инициализирует последовательный порт со скоростью передачи 115200 бод, выводит сообщения в последовательный порт.
  • GPIO4 - инициализирует цифровой контакт № 4 микроконтроллера (контакт D2 на отладочной плате) в качестве выхода, устанавливает его состояние state.

Пояснения к пользовательскому коду блоков C Function даны в комментариях кода.

Структура модели данного примера представлена на рисунке ниже.

image_2.png

Блок условия Check_time проверяет значение Hours на входе на соответствие записанному в него условию - равенство 15. В случае, если условие выполняется, он инициирует выполнение атомарной подсистемы SET_HIGH по порту управления исполнением.
Ввиду того, что при снятии логической единицы со входа Action port состояние выхода HIGH_LEV подсистемы SET_HIGH сохраняется, в режиме выполнения этой подсистемы реализован алгоритм формирования единичных импульсов, изменяющий логический уровень выхода подсистемы на каждом шаге расчета. С целью удержания сигнала в случае выполнения подсистемы и сброса при её невыполнении на выходе подсистемы реализуется функция "ИСКЛЮЧАЮЩЕЕ ИЛИ", сравнивающая текущее и предыдущее выходные значения подсистемы.

Результаты моделирования

Проверим работу алгоритма, загрузив и выполнив собранную модель.

In [ ]:
if "esp8266_smart_socket" in [m.name for m in engee.get_all_models()]
    m = engee.open( "esp8266_smart_socket" );
else
    m = engee.load( "$(@__DIR__)/esp8266_smart_socket.engee" );
end

data = engee.run(m);

Построим графики изменения текущего часа - сигнал Hours и сигнала коммутации реле - Hold_and_Reset.

In [ ]:
using Plots
plotlyjs()
plot(data["Hours"].time, data["Hours"].value,
    label="Время, часы", size=(900,300), lw=2, st=:step)
plot!(data["Hold_and_Reset"].time, data["Hold_and_Reset"].value,
    label="Вкл. розетки", size=(900,300), lw=2, st=:step)
Out[0]:

Как видно из графиков, при циклическом изменении текущего часа сигнал управления реле переходит и удерживает состояние логической единицы только в 15 часов. Теперь рассмотрим выполнение модели на целевом устройстве.

Загрузка кода в ESP 8266

Для загрузки на ESP 8266 предварительно необходимо сгенерировать код из разработанной модели.

In [ ]:
engee.generate_code( "$(@__DIR__)/esp8266_smart_socket.engee",
                     "$(@__DIR__)/esp8266_smart_socket_code")
[ Info: Generated code and artifacts: /user/new/esp8266_smart_socket/esp8266_smart_socket_code

Сгенерированные в указанной директории файлы подключим в пользовательском скетче esp8266_smart_socket.ino. Также в скетче определяются макросы и переменные, подключаются библиотеки и ntp-сервер, устанавливается задержка цикла расчёта. Скачаем эти файлы и загрузим в ESP8266 при помощи Arduino IDE.

Для данного примера используются внешние библиотеки С: NTPClient, ESP8266WiFi, WiFiUdp. Обращение к NTP-серверу осуществляется по адресу "pool.ntp.org".

Пояснения к работе кода пользовательского скетча даны в его комментариях.

Выполнение кода на ESP 8266

После успешной компиляции пользовательского скетча и загрузки кода в контроллер в мониторе порта Arduino IDE можно наблюдать следующий диагностический вывод:

smart_socket.gif

Сообщение "Розетка включена" в диагностическом выводе сопровождается включением светодиода состояния входного сигнала на модуле реле и коммутацией силовых контактов реле.

Вывод

В этом демонстрационном примере рассмотрена разработка модели Engee с последующим её исполнением на целевом устройстве - контроллере ESP 8266. Данная модель реализует взаимодействие с периферией контроллера - последовательным портом, цифровым выходом и WiFi-модулем, а также реализует опрос NTP-сервера и обработку полученных значений. Результатом работы модели и программы на её основе служит воспроизведённый принцип работы "умной" розетки.

Блоки, использованные в примере