电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
基于Node-Red和MQTT智能家居应用基础——OrangePi Zero2测试
分 享
扫描二维码分享
基于Node-Red和MQTT智能家居应用基础——OrangePi Zero2测试
orangePi
opizero2
我爱下载
关注
发布时间: 2021-02-04
丨
阅读: 2309
为了构建一个家居智能化的平台,OrangePi Zero2将起到关键的作用,包括:MQTT数据服务器,数据中心,通过node-red实现的逻辑判断和控制核心等。 ![](https://cf03.ickimg.com/bbsimages/202102/17d4a344b8112ca337fe114c830c8f95.jpg) 基本构成关系图 # Node-Red的控制实现 ## 通过串行接口Modbus有线连接 Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。通俗的讲,Modbus的本质就是通过寄存器、线圈与其它设备交换数据。 这种协议本身不是我们研究的重点,重点在于通过Node-Red环境通过Modbus协议对设备的操作过程。 ## Node-Red安装Modbus控制节点 按照前述方法,搜索下图所示的Modbus节点,安装。 ![](https://cf03.ickimg.com/bbsimages/202102/15599616ac52cd6848eaf07c247a8a96.jpg) 安装后系统将会出现与Modbus通讯过程有关的所有节点。 ![](https://cf03.ickimg.com/bbsimages/202102/78ca672942983d1b8a3f446773453f18.jpg) ## 基本连接关系 很明显,我们的OPIZero2是这个节点中的主设备,也就是Client端,被控制设备时从设备,Server端。基本线路连接关系如下图所示。 ![](https://cf03.ickimg.com/bbsimages/202102/559ced48561f64d983eb1e38ffc2620c.jpg) OrangePi Zero2的串口5(对应设备/dev/ttyS5)连接到被控设备的串口收-发-地的三个端子上。注意TX和RX两线要交叉连接。 这种采用TTL电平方式的连接是不能用于实际使用的,实际中需要将他们变为RS485接口方式与外部设备连接。但是使用方法几乎没有差别。 ## 使用方法 这里以串口modbus的线圈写进行说明。 1) Modbus-client节点配置 类型为串口,选择前面我们指定的串口/dev/ttyS5。串口类型选择为“RTU-BUFFERD”;串口波特率根据实际情况选择,这里填9600bps;Unit-id为辅机地址,根据操作辅机对象确定;Timeout时间推荐设置为1000ms。 ![](https://cf03.ickimg.com/bbsimages/202102/933ee0424d28825567b594f74acc9289.png) 2) 读线圈状态 ![](https://cf03.ickimg.com/bbsimages/202102/e868d6dd17416c1793a76ed30265c098.jpg) 如图所示,首先放入一个“inject”输入节点,并且配置为周期性循环执行,执行周期为3s。 其次,放入一个“function”函数节点,同时编辑函数节点内容为: msg.payload = { 'fc':1, 'unitid':1, 'address':0, 'quantity':5, }; return msg; 然后,放入“modbus-flex-getter”节点,该节点有两个输出端点,端点1为执行命令后的数据输出;端点2为执行后的modbus响应数据。 最后,放入“modbus-response”节点和一个“debug”节点,用来观察输出结果。 所有节点放置完成后,通过数据流线将节点按照数据流向连接起来。 3) 写单线圈 ![](https://cf03.ickimg.com/bbsimages/202102/3df2ed1881e68e21bd35c92ab1aedcd6.png) 如图所示,首先放入一个“inject”输入节点,作为触发信号。 其次,放入一个“function”函数节点,同时编辑函数节点内容为: m var value = context.get('Coil-0')||0; if(value == 1) { value = 0; } else { value = 1; } context.set('Coil-0',value); msg.payload = value; return msg; 然后,放入“modbus-write”节点,该节点有两个输出端点,端点1为执行命令后的数据输出;端点2为执行后的modbus响应数据。 最后,放入“modbus-response”节点和一个“debug”节点,用来观察输出结果。 所有节点放置完成后,通过数据流线将节点按照数据流向连接起来。 运行效果展示 通过在线的调试窗口,观察到线圈状态获取和单线圈置位的实际信息反馈。 ![](https://cf03.ickimg.com/bbsimages/202102/d86f05f9810e1fde557b9c6eb6073f6a.jpg) 实际置位后,执行端的显示效果为绿色指示灯点亮和熄灭。 ![](https://cf03.ickimg.com/bbsimages/202102/f84b4c040bfa4e45e7ba3169ceb4fb48.jpg) ![](https://cf03.ickimg.com/bbsimages/202102/b08e8cade36cc031dd9c87e91df9ea75.jpg) # 通过MQTT接口实现数据获取和控制输出 前面的评测内容中,我们以将建立了MQTT Broker环境,现在我们利用Node-Red通过mqtt完成数据的采集和控制数据。其中会用到dashboard在网页上展示获取到的采集数据,可以控制状态输出及辅助控制控制输入。 通过MQTT采集环境温湿度 ## 1) 采集设备。 硬件采用设备为ESP32板+温湿度传感器。采集设备命名为device1,它向mqtt broker推送/home/device1/value主题,主题将温度和湿度数据组织为一个json字符串。间隔5s更新测量到的数据。同时ESP32订阅一个主题为/home/out1作为未来控制需要预留。 采集设备通过串口中断打印的相关信息。 ![](https://cf03.ickimg.com/bbsimages/202102/1ab052cc45ffffdd6f9c8b363c930815.png) MQTT Paho接收和发送的mqtt主题消息。 ![](https://cf03.ickimg.com/bbsimages/202102/d88b9b02cd4acccd33b9e08460160fc7.png) 通过如上的验证,可以明确目前采集设备工作正常,且可以通过第三方的设备检验到正确的消息传递。 ## 2)Node-Red通过MQTT获取温湿度数据。 ### mqtt in节点配置 在Node-Red的左侧节点栏中,找到入下图所示的mqttin和mqttout图标。 ![](https://cf03.ickimg.com/bbsimages/202102/a17ee97cc5c0a1b7a548bbbaf25e8d65.png) 我们首先拉取mqttin图标,并添加一个Function节点和两个dashboard表计输出。 ![](https://cf03.ickimg.com/bbsimages/202102/d37691742fadd17807586c710697e7f5.png) mqttin节点配置。 双击mqttin节点,打开编辑界面,输入主题为前面采集设备推送的主题“/home/device1/value”,在点击“服务端”末尾的笔状图标, ![](https://cf03.ickimg.com/bbsimages/202102/2e435460d4115d862c013b79ea1d5ba7.png) 出现mqtt-broker节点编辑框。因为我们的node-red运行于orangepi zero2本地,因此服务端地址可以写为“127.0.0.1”,如果不是的话,此处需要填入mqtt-broker服务器运行的真实网络地址。端口号设置为“10000”,默认的端口号是1883,但是前面在构建mqtt-broker时,我们在配置文件中把mqtt服务器的端口号改为10000了,所以这里也要跟着一起改。 ![](https://cf03.ickimg.com/bbsimages/202102/699e4494c510728ea05cb22e8ad70235.png) 配置完成后,点击“添加”按钮,我这里因为已经配置,所以右上角的图标为更新。到这里mqtt消息接收的节点配置完成。 ### json数据解析 mqtt in接收到的主题消息是一个json字符串,我们需要解析这个json消息后输出。这里通过一个Function节点完成json字符串的解析。 双击Function节点,在函数栏中添加如下内容,选择输出为2个。 ![](https://cf03.ickimg.com/bbsimages/202102/8449999ff8d60aacfc69da4098904773.png) 由于node-red本质是node.js,所以可以通过js的函数进行数据解析。我们输入的json字符串存储在msg.payload中,通过JSON.parse(string)将json字符串转为json对象,由于传输过程中用的是整数表达的温湿度值,所以这里通过除100.0将整数转为浮点数,并分别将温湿度值放置到两个临时变量里面。 由于这里的输出为2路,温度和湿度分别通过不同的输出端口输出,所以需要对输出消息重新构造。 这里我遇到了一个问题,原希望直接将两个数值添加到输出载荷中返回,但是实际系统并不允许这样处理,必须构造两个消息,将数据分别赋给两个消息的payload变量,再将两个构建的消息数据才可以。 var msg1 = {payload:temp}; var msg2 = {payload:humi}; ### dashboard表计显示 从左侧dashboard节点栏中,拖入gauge节点。 ![](https://cf03.ickimg.com/bbsimages/202102/f2f8e758c791d459eaaa54862b6bbeea.png) ![](https://cf03.ickimg.com/bbsimages/202102/116d431770e102a64ee61921cfbcba1d.png) 双击gauge图标,在编辑gauge节点的界面上,将Size右侧的选择框,如图所示选择3x3的格,这个大小根据自己在网页上的显示情况自己调整和编辑。 ![](https://cf03.ickimg.com/bbsimages/202102/a0a4584c4d6c80654567fdd1d520c0a5.jpg) Label栏中输入你希望在网页上看到名称,我这里输入“温度”。Range范围为表计的显示范围,根据实际情况调整,这里温度范围为-25到100摄氏。这里值得一提的是,Colour gradient可以根据输入数据大小的变化,让表计上显示不同的颜色,例如,我这里将-25到25度显示为蓝色,表示较冷,25到30度显示绿色,表示较为适宜,30到100度显示为红色,表示较热。 这些信息设置完成后,还有一个极其重要的设计,开头的那个Group栏的设置。点击右侧笔状图标。 ![](https://cf03.ickimg.com/bbsimages/202102/d771292f4c741fb63ddf9ef890d122fb.png) 在编辑dashboard group节点页面上,我们在Name栏输入希望在网页上看到的字符串,我这里输入“室内环境”。然后继续点击Tab栏右侧的笔状图标。 ![](https://cf03.ickimg.com/bbsimages/202102/7ffe5b3cce079f80d0f16246c718f3c0.png) 在Name栏中输入一个名字,我这里输入Home,表示网页显示的内容属于这个Tab页。设置完成后点击“添加”,这里已经设置过了,所以显示为“更新”。 所有内容设置完成后,点击右上角的“完成”按钮。同理我们在添加一个gauge节点用来显示湿度。 ### 连线。 所有内容配置完成后,通过数据流线,将这些节点的输出-输入连接起来。 ![](https://cf03.ickimg.com/bbsimages/202102/a23c1f8b8936168e5590d8c414c98fbe.png) 可以看到上面有蓝色的小点,我们只要点击“部署”按钮,就可以完成保存和部署,让系统运行起来。如果没有错误出现,系统会保存当前的实际,小蓝点也没有了。 # 系统运行展示 系统运行后包含两个界面,一个是node-red的编辑界面,一个是webServer界面。 进入webServer界面的方法是在node-red编辑界面的基础上在增加一个/ui,全地址为:localhost:1880/ui 在node-red中这里建立了两个流程,一个用来完成有线通讯下的输出控制,另一个流程为环境参数采集。 ![](https://cf03.ickimg.com/bbsimages/202102/742775a112eeba71ca3c68a60d8a9628.png) ![](https://cf03.ickimg.com/bbsimages/202102/6c34617ce4687b8a6ba4969a5ec12265.png) 部署后,可以通过登录webServer界面观察到实际采集到的环境参数。 ![](https://cf03.ickimg.com/bbsimages/202102/85147055d277ea16ccd9a0aa88397464.png)
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
我爱下载
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交