陈俊龙,魏小镇,黄堪杰,陈嘉欣,黄映欣
(广东东软学院,广东佛山,528200)
随着社会经济不断发展以及人们生活节奏加快,智能家居的应用场景越来越丰富,智能家居使用和方便越来越受人们青睐。智能家居泛指以一个网关为总节点,多个传感器和控制终端为子节点,各子节点和总结点之间采用无线或有线方式进行通信的嵌入式自动化系统。旨在提高用户的生活水平,带给用户愉快的生活体验。但市面上的智能家居系统普遍存在价格高昂,功能花哨而不实用的特点,本课题针对这一痛点设计实验,实现部分日常生活实用价值较高的功能,例如日程定时提醒,全屋联动,家用电器的语音控制,线上控制,及定时开关等。
智能家居节点终端要求采用低功耗,分布式,允许有一定延迟的嵌入式系统及传感器。本文介绍了以低功耗芯片CC2530 为无线模块,STM32F103 芯片为总控(网关)通过路由和节点终端(STM32F103)的连接,结合语音识别模块,构建一套智能家居系统。
本套智能家居系统共包括两套主板和一个软件。门控板和网关主板采用射频通信,模拟物联网通信过程,后期会改用Zigbee(CC2530)完成无线通信开发。
图1 门控终端结构框图
门控终端采用12V 电池供电,通过LM2596 降压芯片将电压降为5V,3.3V 供入系统;射频模块采用MFRC-522模块进行读卡;2个独立按键模拟门铃(外侧)和开门按键(内侧);绿色指示灯亮起表示识别成功,红色指示灯提示识别失败;电磁锁采用12V 斜口电磁锁,电磁锁直接从电池取电;无线模块采用Zigbee 模块进行数据收发。
图2 网关终端结构框图
网关终端采用7.2V 电池供电,网关接收温湿度传感器(DHT11)的数据,并显示于OLED 屏幕上;独立按键可控制门控端电磁锁开关;无线模块接收门控终端的信息,照明电路可通过软件和语音控制,也可以通过按键控制灯亮灭;扬声器可播放门铃音乐和全屋闹钟,并发出语音提示;舵机电路控制窗户开合。
本系统采用7.2V 电池供电,单片机及各元器件采用3.3V 电压供电,且考虑到射频模块(Zigbee 模块)工作电流较大,因此电源方案采用LM2596S 为主方案,并同时预备AMS1117 为备用方案。以下介绍LM2596S 的设计思路:电源输入端接入7.2V 电池,输入端并联一个0.1μF 的滤波电容,将芯片的第5 脚接地使能输出,在输出端和GND 并联一个1N5824 钳位二极管,通过串联一个47μH 的电感,将3.3V 电压输入至单片机系统,为确保电压稳定,输出端电压要反馈至Feedback 脚,即芯片第4 脚。最后在输出端与GND 之间接入一个0603 封装的LED 和1k 的电阻,指示灯亮表示电压正常输出。为方便产品测试,将3.3V 电压和GND 等电源脚引出排针。
图3 大电流降压模块
图4 RFID 射频模块
图5 液晶屏接线
图6 E18 模组
射频模块采用RC522,采用SPI 总线进行通信,SPI 总线为全双工通信,在SCK 引脚上升沿时,将数据写入芯片或者读出数据。IC 卡靠近块后,RFID 模块将模写入数据到IC 卡,再从IC卡中将数据读出,然后将数据通过SPI总线发到单片机。
本项目采用中景园公司的OLED 液晶屏,屏幕SSD1306 驱动芯片,可使用I2C 和SPI 接口连接单片机进行通信。显示屏支持蓝,白,黄三种显示颜色。本项目使用I2C 接口的屏幕,减少驱动代码移植的难度,I2C 通信速度较低,主要用于显示部分调试信息。
Zigbee 模组采用深圳EBYTE 公司的CC2530 集成模组——E18-MS1。模块可支持4dBm 的发射功率,通信距离200 米内。该模块出厂默认带有自组网程序,支持上位机调试软件二次开发。E18 多节点组成的Mesh 网络具备组织、治愈功能,其路由可自动建立和维护;网络覆盖范围大、吞吐率高、可靠性强是该产品独特的优点。模块采用串口通信,连接到单片机USART3 进行开发。
语音模块采用JR6001,该模块采用单片机串口控制。模块1、2 脚为电源脚;3、4 脚分别连接单片机Tx 和Rx 引脚;第5 脚所接LED 为音频输出指示灯,当音频信号输出到6、7 脚时,指示灯会闪烁一次。U1 为排针接口,连接扬声器。
2 扇窗户采用舵机进行推拉开关,由于单片机引脚的电流不够,采用三极管构成共发射极放大电路进行电流放大。R2 和R3 为限流电阻,防止当I/O 口为高电平时,电流过大击穿发射极,D_PWMx 引脚已通过外接排阻上拉为高电平。当PWMx 引脚为高电平时,三极管发射极与集电极导通,D_PWMx 输出低电平;当PWMx 引脚为低电平时,三极管发射极与集电极截止,D_PWMx 输出高电平。因此该电路可形成一个反相器,即PWMx 占空比为80%时,D_PWMx 为20%。
指示灯采用排阻上拉连接单片机,减少元器件焊接难度。3 个指示灯连接I/O 口,用于调试排阻的2、3 号脚连接舵机电路进行上拉,LED4 为电源指示灯,排阻9 号脚连接单片机复位引脚RESET,同时并联一颗104 电容滤波。
照明电路用于为外接的USB 灯管提供足够的电流,本项目采用ULN2003 芯片,该芯片可提供每个输出口最高0.5A 的电流,可为系统照明灯电路提供足够的电流。LEDx网络接入单片机的I/O 口,右侧的输出口连接到USB 插座的负极,USB 插座正极直连电源,当LEDx 为高电平时,对应输出端为低电平,此时LED 灯条会被点亮,反之熄灭。
图7 JR6001 语音播报模块
图8 舵机驱动电路
图9 排阻构成的指示灯电路
图10 照明电路
图11 门控板软件框架
图12 网关板软件框架
门控板和网关板上层软件驱动软件主要分为以下部分:
(1)GPIO 配置:主要控制LED 指示灯和检测按键电平;
(2)RC522 射频卡:用模拟SPI 总线配置射频模块的各项参数,并实现寻卡,读卡识别卡号的功能;
(3)OLED 显示屏:使用模拟I2C 协议驱动屏幕,用于显示一部调试信息。
(4)电磁锁驱动:配置同普通I/O 口,但由于电磁锁通电时间不能过长,所以每次向锁芯通电的时间都设置为0.8 秒。
(5) 语音模块:JR6001 采用串口通信,AT 指令控制,采用单片机一路USART,配置为发送模式,波特率115200,通过串口AT 指令,可实现语音播报功能;
(6)舵机驱动:2 路舵机由单片机输出2 路低频率PWM驱动,初始化频率配置定时器工作频率,通过在循环函数中修改PWM 占空比可控制舵机打角。
(7)Zigbee 模块:采用串口+AT 指令控制,使用一路USART 配置为收发模式,开启接收中断。
3.2.1 门控板主程序
门控板主要完成IC 卡识别,串口3(Zigbee)指令识别,继电器开关,卡号比对的功能,工作流程如下:
(1)单片机上电后,对各模块进行初始化配置。
(2)初始化模块配置后,测试各模块功能;
(3)IC 卡寻卡,如果识别到IC 卡,则刷新RC522_ID_Buff 数组的卡号;
(4)串口3 识别指令,并配置相应的标志位;
(5)扫描按键状态,配置对应的标志位;
(6)识别Door_flg 标志位,若为1,则继电器通电0.8 秒;否则执行下一个流程;
(7)对当前IC 卡存储数组RC522_ID_Buff 中的卡号与存储在Card_One 数组中的卡号进行比对,卡号相通则将Success 写入显示屏;否则执行下一个流程;
(8)使用ReFlash 函数刷新屏幕数据;
(9)重复执行流程3-8。
图13 门控板主流程
3.2.2 门控板中断
门控板中断程序主要为串口中断,当串口收到数据时,自动触发。中断处理流程如下:
(1)进入中断后,首先识别接收中断标志位USART_IT_RXNE,是否为1,不为1 则,直接退出中断;
(2)若为1 则清除接收中断标志位USART_IT_RXNE;
(3) 将串口寄存器USARTx->DR 的数据进行读取;
(4)结束流程,退出中断。
图14 串口中断流程
3.2.3 网关板主程序
网关板主要完成,串口指令发送,按键扫描,LED 灯显示,ULN2003 驱动(电器开关)和PWM 输出(窗户舵机)等功能,工作流程如下:
(1)单片机上电后,对各模块进行初始化配置,时钟,定时器,GPIO,NVIC 中断,串口,OLED 显示屏;
(2)在初始化完成后,对各个模块进行功能测试,GPIO 全部拉为高电平,串口和OLED 显示屏打印“Hello World”;
图15 网关板工作流程
(3)对8 个按键依次扫描识别,识别到I/O 口为低电平则更新存储按键号,并进行信号处理;
(4)识别串口缓存数组的内容,识别出指令后,设置相应电器的标志位,随后清空缓存区;
(5)根据标志位,对LED 灯的I/O 口进行电平输出;
(6)根据舵机标志位,输出相应占空比的PWM 波形;
(7)根据标志位,对ULN2003 进行电平输出;
(8)刷新OLED 显示屏;
(9)重复流程3—8。
3.3.1 RC522 射频卡配置
在RC522 初始化流程中,首先对SPI 的4 个重要I/O口进行输入输出配置;然后通过SPI 总线对模块进行软件复位,将CS引脚置于低电平作选通使能。接下来二次复位之后,开始写入命令,配置模块。
在寻卡子流程中,首先调用PcdRequest 函数进行寻卡,寻卡结果返回到变量ucStatus 中。若ucStatus 为1,则表示寻卡成功,将卡号输出到ID 指针变量中,否则结束寻卡,退出该流程;流程图如图16 所示。
图16 RC522 模块软件初始化流程和寻卡流程
图17 OLED 初始化及显示流程示例
图18 电磁锁控制流程图
图19 舵机脉冲长度对应打角角度
RC522 各参数配置如下:
(1)工作方式:ISO14443-A;
(2)工作模式:接收和发送;
(3)内部定时器初值:30。
3.3.2 OLED 显示屏
中景园的OLED 显示屏,采用I2C 协议款,在初始化流程中,首先使能PB7 和PB8 所在的APB2 总线时钟;随后初始化2 个I/O 口为推挽输出模式;对OLED 进行软件复位之后,开始向显示屏芯片写入指令。
在主程序使用屏幕显示数据时,流程如下:首先调用OLED_ShowString 函 数, 指定字符串大小,坐标,字符串内容,将字符串数据写入OLED 的寄存器,在写入多个字符串之后,再刷新屏幕。由于屏幕刷新的时间比字符串写入的时间稍长,因此不建议每写入一次字符串,就对屏幕进行刷新,这样会导致单片机运行效率低下,将所有字符串更新到寄存器中,最后再对屏幕进行刷新,不仅节省运算资源,而且不会造成屏幕卡顿。经测试,该方案可行。
3.3.3 电磁锁驱动
电磁锁的初始化和LED 灯相同,采用推挽输出模式即可,初始化默认配置RELAY 引脚为高电平,此处不过多赘述;在电磁锁通电时,由于工作电流(0.7A)较大,为提高设备可靠性,锁头不可长时间通电。当RELAY 引脚为低电平时,继电器闭合,电磁锁通电,斜口舌收缩;反之亦然,因此控制单片机引脚高低电平,即可实现电磁锁开合。本项目设置电磁锁的通电时间为0.8 秒,程序流程如下:
(1)当判断到开门指令时,主程序中其他模块会将Door_flg 置1;
(2)当Door_flg 为1 时,首先将Door_flg 标志位清0,将RELAY 电平拉低800ms 后升回高电平;否则保持原高电平状态;
(3)流程结束。
3.3.4 语音模块
语音模块采用串口控制,共存储7 组指令,可播放7个音乐文件,指令表如下:
“A7:00001”——播放MP3 文件00001;
“A7:00002”——播放MP3 文件00002;
“A7:00003”——播放MP3 文件00003;
“A7:00004”——播放MP3 文件00004;
当串口发出对应指令给语音模块时,JR6001 播放对应的语音文件,语音文件按照相关规范命名。
3.3.5 舵机驱动模块
根据舵机的数据手册说明,舵机的脉冲周期约为2.5ms一个周期,通过不断改变脉冲在一个周期内的占空比,可调整舵机打角的角度,可由以下公式计算舵机的脉冲频率:
因此,当脉冲频率接近400Hz 时,舵机可稳定工作,400Hz 的脉冲,是舵机的最佳频率。STM32 的定时器输出脉冲频率公式如下:
fout:输出频率;SysClk:系统时钟频率,默认80MHz;P:分频系数;Cnt:定时器计数值。
本项目系统始终频率为80MHz,设输出脉冲fout为500Hz 时,计算出分频系数P为199,定时器计数初值Cnt为799。由于单片机系统从0 开始计数,所以Cnt为799 时,定时器每完成一次计数周期,正好计数800 次,分频系数取值同理。通过输出不同占空比的方波,舵机可精确打角到不同的角度。输出占空比的公式如下:
Value为比较寄存器(16bit)的数值,当定时器当前计数值小于Value时,通道输出为高电平;否则输出低电平。使用LL_TIM_OC_SetCompare 可修改每个通道的Value值,即可切换不同的占空比。由此可见,STM32 的定时器设计,在PWM不同占空比输出时,使用比51 单片机更简便。
本项目定时器3 配置如下:
(1)时钟源(Clock Source):内部时钟80MHz;(2)通道配置(Channel):通道3,通道4 配置为PWM 输出模式;(3)PWM 模式(mode)配置:模式一(普通PWM);(4)输出比较器(Output Compare):使能。
3.3.6 Zigbee 模块
Zigbee 模块预留USART 接口,通过串口通信实现数据无线透传,STM32 串口参数配置:
(1)通信波特率:115200;(2)数据长度:8 位;(3)将停止位:1 位;(4)校验位:无;(5)工作模式:收发模式;(6)校验模式:无CRC 校验。
备注:当收发设备的串口参数配置一致时,才能正常收发数据,通信波特率通常采用115200 和9600;在完成串口配置后,需要使用USART_Cmd,开启串口,并使用USART_ITConfig,使能串口接收中断。
将ZigBee 无线通信技术、RFID 射频识别技术与嵌入式技术融合,设计完成了一套智能家居控制系统。该系统的功耗低、性价比相对较高、操作简单,实现了部分日常生活实用价值较高的功能,例如日程定时提醒功能,全屋家电联动功能,家用电器的语音控制,线上控制,及定时开关等。但该系统的硬件部分还需要进一步完善,集成化的程度有待提高。