Engee 文档
Notebook

ESP8266(智能插座)的代码生成

在本演示中,正在开发Engee模型,以根据从NTP服务器接收的当前时间值控制数字输出,然后为ESP8266微控制器生成代码。

导言

此示例的目的是熟悉基于块的Engee模型中条件构造的操作 If 以及具有执行控制端口块的原子子系统 Action Port.
模型中再现的算法的本质如下。 在模型计算的每个周期中,控制器轮询NTP服务器,从中接收关于当前时间的数据。 当达到一定时间(在示例中为15小时)时,控制器将其数字输出之一切换到逻辑"1"状态,从而打开机电继电器的电源触点,再现"智能"插座的操作。
本例中的"智能"并不带有"智能"的含义,而只是简单地描述了在预设时间设置下的自动切换,这在市场上的这类设备中是大多数情况下

硬件部分

本示例中使用的目标设备是ESP8266微控制器上带有ESP12EWiFi模块的NodeMCU v1.0调试板。 机电继电器模块JCQ-3FF(10A250V)用于切换电源电路。
微控制器的参考电压电平为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服务器,将其发送到输出 HH, MMSS 当前小时、分钟和秒的整数值。 在建模过程中,块 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点切换并保持逻辑单元的状态。 现在让我们来看看模型在目标设备上的执行。

将代码上传到ESP8266

要上传到ESP8266,您必须首先从开发的模型生成代码。

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

对于此示例,外部库与: NTPClient, ESP8266WiFi, WiFiUdp. NTP服务器在*"访问pool.ntp.org "*。

用户草图代码如何工作的解释在其评论中给出。

在ESP8266上执行代码

成功编译用户草图并将代码上传到控制器后,可以在Arduino IDE端口的监视器中观察到以下诊断输出:

smart_socket.gif

诊断输出中的"插座打开"消息伴随着继电器模块上的输入状态LED的打开和继电器电源触点的切换。

结论

本演示讨论了Engee模型的开发及其在目标设备ESP8266控制器上的后续执行。 该模型实现了与控制器外围设备(串行端口、数字输出和WiFi模块)的交互,并实现了NTP服务器轮询和接收值的处理。 模型和基于它的程序的工作结果是"智能"出口的再现操作原理。