"Умная" розетка
Генерация кода для 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 Вольт.
Схема соединения элементов данного примера представлена на рисунке ниже.
Для воспроизведения аппаратного комплекса, описанного в этом примере, мы настоятельно рекомендуем следовать требованиям регламентов в области охраны труда и техники безопасности, электробезопасности, пожарной безопасности. При отсутствии необходимых компетенций, средств индивидуальной защиты, исправных и безопасных компонентов мы настоятельно рекомендуем обратиться к специалистам в соответствующей области.
Описание модели¶
В модели данного примера 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
даны в комментариях кода.
Структура модели данного примера представлена на рисунке ниже.
Блок условия Check_time
проверяет значение Hours
на входе на соответствие записанному в него условию - равенство 15. В случае, если условие выполняется, он инициирует выполнение атомарной подсистемы SET_HIGH
по порту управления исполнением.
Ввиду того, что при снятии логической единицы со входа Action port
состояние выхода HIGH_LEV
подсистемы SET_HIGH
сохраняется, в режиме выполнения этой подсистемы реализован алгоритм формирования единичных импульсов, изменяющий логический уровень выхода подсистемы на каждом шаге расчета. С целью удержания сигнала в случае выполнения подсистемы и сброса при её невыполнении на выходе подсистемы реализуется функция "ИСКЛЮЧАЮЩЕЕ ИЛИ", сравнивающая текущее и предыдущее выходные значения подсистемы.
Результаты моделирования¶
Проверим работу алгоритма, загрузив и выполнив собранную модель.
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
.
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)
Как видно из графиков, при циклическом изменении текущего часа сигнал управления реле переходит и удерживает состояние логической единицы только в 15 часов. Теперь рассмотрим выполнение модели на целевом устройстве.
Загрузка кода в ESP 8266¶
Для загрузки на ESP 8266 предварительно необходимо сгенерировать код из разработанной модели.
engee.generate_code( "$(@__DIR__)/esp8266_smart_socket.engee",
"$(@__DIR__)/esp8266_smart_socket_code")
Сгенерированные в указанной директории файлы подключим в пользовательском скетче esp8266_smart_socket.ino
. Также в скетче определяются макросы и переменные, подключаются библиотеки и ntp-сервер, устанавливается задержка цикла расчёта. Скачаем эти файлы и загрузим в ESP8266 при помощи Arduino IDE.
Для данного примера используются внешние библиотеки С: NTPClient
, ESP8266WiFi
, WiFiUdp
. Обращение к NTP-серверу осуществляется по адресу "pool.ntp.org".
Пояснения к работе кода пользовательского скетча даны в его комментариях.
Выполнение кода на ESP 8266¶
После успешной компиляции пользовательского скетча и загрузки кода в контроллер в мониторе порта Arduino IDE можно наблюдать следующий диагностический вывод: