基于STM32的物联网智能家居系统设计
2022-04-12解乃军
岳 骏,解乃军
(南京工程学院,江苏 南京 211167)
0 引言
在全球范围内,对高效能源利用的需求不断增加[1]。此外人们对工作或其他活动的流动性增加,导致对远程监控家庭技术和条件的需求逐渐增加。为了满足这些需求,人们主张使用智能家居解决方案,可以远程监控和控制家中设备。Waleed将智能住宅定义为“配备了先进智能技术的生活环境,可以根据住宅居民的需求进行操作和响应”[2]。
智能家居的自动化通常由分布式传感器和执行器以及一个中央微控制器组成。智能家居解决方案的一个关键因素是物联网、移动互联技术、云计算和传感器技术的快速发展。这与工业机械的监控和控制自动化方面息息相关,然而,尽管取得了显著的成就,智能家居仍然面临着购买昂贵、安全和隐私漏洞等问题和挑战。
1 系统方案
该文的智能家居系统的整体网络结构如图1所示。它主要分为ESP8266WIFI模块和嵌入式STM32接入互联网两部分。
图1 智能家居系统整体网络结构图
系统要实现网络远程控制,首先必须在互联网上建立一个服务器,该系统选用阿里云ECS服务器建立物联网云端服务器,利用EMQX的MQTT消息代理传输数据,其中MQTT是一种发布/订阅消息传递协议,设计用于受约束网络中的轻量级M2M通信。MQTT客户端将消息发布给MQTT代理,这些消息可以由其他客户端订阅,也可能会保留给将来的订阅。每个消息都被发布到一个地址,称为主题。客户端可以订阅多个主题,并接收发布到每个主题的每个消息,MQTT协议模型如图2所示。其次对手机端进行配置,利用Nod-vue前端框架制作微信小程序,并根据阿里云物联网服务器对微信小程序进行配置,使得微信小程序与服务器建立起TCP连接。然后对STM32外接ESP8266模块进行配置,并使其也与云端服务器建立起TCP连接[3]。
图2 MQTT协议模型
2 系统硬件设计
该文采用STM32F103C8T6作为主控芯片的核心板,并根据所需功能分为如下模块:BH1750光照度检测模块、DHT11温湿度检测模块、 MQ-135空气质量检测模块、OLED0561显示屏模块、按键模块、报警模块和ESP8266-01S无线WIFI模块等。
图3 硬件结构框图
2.1 单片机模块
STM32F103C8T6是一款32位基于ARM核心的带64K字节闪存的微控制器,需要电压2.0 V~3.6 V,工作温度为-40 ℃ ~ 85 ℃。STM32 处理器具有睡眠模式、停机模式、待机模式三种低功耗模式单片机在低功耗状态下唤醒时间可以达到微秒级[4]本设计中采用AT指令对 ESP8266WIFI 模块进行控制联网时,主要用到主控制芯片中的 UART 串口通信,主控制芯片UART 串口多达3个,完全满足每个设备的需求。
2.2 ESP8266WIFI模块
该模块的处理器为乐鑫公司研发的专用于物联网的一款芯片,其特点为成本低、功耗低、集成TCP/IP协议栈[5]。该模块供电范围2.5 V~3.6 V,工作电流为80 mA,供电接口处连接到3.3 V的稳压电路上,通信时必须保证电压稳定,不然容易造成设备与云端出现断连的情况。作为物联网应用的模块,它可以部署在家庭自动化、家用电器、工业无线网络等领域。
2.3 OLED显示模块
本系统选用的是128×64的OLED显示屏,该模块体型较小,性能较强,功耗低,刷新反应速度快适用于物联网设备的开发。此外低耗电及高对比度不仅可以节能,更增加了可视化界面美观性。结合主控制器的片上资源和该显示屏的优点,选用该 OLED 作为显示模块。
2.4 温湿度模块
温湿度检测采用的是DHT11。该传感器中复合了其特有的NTC,一个具有AD转换功能的芯片,以及在其末端与八位微控制器相连,三者联动。其中AD转换芯片负责将NTC采集到的模拟量转化为分别代表了温度与湿度的数字信息,并向微控制器输出实时性较强的串行数据。这使得该传感器易于与任何微控制器一起使用。湿度范围是20~90%RH,温度范围是0~50 ℃,满足家居环境的检测需求[6]。
2.5 光照度模块
光照度模块采用的是BH1750。BH1750是一种不需要区分的光源的数字光照度传感器。BH1750的集成电路是由两条线串行总线接口所组成,可以随时根据外部环境检测光照强度。BH1750同时具有范围较广的光照强度分辨率,达到1~65535lx,因此可以监测和收集大范围的光强变化,BH1750与主控制器之间的通信协议是标准的I2C通信协议。主控制器使用I2C接口发送各种控制命令,并向BH1750读取测量数据[7]。
2.6 空气质量模块
本设计选用对烟雾和其他有害气体检测较为理想的MQ-135空气质量传感器。适合多种应用场合的低成本传感器,可满足检测家居环境的有害气体检测装置[8]。当空气中有害气体浓度大于16PPM时,蜂鸣器会发出报警,并通过微信小程序并使手机震动15 s以提示用户。
2.7 蜂鸣器报警模块
蜂鸣器驱动方式为GPIO定时切换高低电平,蜂鸣器平时不工作,三极管由于I/O端口输出高电平从而截止。三极管由于I/O端口输出低电平从而导通,蜂鸣器内部线圈、扬声器振片也因此工作。上述GPIO每一次对高低电平的变换即为一个完整的频率周期,蜂鸣器工作本质正是上述周期的循环。报警信号产生的具体方法为:低电平0.5 ms,高电平也为0.5 ms,周期总时长为1 ms,即可产生一个周期为1 ms的1 kHz音频[9]。
2.8 LED模块
LED是一个发光的二极管。LED1与LED2的负极接地(GND),正极连接I/O端口。通过控制I/O端口的高低电平状态从而达到对LED的亮灭的控制。电阻R5和R6是限流电阻,使通过LED的电流不至于过大而导致损坏,同时也控制LED的亮度[10]。LED1在STM32智能家居系统中充当客厅灯,LED2在系统中充当报警时的灯光闪烁提示。
3 系统软件设计
系统软件部分主要由ESP8266WIFI模块,OLED显示模块,温湿度传感器模块,光照度模块,空气质量模块,外围设备控制模块所组成,程序开始后先要对各个模块进行初始化,然后进入监测控制程序,实时监测和控制被测对象,系统监测和控制部分程序流程图如图4所示。
图4 系统监测和控制部分程序流程图
3.1 传感器模块的软件设计
引用头文件是在编写主控程序之前必不可少的步骤,在引用所有需要调用的函数头文件后,所需的变量都应该在第一时间被定义或复制,一方面能增加程序的可读性,另一方面也便于后续程序中可以顺利的调用。设置是否报警的标志alarmFlag,报警器是否手动操作alarm_is_free,发送和订阅的内容等,然后开始初始化函数,例如设置中断优先级分NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2),波特率设置为115200, ADC函数,TIM定时器中断函数,LED,BEEP,OLED,初始化延时函数,光敏电阻传感器调用函数,初始化USART串口等。
3.2 ESP8266WIFI模块的软件设计
首先初始化ESP8266,随后将其设置成AP工作模式,并启动多连接,最后设置开启服务器模式。接入阿里云服务器的循环while(AliNet_DevLink()),蜂鸣器鸣叫提示接入成功。ESP8266模块初始化函数如下:
Void ESP8266_Init(void)
{
ESP8266_Clear();
UsartPrintf(USART_DEBUG, “0.AT ”);
While(ESP8266_SendCmd(“AT ”,“OK”));
delay_ms(500);
UsartPrintf(USART_DEBUG, “1.RST ”);
While(ESP8266_SendCmd(“AT+RST ”,“”));
delay_ms(500);
While(ESP8266_SendCmd(“AT+CIPCLOSE ”,“”));
delay_ms(500);
UsartPrintf(USART_DEBUG, “2.CWMODE ”);
While(ESP8266_SendCmd(“AT+CWMODE=1 ”,“OK”));
delay_ms(500);
UsartPrintf(USART_DEBUG, “3.AT+CWDHCP ”);
While(ESP8266_SendCmd(“AT+CWDHCP=1 ”,“OK”));
delay_ms(500);
UsartPrintf(USART_DEBUG, “4.CWJAP ”);
While(ESP8266_SendCmd(ESP8266_WIFI_INFO,“GOT_IP”));
delay_ms(500);
UsartPrintf(USART_DEBUG, “5.CIPSTART ”);
While(ESP8266_SendCmd(ESP8266_ONENET_INFO,“CONNECT”));
delay_ms(500);
UsartPrintf(USART_DEBUG, “6.ESP8266 Init OK ”);
}
结束主程序所需调用函数的初始化工作后,为了使程序系统正常运行,需使用while不断循环。使用if判断语句对数据获取进行设置,数据获取的时间为每5秒获取一次温湿度,光照度,空气质量的数据。设备侧将获取到的数据通过基于TCP的MQTT协议上传数据到devPubTopic,并订阅下行命令devSubTopic以接收下行命令;用户侧同样通过基于TCP的MQTT协议订阅设备上行数据devPubTopic获取数据并下发命令至devSubTopic。程序串口调试图如图5所示。
图5 程序串口调试图
4 系统原型测试
通过对系统原型的各项验证测试,系统能够顺利运行。首先对STM32单片机通电,运行各个传感器模块,STM32通过ESP8266WIFI模块接入网络,连入阿里云ECS物联网云平台。当网络配置成功后,传感器所接受到的数据通过MQTT协议传输至云平台,小程序最终接收这些数据。打开小程序的人机交互界面,可以实时监测控制家中情况和设备,当传感器检测到的数据参数不符合所设定的阀值时,小程序会发出警报使手机持续震动,并通过微信小程序订阅消息发送相关的报警信息,同时家中的设备也会通过蜂鸣器和LED2发出警报。智能家居系统微信小程序及报警提示如图6所示。
图6 微信小程序显示及报警提示图
图7为小程序所存储的历史数据,将历史数据绘制成折线图,通过折线图可以直观的观察家中环境的变化情况。
图7 历史数据折线图
5 结语
该文设计的一套基于STM32的物联网智能家居系统,通过STM32远程控制家庭里的设备来调节出家庭比较舒适的居住环境,使家居自动化。其中包括从传感器获取数据并最终显示在微信小程序中等等,重点在于代理的发布/订阅消息传递协议MQTT与终端进行连接,利用EMQX的MQTT消息代理达到向阿里云ECS服务器传输数据的目的,其特点是低开销、异步通信;低复杂度和低功耗。同时,利用Nod-vue前端框架制作微信小程序,并根据阿里云ECS服务器对微信小程序进行配置,使得微信小程序与服务器建立起TCP连接。在建立的模型中,产生数据的客户端((publisher)将数据转发给终端用户设备(微信小程序)。该智能家居系统在未来的使用中还可以扩展接口,使用更多的传感器,来收集环境信息数据,从而覆盖到人们生活的各个角落,为人们生活提供更多的便利。