基于Arduino的物联网家居硬件系统设计与实现
2023-03-06谢明玮李里程彭善琼
谢明玮,李里程,彭善琼
(湖南第一师范学院 计算机学院,湖南 长沙 410205)
0 引 言
现阶段物联网家居系统主要采用硬件模块化设计,系统由单片机、低功耗通信硬件等组成,在房间或区域部署不同类别的传感器,用于监测温度、气体等环境数据,并利用手机终端APP客户端分析数据后将数值反馈给使用者,例如NEST HOME系统、“智能家庭”系统等。这些系统的弊端是硬件价格高昂,因此,本文尝试利用近些年在国内外创客领域、高校流行的开源硬件平台技术[1-5],设计与构建了一款融合多传感器的物联网家居硬件“IoT家居小盒子”及配套软件,以探索低成本物联网家居硬件系统开发的可行之道。
1 系统整体设计
系统由硬件控制子系统、软件操作子系统构成。两个系统共同实现了输入设备的信号采集与分析功能。硬件控制子系统通过开发板与传感器、执行件等电子零件连接,实现环境数据的采集检测与用户反馈等功能。软件操作子系统在硬件控制子系统的基础上,采用蓝牙模块,以无线传输的方式将数据反馈至手机端应用程序,便于用户不受时间、位置等限制查看居家环境信息。系统总体架构设计如图1所示。
图1 系统总体架构
2 子系统详细设计
硬件控制子系统由Arduino开发板(主控制器)、传感器模块、执行件模块、红外遥控模块组成,如图2所示。
图2 硬件控制子系统架构
传感器模块用于系统获取环境检测数值,传感器一般有3个引脚,一个正极、一个负极和一个数据接口,它与Arduino开发板的连接十分便捷,对应正负极,确定传感器的数据传输为模拟信号或数字信号,再将数据引脚连接至开发板相应区域的接口处即可。硬件控制子系统使用的传感器模块主要包括以下内容[6-7]:
(1)LM35温度传感器,用于监测环境温度,输出的电压与温度成线性关系,通过对温度数值的判断,系统可以提醒用户注意天气变化。
(2)DHT11湿度传感器,用于监测环境湿度,输出40 bit的监测数据,通过对环境湿度数据的提取,提醒用户防潮或注意保湿。
(3)MQ135气体传感器,用于检测环境空气质量,可以探测空气中是否含有氮气、烟雾、硫化物等气体,并且通知用户当前环境的空气质量等级,提醒用户通风换气;探测家中有害气体,如煤气、液化气、天然气等,用于家居安全保障,警示用户家中煤气泄漏等情况。
(4)火焰传感器,利用红外线接收管捕捉红外波长从而检测火焰值,同时可以检测环境中的光线强度,一是可以预报火情,二是提醒用户根据光线变化注意用眼卫生。
(5)振动传感器,通过检测硬件摆放位置附近与本体的微弱振动信号,反馈与告警用户。
执行件模块主要用于人机交互,提示用户操作成功与否,显示数据信息,为用户提供良好的交互体验。硬件控制子系统使用的执行件模块主要包括以下内容:
(1)RGB模块,采用HSB设置,通过色相/饱和度/亮度三要素发出不同颜色、不同明暗程度的灯光。通过不同灯光的切换,提醒用户在按下遥控器按键之后,开发板接收到红外遥控器传送的编码,给用户一个交互成功的反馈信息。
(2)LED模块,设定之后会显示警示红灯,当主控器监测到如火情、有害气体浓度高等危险情况时,会立即闪烁,警示用户注意安全。
(3)LCD模块液晶屏采用I²C集成电路总线的串行通信方式,有串行数据线SDA和串行时钟线SCL引脚,模块主要显示传感器监测的数值,并告知用户采取相应措施。
(4)8×8点阵屏,其由64个发光二极管组成,在用户遥控进入不同的功能子模块后,点阵屏会根据系统判断的结果进入不同的场景,显示不同的关联图标,实现交互目的。
(5)蜂鸣器,其与LED模块类似,均在险情发生时警告用户,当环境监测值达到风险阈值范围后,蜂鸣器发出警报,长鸣告警用户。
(6)扬声器模块,通过设定不同的频率,可以产生不同的音调与旋律,提升设备使用的趣味性。
硬件具备单机按键使用和远程遥控使用功能,通过红外遥控模块,用户可以直接进行硬件功能切换。红外遥控模块流程如图3所示。
图3 红外遥控模块流程
在图3中,硬件控制子系统设置了一个全局判断变量,启动系统之后会判别标志位,进入功能首页,执行件中的LCD屏幕显示欢迎界面。借助红外遥控器按键切换功能,开发板上连接的红外接收器会接收一个红外编码值,根据接收的编码值对全局标志位进行变更,完成一轮控制,紧接着循环判断标志位的值,进入相应的传感器功能模块,并开启下一个传感器的功能检测。
软件操作子系统是基于蓝牙无线通信技术开发的一款安卓移动端应用程序。该程序可以通过手机蓝牙模块与低功耗蓝牙模块无线连接,从而实现软硬件互联互通。应用程序的功能界面可以显示硬件传递的数据信息,并根据特定算法将数据信息有效利用,转化为符合用户阅读习惯的图文报告。软件操作子系统的功能模块设计如图4所示。
图4 软件操作子系统功能模块
3 硬件控制子系统
3.1 数据采集功能
硬件控制子系统需要获取传感器数据,之后对数据进行分析,最后驱动执行件依照分析结果响应。不同传感器的硬件特性不同,获取数据的格式也不相同,得到的数据均需进行处理,并使用不同的有效数值算法转为可利用数值。以DHT11湿度传感器数值获取与转换为例,在DHT.h文件代码中,read_data()函数先将开发板的D9引脚拉低18 ms再拉高40 μs,通知DTH11传感器输入数据,DHT11传感器收到信息后响应,向开发板传输1 B数据,存储在data变量中。当DTH11传感器出现持续50 μs的低电和20 μs的高电平时,传输数据为0,若高电平时长大于20 μs,则传输数据为1。divideData()函数将read_data()函数中读取的字节放入dhtSensor数组,共4个字节,分别代表湿度整数位、湿度小数位、温度整数位、温度小数位,最后在loop()函数中以十进制显示各字节数值。
3.2 用户反馈功能
分析判断传感器的有效数据后,执行件根据判断结果做出不同响应,实现硬件对用户的反馈。以点阵屏执行件功能实现为例,硬件使用8×8点阵屏,该点阵屏由64个发光二极管组成,当某一列置1电平,某一行置0电平时,其对应的二极管发光。该模块采用SPI协议与开发板通信,实现串行输入与并行输出控制点阵屏,因此可以基于点阵屏制作与展示简易的图标信息。开发点阵屏图标显示功能需要将点阵屏上的DIN数据接口、CLK时钟接口、LTH锁存接口分别连接到Arduino传感器扩展板的数字4、5、6引脚,VCC、GND分别连接传感器扩展板的任意一个正极、接地端口。以树形图标的制作为例,先将图标的点阵编码存在数组中,然后使用循环语句扫描点亮二极管。每个功能模块中都会调用该功能模块中对应的点阵屏显示头文件,并根据不同情形显示不同的图标,例如火焰报警模块功能在安全环境中会显示树形图标,当检测到有危险的情况时,则会显示警铃图标。
3.3 红外遥控功能
要实现硬件控制子系统中的红外遥控功能[8],在Arduino IDE中编写红外遥控测试代码上传到开发板后,可以按下遥控器按键,观察ComMonitor串口监视器中是否接收到正确的遥控器编码。其次,通过导入IRremote头文件,定义红外接收器引脚号SensorIRreceive,调用头文件IRrecv类创建一个红外接收对象IRrecv,在程序入口setup函数中开始运行监听红外代码enableIRIn()函数,接着循环判断,如果接收到红外遥控器发出的红外编码就将其以十六进制的格式打印在串口监视框中,然后调用resume()方法开始重新监听一段代码,最后得到遥控器所有按键值的编码。
得到所有遥控按键的编码值后,为每个按键设置特定响应动作,本系统选取6个按键作为硬件的响应按钮:PREV/NEXT按键,切换主功能模块(主界面、显示时间、播放音乐、显示温度、火焰报警、振动报警、红外检测);ENTER/BACK按键:硬件功能的确认与返回;VOL-/VOL+按键:调整硬件音量。调用IRremote头文件中的控制函数,接收判断红外遥控编码,增加自定义算法,实现标志位的变更。红外遥控功能控制流程如图5所示。
图5 红外遥控功能控制流程
4 软件操作子系统
4.1 应用程序界面
手机端应用程序的主界面由软件名称、连接设备、硬件功能、简介模块构成[9]。具体界面设计如图6所示。
图6 Android端应用程序主界面
应用程序“IoT家居小盒子”主界面中的软件名称和功能简介模块由TextView控件构建,中间连接设备模块是一个按钮控件,硬件功能模块区域是GridView布局,布局中镶嵌多个按钮子控件,每个按钮子控件对应一个标志位,点击某按钮后,通过识别其标志位找到对应按钮响应事件[10]。
4.2 蓝牙通信功能
蓝牙通信功能的实现需通过4个Java语言的源代码文件,如图7所示。newBleConnect文件的功能为注册广播,按钮点击事件中又分为连接设备、断开设备、扫描附近设备等,这些模块会发出不同的广播信号。BluetoothClientService文件中的onCreate函数用于处理接收到的广播信号;hanlder子线程用于发送广播信号,可以将接收的数据发送至各功能模块。manageConnectedSocket文件用于接发数据的处理,首先进行数据类型的转换,run函数中接收缓冲区数据,将数据划分,再发给对应的功能模块,write函数发送指令给硬件控制程序,cancel函数中关闭socket传输流,close函数用于清空数据缓冲区。ConnectThread文件用于连接子线程。
图7 蓝牙通信功能的源代码文件结构
4.3 功能模块组件
针对应用程序功能模块的实现,以有害气体功能模块为例,其使用界面如图8所示。实时数据显示389 ppm,可检测的化合物包含一氧化碳、甲烷、丙烷、丁烷等,室内通风后,可从折线图的示意中直观感受有害气体的含量持续下降。
图8 有害气体功能模块界面
其他检测功能模块与有害气体功能模块的代码结构类似,均包含2个函数,如图9所示。onStart()函数用于接收广播ACTION_DATA_TO_GAME和广播ACTION_CONNECT_SUCCESS,其中广播ACTION_DATA_TO_GAME用于接收数据的折线图显示,以及数据阈值判断。广播ACTION_CONNECT_SUCCESS用于通知其他模块数据接收成功。onCreate()函数用于响应topBar和接收数据按钮的点击事件,在接收数据按钮的点击事件中会携带harmgas模块的标识,发送广播ACTION_DATA_SERVICE,然后在有害气体功能模块的界面中显示有害气体的浓度值。
图9 有害气体功能模块的代码结构
5 结 语
本设计采用了硬件控制子系统与软件操作子系统相结合的方式,可以很好利用开源硬件平台实现低成本的物联网家居硬件系统开发。开发的设备原型经过长期测试,能够满足目标用户的基本需求。现阶段,硬件原型采集的所有数据都存于手机端应用程序,后期会通过搭建基于容器化技术的物联网设备云平台实现硬件与终端数据交互的远程传递。