Sonoff Basic 的可视化编程

Sonoff Basic 的可视化编程
一篇关于如何用廉价的中国设备创建可编程逻辑控制器的文章。 这种设备将在家庭自动化和学校计算机科学的实践课程中得到应用。
作为参考,默认情况下,Sonoff Basic 程序通过中国云服务与移动应用程序配合使用;在建议的修改后,与该设备的所有进一步交互都可以在浏览器中进行。

第 I 部分. 将 Sonoff 连接到 MGT24 服务

第 1 步:创建控制面板

在网站上注册 管理24 (如果尚未注册)并使用您的帐户登录。
登录Sonoff Basic 的可视化编程

要为新设备创建控制面板,请单击“+”按钮。
创建面板的示例Sonoff Basic 的可视化编程

创建面板后,它将出现在您的面板列表中。

在创建的面板的“设置”选项卡中,找到“设备 ID”和“授权密钥”字段;将来在设置 Sonoff 设备时将需要此信息。
选项卡示例Sonoff Basic 的可视化编程

步骤 2. 重新刷新设备

使用实用程序 XTCOM_UTIL 下载固件 PLC 索诺夫基本型 到设备,为此您需要一个 USB-TTL 转换器。 这里 指令 и 视频教学.

步骤 3. 设备设置

给设备通电,待 LED 亮起后,按住按钮直至 LED 开始周期性均匀闪烁。
此时会出现一个名为“PLC Sonoff Basic”的新Wi-Fi网络,将您的计算机连接到该网络。
LED指示说明

LED指示
设备状态

周期性双闪
没有连接到路由器

持续发光
与路由器建立连接

周期性均匀闪烁
Wi-Fi 接入点模式

熄灭了
无电源

打开互联网浏览器并在地址栏中输入文本“192.168.4.1”,进入设备的网络设置设置页面。

填写字段如下:

  • “网络名称”和“密码”(将设备链接到您的家庭 Wi-Fi 路由器)。
  • “设备 ID”和“授权密钥”(用于在 MGT24 服务上授权设备)。

设置设备网络参数示例Sonoff Basic 的可视化编程

保存设置并重新启动设备。
这是 视频教学.

步骤 4. 连接传感器(可选)

当前固件最多支持四个 ds18b20 温度传感器。 这里 视频教学 用于安装传感器。 显然,这一步是最困难的,因为它需要直臂和烙铁。

第二节。 可视化编程

第 1 步:创建脚本

用作编程环境 块状,该环境易于学习,因此您无需成为程序员即可创建简单的脚本。

我添加了用于写入和读取设备参数的专用块。 任何参数都可以通过名称来访问。 对于远程设备的参数,使用复合名称:“参数@设备”。
选项下拉列表Sonoff Basic 的可视化编程

循环打开和关闭负载 (1Hz) 的示例场景:
Sonoff Basic 的可视化编程

同步两个独立设备操作的脚本示例。 即,目标设备的继电器重复远程设备的继电器的操作。
Sonoff Basic 的可视化编程

恒温器场景(无迟滞):
Sonoff Basic 的可视化编程

要创建更复杂的脚本,您可以使用变量、循环、函数(带参数)和其他结构。 这里就不详细描述了,网上已经有很多了。 有关 Blockly 的教育材料.

第 2 步:脚本顺序

脚本不断运行,一旦到达终点,就会重新开始。 在这种情况下,有两个块可以暂时暂停脚本,“延迟”和“暂停”。
“延迟”块用于毫秒或微秒延迟。 该块严格保持时间间隔,阻塞整个设备的运行。
“暂停”块用于第二(或更少)延迟,并且它不会阻止设备中其他进程的执行。
如果脚本本身包含无限循环,且其主体不包含“暂停”,则解释器会独立启动短暂的暂停。
如果分配的内存堆栈耗尽,解释器将停止执行这种耗电的脚本(小心递归函数)。

第三步:调试脚本

要调试已加载到设备中的脚本,您可以逐步运行程序跟踪。 当脚本的行为与作者的意图不同时,这可能非常有用。 在这种情况下,追踪可以让作者快速找到问题的根源并纠正脚本中的错误。

调试模式下计算阶乘的场景:
Sonoff Basic 的可视化编程

调试工具非常简单,由三个主要按钮组成:“开始”、“向前一步”和“停止”(我们也不要忘记“进入”和“退出”调试模式)。 除了逐步跟踪之外,您还可以在任何块上设置断点(通过单击该块)。
要在监视器中显示参数(传感器、继电器)的当前值,请使用“打印”块。
这是 概览视频 关于使用调试器。

好奇的部分。 引擎盖下是什么?

为了使脚本能够在目标设备上运行,开发了一个字节码解释器和一个包含 38 条指令的汇编器。 Blockly 的源代码内置了一个专门的代码生成器,可以将可视块转换为汇编指令。 随后,该汇编程序被转换为字节码并传输到设备执行。
这个虚拟机的架构非常简单,没有什么特别的描述点;在互联网上你会找到很多关于设计最简单的虚拟机的文章。
我通常为我的虚拟机的堆栈分配1000字节,这足够备用。 当然,深度递归可以耗尽任何堆栈,但它们不太可能有任何实际用途。

生成的字节码非常紧凑。 例如,计算相同阶乘的字节码只有 49 个字节。 这是它的视觉形式:
Sonoff Basic 的可视化编程

这是他的汇编程序:

shift -1
ldi 10
call factorial, 1
print
exit
:factorial
ld_arg 0
ldi 1
gt
je 8
ld_arg 0
ld_arg 0
ldi 1
sub
call factorial, 1
mul
ret
ldi 1
ret

如果表示的汇编形式没有任何实用价值,那么“javascrit”选项卡恰恰相反,比视觉块给出了更熟悉的外观:

function factorial(num) {
  if (num > 1) {
    return num + factorial(num - 1);
  }
  return 1;
}

window.alert(factorial(10));

关于性能。 当我运行最简单的闪存脚本时,我在示波器屏幕上看到了 47 kHz 方波(处理器时钟速度为 80 MHz)。
Sonoff Basic 的可视化编程Sonoff Basic 的可视化编程
我觉得这已经是一个不错的结果了,至少这个速度比之前快了差不多十倍 LUA и 埃斯普鲁伊诺.

最后一部分

总而言之,我想说的是,使用脚本不仅允许我们对单独设备的操作逻辑进行编程,而且还可以将多个设备连接到单个机制中,其中某些设备会影响其他设备的行为。
我还注意到,所选择的存储脚本的方法(直接在设备本身中,而不是在服务器上)简化了将已经工作的设备切换到另一台服务器,例如切换到家庭 Raspberry,这里 指令.

仅此而已,我很高兴听到建议和建设性的批评。

来源: habr.com

添加评论