为 ESP 8266("智能 "插座)生成代码
该演示开发了一个Engee模型,用于根据从 NTP 服务器接收到的当前时间值控制数字输出,然后为 ESP 8266 微控制器生成代码。
简介
本示例旨在熟悉Engee模型中条件设计的操作,该设计基于模块If
和带有控制端口模块的原子子系统版本Action Port
。
模型中再现的算法实质如下。在模型计算的每个周期中,控制器都会轮询 NTP 服务器,从中接收有关当前时间的数据。当达到一定时间后(在本例中为 15 小时),控制器将其数字输出之一切换到逻辑 "1 "状态,从而接通机电继电器的电源触点,再现 "智能 "插座的运行。
本示例中的 "智能 "一词并不包含 "智能 "的含义,而只是简要说明了根据设定时间自动切换的特点,市场上大多数此类设备都是如此。
硬件
本示例中使用的目标设备是一块 NodeMCU v1.0 调试板,在 ESP8266 微控制器上安装了 ESP12E WiFi 模块。机电继电器模块 JCQ-3FF (10A 250V) 用于切换电源电路。
微控制器的参考电压电平为 3.3 伏,继电器的参考电压电平为 5 伏,此外,还需要一个低电平控制信号来切换继电器。施密特触发器芯片 SN74HC14N 用于匹配电压电平和反相控制信号。
继电器的电源常开触点可切换 220 伏市电电压的相位,从而为智能插座供电。交流电压由 220 伏输入端提供。
本例的接线图如下图所示。

** 要重现本示例中描述的硬件系统,我们强烈建议您遵守职业健康与安全、电气安全和消防安全领域的相关规定。如果不具备必要的能力、个人防护设备、可维修的安全部件,我们强烈建议您联系相关领域的专家**。
型号说明
本示例esp8266_smart_socket.engee
的模型使用 4 个块C Function
与外设交互:
*WiFiConnect
- 使用用户草图中指定的 SSID 和密码建立 WiFi 连接。如果连接未在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
中移除逻辑 1 时,子系统SET_HIGH
的输出HIGH_LEV
的状态将保持不变,因此在该子系统的执行模式中采用了形成单脉冲的算法,在每一步计算中改变子系统输出的逻辑电平。为了在子系统执行的情况下保留信号,并在子系统未执行的情况下进行复位,在子系统的 输出上执行了 "EXCEPT OR "功能,对子系统当前和之前的输出值进行比较。
建模结果
让我们通过加载和执行组装好的模型来验证算法的性能。
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 时转换并保持逻辑 1 状态。现在让我们考虑在目标设备上执行模型的情况。
将代码加载到 ESP 8266
要将代码上传到 ESP 8266,必须首先从开发的模型中生成代码。
engee.generate_code( "$(@__DIR__)/esp8266_smart_socket.engee",
"$(@__DIR__)/esp8266_smart_socket_code")
在指定目录下生成的文件将连接到用户草图esp8266_smart_socket.ino
中。此外,还要在草图中定义宏和变量,连接库和 ntp 服务器,设置计算周期的延迟。下载这些文件并使用 Arduino IDE 将其加载到 ESP8266 中。
本示例使用的外部库为 C. , , :NTPClient
,ESP8266WiFi
,WiFiUdp
。访问 NTP 服务器的网址为 "pool.ntp.org "。
用户草图代码的操作说明在注释中给出。
在 ESP 8266 上执行代码
成功编译自定义草图并将代码加载到控制器后,可在 Arduino IDE 端口监控器中观察到以下诊断输出:

诊断输出中的 "插座已接通 "信息伴随着继电器模块上输入信号状态 LED 指示灯的亮起和继电器电源触点的切换。
输出
本演示介绍了 Engee 模型的开发及其在目标设备(ESP 8266 控制器)上的执行情况。该模型实现了与控制器外围设备(串行端口、数字输出和 WiFi 模块)的交互,还实现了 NTP 服务器轮询和对接收值的处理。该模型和基于该模型的程序再现了智能插座的运行原理。