基于Node-Red和树莓派的物联网应用系统开发
2020-08-14庄进样
庄进样
一、引言
近年来物联网编程工具Node-Red和树莓派以学习门槛低、硬件成本低和具有趣味性的特点,在中职信息技术教学中倍受青睐。如广州市中职信息技术教研会在2019年举行了两期树莓派与人工智能机器人培训,全国职校信息技术技能大赛中职组在2018年和2019年举行了可视化智能控制系统设计与调试竞赛,该赛项的内容正是使用Node-Red编程工具和树莓派。
目前的中职物联网应用系统开发课程教学主要选择单片机和C语言作为开发工具,而本文则基于实践教学设计,介绍了如何使用可视化编程工具Node-Red和树莓派进行物联网应用系统开发。
二、树莓派和Node-Red
树莓派(Raspberry Pi)的尺寸只有信用卡大小,是为计算机编程教育而设计的微型电脑。它除了能代替日常桌面计算机的用途外,还能使用GPIO(General-Purpose Input/Output,通用输入/输出端口)为物联网应用提供很好的实践案例。官方推荐安装操作系统为基于Debian的Raspbian,该系统中预安装了Node-Red编程工具。
Node-Red是IBM开发的一个开源项目,以新颖有趣的方式将硬件设备、应用程序接口、在线服务连接起来,编程时只需要在浏览器中拖拽节点(Node),然后把这些节点用线连接起来,而数据则通过这些连线在节点间传递。节点是封装了特定功能的模块,核心节点会随Node-Red一起被默认安装,包括8个主要类别:输入、输出、功能、社交、存储、高级和Raspberry Pi。除了核心节点外,用户还可以在线安装其他节点,如仪表盘节点(node-red-dashboard)、DHT温湿度传感器(node-dht-sensor)等等。正是由于Node-Red这种简单、高效的编程方式,它被用作物联网的一种粘合剂并很快发展成为一种通用的、可视化的物联网编程工具。
三、系統功能设计
物联网应用系统以智能教室系统为例,实现的功能包括:在终端显示教室灯光当前的状态;进行开灯、关灯操作;显示教室实时的温度和湿度。除此之外,系统还能够设定温度的阈值,如果温度高于设定的值,系统则发出人声报警(“湿度太高,可以开空调”)和蜂鸣器鸣叫,并能够设定湿度的阈值,如果湿度高于设定的值,则自动打开排气扇进行抽湿。
四、硬件设计
现实智能教室功能的硬件主要包括树莓派、LED、DHT11温湿度传感器、蜂鸣器、12V排气扇、12V电源、继电器、杜邦线。然而因为树莓派GPIO输出不能达到12V,无法直接驱动排气扇,所以需要使用继电器进行电路转换。
树莓派提供40个GPIO引脚,通过它们输出高低电平或者通过它们读入引脚的状态:高电平或低电平。用户可以通过树莓派的GPIO口和硬件进行数据交互、控制硬件工作、读取硬件的工作状态信号等,GPIO引脚如图1所示。
图1树莓派的GPIO示意图
各种传感器和执行器在树莓派GPIO上的连接设计尽可能布局合理,减少线材交叉,达到方便编写程序又美观的目的。具体说明如下表1所示。
五、编程设计
(一)编程环境
Node-Red可视化编程在智能控制系统的应用,只需要拖拽节点,设置相应的参数,连接节点,即可搭建一个具备数据显示、处理与控制界面的控制系统,可用于通信与控制、物联网、互联网+等行业。Node-Red既可以下载安装在电脑中,也可以在安装了Raspbian操作系统的树莓派中直接使用,更多的安装使用方法可以参考官方网址https://nodered.org/docs/getting-started/,也可以使用在线版Node-Red,如:在浏览器中输入网址https://goiot.cc/,注册登录后即可开始Node-Red的编程之旅。
因为本智能教室系统以树莓派为控制中心,所以更方便的编程方式是在树莓派中开启Node-Red服务,然后在同一局域网中电脑端的浏览器中访问http://<树莓派IP>:1880/即可进行Node-Red程序编写,以及访问http://<树莓派IP>:1880/UI即可运行用户交互界面。
(二)显示和交互界面
仪表盘节点(Dashboard)主要用于创建实时图形化交互界面,与其它节点安装类似,在菜单中的“节点管理”中“安装”选项卡中输入“dashboard”,找到名为“node-red-dashboard”并点击安装即可。
仪表盘的布局由Tab和Group两个属性组成。Tab相当于分页,Group是分组,每个Tab中可以包含多个Group。智能教室系统设置一个Tab,命名为:智能教室;设置三个Group,分别命名为:灯光控制、湿度控制、温度控制。每个Group包括dashboard的若干个节点:
灯光控制:text节点,用于显示当前灯光的状态(亮或灭);button节点两个,分别对应开灯和关灯的按钮。
温度控制:text节点,用于显示当前设置阈值;slider节点,用于调节温度的临界值,即当教室的温度高于设定的阈值时,触发蜂鸣器鸣叫和人声报警(人声报警使用文字转语音节点实现);guage节点,用于显示教室的实时温度。
湿度控制:与温度控制类似,当环境湿度高于设置的阈值时,自动开启排气扇进行抽湿。
智能教室系统的显示和交互界面,如图2、图3所示。
(三)灯光控制程序
开灯和关灯使用节点button,控制树莓派引脚使用节点rpi-gpio out。在开灯节点button发送有效载荷设置为数字1(高电平),关灯节点button发送有效载荷设置为数字0(低电平)。然后分别从两个节点button右边的小方块拉出连接线,并连接到节点rpi-gpio out左边的小方块,如图4所示。
灯光LED的正极与引脚40-GPIO21相连,因此可以初始化该引脚为低电平(0),使灯光处于灭的状态。当用户点击“开灯”时,数据流向右边发送,使引脚40-GPIO21处于高电平状态,从而点亮教室的灯光;当用户点击“关灯”时,数据流向右边发送,使引脚40-GPIO21处于低电平状态,从而熄灭教室的灯光。
变量msg.payload是从上一流程中接收到的有效载荷,最终函数返回对象msg,实现其转换后的有效载荷往下一流程发送。完成后的灯光控制程序,如图5所示。
图5灯光控制的程序
(四)获取并显示温湿度程序
获取连接到树莓派引脚温湿度传感器DHT11的数据,需要安装节点rpi-dht22(支持dht11和dht22)。值得注意的是:智能教室的温湿度数据并不是获取一次就终止了,而是按一定的时间间隔(如5秒)重复地获取实时数据并在终端上更新。
节点inject能以有规律的时间间隔向下一节点发送消息,该消息中的有效载荷可以是字符串、Javascript对象或者当前时间等。把节点inject发送的内容设置成当前时间,并每隔5秒执行一次,正符合我们的设计要求。
节点rpi-dht11获取到的温度数据包含在msg.payload中,而获取到的湿度数据则包含在msg.humidity。为了在仪表上能分别显示温度和湿度,可以使用节点function编写Javascript代码进行有效载荷的转换,温湿度显示的程序如图6所示。
(五)温湿度与报警的联动程序
在智能教室系统中,当温度高于设定的阈值时,将会触发报警,蜂鸣器鸣叫,同时把警示文字转换成语音在终端中播放;当湿度高于设定的阈值时,将会触发继电器接通排气扇进行抽湿。
以温度高于阈值报警为例,用户设置的阈值保存为函数节点中的全局变量,代码为:flow.set(‘yuzhi_wendu,msg.payload)。在下一节点的函数中则获取上一节点的全局变量后存放于新的变量yuzhi_wendu中,如果获取失败,则赋值26,代码为:varyuzhi_wendu=flow.get(‘yuzhi_wendu)||26。实时温度与用户设置的阈值相比较,使用else-if条件分支语句进行判断,程序如图7所示。
湿度高于用户设置的阈值时将会触发排气扇抽湿的程序,与温度高于阈值时将会触发报警程序的原理一致,只需要在上述程序基础上修改少量代码即可实现。
六、结语
用于实践教学设计的中职物联网应用系统开发,因使用Node-Red和树莓派而变得简单和有趣,又因以智能教室为例,是学生所熟悉的情境,能够较好地促进教学目标的达成。基于Node-Red和树莓派学习开发智能教室系统,能帮助学生掌握物联网应用系统开发的基本方法,同时,通过替换、增加传感器和融入更多的Node-Red节点,使学生能够開发功能更加完备的应用系统,从而更好地进行创新创业活动。
责任编辑陈春阳