Engee 文档
Notebook

为 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 伏输入端提供。
本例的接线图如下图所示。

esp_smart_socket_bb.png

** 要重现本示例中描述的硬件系统,我们强烈建议您遵守职业健康与安全、电气安全和消防安全领域的相关规定。如果不具备必要的能力、个人防护设备、可维修的安全部件,我们强烈建议您联系相关领域的专家**。

型号说明

本示例esp8266_smart_socket.engee 的模型使用 4 个块C Function 与外设交互: *WiFiConnect - 使用用户草图中指定的 SSID 和密码建立 WiFi 连接。如果连接未在Resp_Time_ms = 15000 мс 内建立,则重启 WiFi 模块。 *NTP_Client - 初始化并轮询 NTP 服务器,向输出端HHMMSS 发送当前时、分、秒的整数值。在建模过程中,程序块NTP_Client 形成时间的循环变化,以便测试算法的运行情况。 *ToSerial - 以 115200 波特的波特率初始化串行端口,向串行端口输出信息。 *GPIO4 - 将微控制器的 4 号数字引脚(调试板上的 D2 引脚)初始化为输出,设置其状态state

C Function 块的用户代码解释见代码注释。

本示例的模型结构如下图所示。

image_2.png

条件块Check_time 检查输入端Hours 的值是否符合其中写入的条件--相等 15。如果符合条件,它将启动执行控制端口上原子子系统SET_HIGH 的执行。
鉴于从输入Action port 中移除逻辑 1 时,子系统SET_HIGH 的输出HIGH_LEV 的状态将保持不变,因此在该子系统的执行模式中采用了形成单脉冲的算法,在每一步计算中改变子系统输出的逻辑电平。为了在子系统执行的情况下保留信号,并在子系统未执行的情况下进行复位,在子系统的 输出上执行了 "EXCEPT OR "功能,对子系统当前和之前的输出值进行比较。

建模结果

让我们通过加载和执行组装好的模型来验证算法的性能。

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 时转换并保持逻辑 1 状态。现在让我们考虑在目标设备上执行模型的情况。

将代码加载到 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 服务器,设置计算周期的延迟。下载这些文件并使用 Arduino IDE 将其加载到 ESP8266 中。

本示例使用的外部库为 C. , , :NTPClient,ESP8266WiFi,WiFiUdp 。访问 NTP 服务器的网址为 "pool.ntp.org "

用户草图代码的操作说明在注释中给出。

在 ESP 8266 上执行代码

成功编译自定义草图并将代码加载到控制器后,可在 Arduino IDE 端口监控器中观察到以下诊断输出:

smart_socket.gif

诊断输出中的 "插座已接通 "信息伴随着继电器模块上输入信号状态 LED 指示灯的亮起和继电器电源触点的切换。

输出

本演示介绍了 Engee 模型的开发及其在目标设备(ESP 8266 控制器)上的执行情况。该模型实现了与控制器外围设备(串行端口、数字输出和 WiFi 模块)的交互,还实现了 NTP 服务器轮询和对接收值的处理。该模型和基于该模型的程序再现了智能插座的运行原理。