Engee 文档
Notebook

为 ESP 8266 生成代码(Telegram 机器人中的声音传感器)

该演示介绍了一个模型的开发过程 Engee 处理来自声音传感器的信号,然后通过 Telegram-bot 生成用于控制 ESP 8266 微控制器的代码。

介绍

本示例旨在通过Engee建模,然后生成适用于家庭自动化和物联网的简单算法的代码。目标设备是一个带有嵌入式 WiFi 模块的微控制器,将通过 Telegram 机器人进行控制,Telegram 机器人也由 Engee 模型提供。Telegram 机器人将从控制器接收传感器位置的声级,并使用移动平均法进行平均。

硬件

本例中使用的目标设备是一块 NodeMCU v1.0 调试板,在 ESP8266 微控制器上安装了 ESP12E WiFi 模块。设备输入的模拟信号来自 LM393 芯片上的声音传感器。传感器由微控制器供电。本示例的设备连接图如下所示。

image.png

微控制器通过 USB 端口进行编程,程序被载入闪存。为进一步操作,控制器和传感器由电源装置供电。
用户草图的编译和控制器的编程通过 Arduino IDE 2.3.2 进行。为了与NodeMCU v1.0 (ESP-12E)配合使用,Arduino IDE还提供了一个基于ESP 8266芯片的电路板库,该库来自ESP8266社区

电报机器人

Telegram 机器人 "ESP_test"(@EngeeESPTestBot)是作为控制控制器的用户界面而创建的。要进一步使用该机器人,您需要它的 HTTP API 访问令牌(创建机器人时生成)和用户 Chat ID

在使用的机器人中配置了两个命令: /hi - 输出文本信息,/sound - 输出平均音量。

创建 Telegram 机器人和获取用户 Chat ID 的过程都很琐碎,可以公开获取,本示例中不予考虑。

需要注意的是,本例中处理 Telegram 机器人传入信息的用户代码只使用了一个指定用户的 ID。要访问处理来自任何用户的命令,应更改机器人的接收消息处理功能。

Engee 模型说明

控制器的控制算法在 Engee 模型中重现。其结构如下图所示。

image_2.png

在这里,程序块MovingAverageAverageDiv 计算 10 个信号值的移动平均值。与控制器外围的交互由程序块C Function 执行:

*AnalogInput - 从模拟输入端接收音频电平信号; *ToSerial - 初始化串行端口并向其传输平均声级值; *TelegramBot - 初始化 Telegram-bot,检查接收到的信息; *WiFiConnect - 建立 WiFi 连接。

用户聊天 IDMyChatID 被传输到TelegramBot 块的输入端,而WiFiConnect 的输入端--连接等待时间ResponseTime ,在 WiFi 信号较弱的情况下应增加连接等待时间。

任何可用库都可用于 Telegram-bot 的工作。本例中使用的是 C++ 库 FastBot

为了连接到 WiFi 网络,在程序块WiFiConnect 中使用了宏WIFI_SSID,WIFI_PASS - WiFi 网络的 SSID 和密码值,这些值将在用户草图中进一步定义。

区块C Function 中代码运行算法的详细说明见区块注释。

建模结果

为了模拟移动平均算法,还在AnalogInput 模块的输出端生成了一个介于 8 和 10 之间的随机输出值。让我们通过加载和执行组装好的模型来检查算法性能。

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

data = engee.run(m);

让我们绘制模拟信号(生成的随机值)和移动平均计算结果的曲线图。

In [ ]:
using Plots
plotlyjs()
plot(data["SoundFromSens"].time, data["SoundFromSens"].value,
    label="Сигнал от датчика", size=(900,300), lw=2, st=:step)
plot!(data["SoundAvValue"].time, data["SoundAvValue"].value,
    label="Усредненный сигнал", size=(900,300), lw=2, st=:step,
    legend = :bottomright)
Out[0]:

算法计算正确后,开始在目标设备上执行代码。

将代码加载到 ESP 8266

要将代码上传到 ESP 8266,必须首先从开发的模型中生成代码。

In [ ]:
engee.generate_code( "$(@__DIR__)/esp8266_tg_sound_detect.engee",
                     "$(@__DIR__)/esp8266_tg_sound_detect_code")
[ Info: Generated code and artifacts: /user/start/examples/codegen/esp8266_tg_sound_detect/esp8266_tg_sound_detect_code

在指定目录下生成的文件将连接到用户草图esp8266_tg_sound_detect.ino 中。此外,我们还将在草图中定义宏、变量和接收信息处理功能,连接库并初始化 Telegram-bot。下载这些文件并使用 Arduino IDE 将其加载到 ESP8266 中。

在 ESP 8266 上执行代码

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

sound_sens.gif

向 Telegram 机器人发送包含指定命令的信息时,可以观察到以下机器人响应:

sound_sens_t.gif

从程序结果可以看出,Engee 模型中定义的算法在目标设备上得以重现。

结论

在本演示中,我们介绍了创建 Engee 模型的过程,该模型支持与控制器外围设备(模拟输入、串行端口和 WiFi 模块)配合使用。该模型还实现了:声音传感器模拟信号的处理、Telegram-bot 的配置和监控。

示例中使用的块