1 总体设计方案
1.1 需求拆解
随着社会经济、科技的发展和人们生活水平的提高,智能家居系统的需求日益增长。智能家居系统能够实现家庭设施的远程控制、自动化控制和智能化管理,为人们提供更加便利、舒适和安全的生活环境。STM32作为一款功能强大的微控制器,广泛应用于各种嵌入式系统开发。基于STM32的智能家居系统设计,以其高效、稳定和可靠的性能,成为当前智能家居领域的研究热点。
基于STM32的智能家居系统应具备以下功能:
(1)设备控制:实现对家庭设施的远程和自动化控制,如灯光、空调、门窗等;
(2)环境监测:实时监测室内温湿度、PM2.5、CO2等环境参数;
(3)安防监控:实现家庭监控、入侵报警、消防报警等功能;
(4)能源管理:对家庭能耗进行监测和统计,提供节能建议;
(5)语音控制:支持语音指令识别和控制。
系统应满足以下性能需求:
(1)稳定性:系统应稳定可靠,不易出现故障;
(2)实时性:系统应能实时响应控制指令和环境变化;
(3)扩展性:系统应具备可扩展性,以适应家庭规模和需求的不断增长;
(4)易用性:系统应易于安装、配置和使用,用户界面友好。
考虑到项目的复杂度,拟实现如下功能:
(1)设备控制:采集光照数据并控制灯光亮度和窗帘开闭,人体红外感应灯;
(2)环境监测:采集温湿度和空气质量数据并用显示屏显示;
(3)安防报警:采集烟雾数据并控制蜂鸣器报警模块;
(4)智能门锁:指纹解锁控制马达和锁芯;
1.2 整体实现及功能描述
本智能家居系统的设计分为主控制器、环境数据采集模块(温湿度、空气质量、光照、人体感应)、显示模块、智能门锁模块(指纹识别)、安防报警模块(烟感模块、蜂鸣器)和家庭设备控制模块(电灯、窗帘)等6部分组成。选用STM32F103VCT6作为主控制器,接收处理来自多个传感器的数据并作用于家庭设备,包括将DHT11温湿度传感器、MQ135空气质量传感器数据显示在OLED显示屏上,根据光敏传感器、HC-SR501人体红外传感器控制灯光亮度和窗帘开闭(用电机正反转表示),根据ATK-AS608指纹识别模块控制舵机和锁芯进行开门或非法闯入报警,根据MQ-2烟雾传感器数据进行火灾报警,报警采用有源蜂鸣器。


2 硬件设计
2.1 使用的嵌入式计算机(控制器)硬件资源
STM32F103VCT6是一款高密度性能ARM Cortex-M3 32位微控制器,100引脚LQFP封装。它包含72MHz运行频率高性能RISC核心,高速嵌入式存储器,以及连接至2条APB总线的增强型I/O与外设。其片内外设相当丰富,具有12位模数转换器、计时器、PWM计时器、标准与高级通讯接口、多种省电模式允许设计低功耗应用。256K字节闪存,48K字节SRAM;CRC计算单元,96位独特ID;3个12位,1us模数转换器(高达16条通道)与2个12位数模转换器;4个通用,2个高级控制与2个基础计时器;80个快速I/O端口;串行线调试(SWD)与JTAG接口;3个SPI,2个I2C,5个USART,1个USB,1个SDIO与1个CAN接口;环境温度范围:-40°C至85°C。
本项目中用到了GPIO、ADC、DMA、TIM、I2C、UART、NVIC、EXTI等多种外设,还有多个引脚冗余,便于后续升级改造、增加设备。
| 引脚 | 功能 | 外设使用 |
|---|---|---|
| PA1,2,3,4,5 | GPIO Input(读取传感器数据) | GPIO |
| PA6,7 PC4 | GPIO Output(电机驱动和蜂鸣器) | GPIO |
| PB0,1 | ADC1(模数转换) | ADC |
| PB6,7 | I2C1(操作OLED) | I2C |
| PC10,11 | UART4(指纹模块通信) | UART |
| PC5 | GPIO_EXTI外部中断(指纹锁) | GPIO |
| PE9,11 | TIM(输出PWM控制舵机,LED) | TIM |
| PA13,14 | SWD(调试) |


2.2 传感器原理
2.2.1 DHT11温湿度传感器
DHT11是一款含有已校准数字信号输出的温湿度复合传感器,采用集成式数字温湿度元件,应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。DHT11传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。
| 测湿范围 | 测温范围 | 测湿精度 | 测温精度 |
|---|---|---|---|
| 20-90%RH | 0-50℃ | ±5%RH | ±2℃ |
| PIN | 名称 | 注释 |
|---|---|---|
| 1 | VDD | 供电 3-5.5VDC |
| 2 | DATA | 串行数据,单总线 |
| 3 | NC | 空脚,悬空 |
| 4 | GND | 接地,电源负极 |

DHT11的供电电压为 3-5.5V。传感器上电后,要等待 1s 以越过不稳定状态,在此期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nF 的电容,用以去耦滤波。建议连接线长度短于20米时用5K上拉电阻,大于20米时根据实际情况使用合适的上拉电阻。
2.2.2 MQ-2烟雾传感器
MQ-2烟雾传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡。当烟雾传感器所处环境中存在可燃气体时,烟雾传感器的电导率随空气中可燃气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该烟雾传感器气体浓度相对应的输出信号。MQ-2气体传感器对液化气、丙烷、氢气的灵敏度高,对天然气和其它可燃蒸汽的检测也很理想。这种传感器可检测多种可燃性气体,是一款适合多种应用的低成本传感器。
| PIN | 名称 | 注释 |
|---|---|---|
| 1 | DOUT | 数字量输出,输出高电平5V |
| 2 | AOUT | 模拟量输出,相对无输出(0.1V-0.3V),高浓度(4V左右) |
| 3 | GND | 电源地 |
| 4 | VCC | 电源正(2.5V-5.0V) |

2.2.3 MQ135空气质量传感器
与MQ-2烟雾传感器类似,MQ135是测量空气污染情况常用的一个传感器,主要用于测量空气中二氧化碳,氮氧化物,氨气,酒精,苯类等。引脚也与MQ-2类似,不同的是MQ-2用于烟雾报警,只需设定一个阈值,主要用到数字量输出,而MQ135用于检测空气质量,并输出在显示屏上,主要用到模拟量输出,经过ADC转换成数字量并处理后,得到便于理解的数值。

2.2.4 光敏传感器
光敏传感器也称光电传感器,是利用光电器件把光信号转换成电信号(电压,电流,电阻等)的一种传感器。工作原理是光敏电阻串联进电路,两端加入合适的电压,在没有光照的时候,电阻无穷大,接近断路,有光照时阻值减少,电流加大,足够光照强度时相当于短路。引脚也与MQ-2类似,要获得亮度需要用到模拟量输出和ADC。

2.2.5 HC-SR501人体红外传感器
HC-SR501是基于红外线技术的自动控制模块,灵敏度高,可靠性强,超低电压工作模式,广泛应用于各类自动感应电器设备,模块为全自动感应,根据人体辐射出的波长大约在10000nm左右的红外线,从而感应出人体的接近与远离。当人进入其感应范围则输出高电平,人离开感应范围则自动延时关闭高电平,输出低电平。

功能及引脚说明:
- 时间延迟调节:旋钮形式,用于调节检测到当前红外后的延迟时间;
- 感应距离调节:旋钮形式,用于调节模块的灵敏度;
- 检测模式跳线:选择单次检测或连续检测;
- VCC:用于给模块提供电源,一般为5V;
- GND:接地引脚;
- 输出针脚:输出数字信号。
2.2.6 ATK-AS608指纹识别模块
ATK-AS608指纹识别模块内置DSP运算单元,集成了指纹识别算法,能高效快速采集图像并对指纹特征进行识别。该模块配备了串口和USB接口,用户无需研究复杂的图像处理及指纹识别算法,只需通过简单的串口、USB按照通讯协议便可控制模块。本文中主控板和AS608模块之间使用UART进行通信,实际使用过程中最少只需要使用VCC/TX/RX/GND四根引脚和主控板进行通信。
| PIN | 名称 | 注释 |
|---|---|---|
| 1 | VCC | 模块电源正极 |
| 2 | TX | 串行数据输出,TTL逻辑电平 |
| 3 | RX | 串行数据输入,TTL逻辑电平 |
| 4 | GND | 地线 |
| 5 | TOUCH | 触摸板感应信号,默认高电平有效 |
| 6 | UA | 触摸板电源输入,3.3V |
| 7 | D+ | USB D+数据线 |
| 8 | D- | USB D-数据线 |

2.3 执行器说明
2.3.1 有源蜂鸣器
有源蜂鸣器工作的理想信号是直流电,内部有一简单的振荡电路,能将恒定的直流电转化成一定频率的脉冲信号,从而实现磁场交变,带动铝片振动发音。用GPIO输出高低电平即可驱动。引脚有VCC、GND和控制信号。
2.3.2 L9110S电机驱动板和电机
HS-F04A电机驱动模块,由一个L9110S直流电机H桥驱动电路来驱动电机,工作电压范围覆盖2.5-12V,通道同时工作的条件下,通道最大持续输出电流达到0.85A,最大峰值输出电流达到2A,可驱动130马达和TT电机。A/B两路信号切换可使电机实现反转。
| PIN | 名称 | 注释 |
|---|---|---|
| 1 | IN-A | 信号输入A |
| 2 | IN-B | 信号输入B |
| 3 | VCC | 电源正 |
| 4 | GND | 地线 |
| 5 | OUT-A | 接电机一端 |
| 6 | OUT-B | 接电机另一端 |

2.3.3 MG996R舵机
舵机是一种角度(位置)伺服装置。当向伺服器发送一个控制信号时,输出轴就可以转到特定的位置。控制信号持续不变,角度位置不改变。控制信号可由PWM波给出,根据占空比的不同,舵机转动角度不同。引脚有VCC(红线)、GND(棕线)和控制信号(黄线)。选用MG996R舵机,扭矩:9kg/cm(4.8V),11kg/cm(6V);速度:0.19秒/60°(4.8V),0.18秒/60°(6V);转动角度:180°;工作电压:4.8 ~ 6V;重量:55g;尺寸:40.7mm×19.7mm×42.9mm。

2.3.4 OLED显示屏
OLED 是有机发光二极管的简称,以有机化合物制成的发光二极管。OLED 器件具有通过电流流动而发光的性质,本项目选取0.96寸黄蓝双色OLED模块通讯方式为IIC,分辨率为128*64。
表7 OLED显示屏引脚说明
| PIN | 名称 | 注释 |
|---|---|---|
| 1 | VCC | 电源正 |
| 2 | GND | 地线 |
| 3 | SCL | IIC时钟引脚 |
| 4 | SDA | IIC数据引脚 |

3 软件设计
3.1 软件设计流程

3.2 主函数
主函数首先要配置系统时钟、初始化各个外设、传感器、设置中断优先级分组,循环检测人体感应传感器控制灯的亮灭,检测烟雾传感器数值,过阈值报警。

3.3 子函数
涉及到的子函数模块有温湿度检测、空气质量检测、OLED显示、光照强度检测、LED亮度控制、窗帘(电机)控制、人体红外感应检测、烟雾检测、蜂鸣器报警、指纹锁模块(录入、比较、删除)、门锁(舵机)控制。其中,蜂鸣器和电机控制较为容易实现,只需要控制GPIO口的高低电平,不再赘述。空气质量检测、光照检测、烟雾检测、人体红外感应检测的思路类似,只以光照检测为例说明,LED亮度控制与舵机转动角度控制类似,都利用PWM波的占空比,只以舵机控制为例说明,下面对其他模块进行详细说明。
3.3.1 温湿度检测
1.初始化:根据DHT11通信过程时序图,总线处于高电平时,总线发出等待接收信号指令,拉低电平,等待DHT11响应,当低电平持续时间大于18us后,满足DHT11接收到信号的时间长度,DHT11开始接收主机的信号,当接收到主机开始信号后,发送80us低电平响应信号,主机发送开始信号后,等待大约30us后,读取DHT11反馈回来的信号,主机发送开始信号后,便可以切换到输入模式,也就是输出高电平,总线再由外界上拉电阻拉高电平。

主机发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集, 用户可选择读取部分数据。
2.读取数据:一次完整的数据传输为40bit,高位先出。
数据格式:8bit湿度整数数据+8bit湿度小数数据
+8bit温度整数数据+8bit温度小数数据
+8bit校验和(数据传送正确时校验和等于“8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据”所得结果的末8位)
3.数据校验:利用校验和。
1. */*****************************************************************
2. * 函 数 名 : DHT11_Read_Data(u8 *temp,u8 *humi)
3. * 函数功能 : 从DHT11读取一次数据
4. * 引 脚 : PA4
5. * 输 出 :返回值:0,正常;1,读取失败
6. ****************************************************************/
7. u8 DHT11_Read_Data(u8 *temp,u8 *humi)
8. {
9. u8 buf[5];
10. u8 i;
11. DHT11_Rst();
12. if(DHT11_Check()==0)
13. {
14. for(i=0;i<5;i++)*//**读取**40**位数据*
15. {
16. buf[i]=DHT11_Read_Byte();
17. }
18. if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])*//**校验*
19. {
20. *humi=buf[0];*//**湿度*
21. *temp=buf[2];*//**温度*
22. }
23. }
24. else
25. return 1;
26. return 0;
27. }

3.3.2 OLED显示
选用的OLED通过I2C与MCU通信,首先进行IIC的初始化,将SCL、SDA引脚都设置为开漏模式,将IIC设置为快速模式;然后对OLED的寄存器进行操作,初始化OLED;接着就可以调用函数显示,如要显示中文字符,比如“温度”“湿度”需要利用PCtoLCD2002.exe取模软件,将生成的字模复制到程序对应位置。


3.3.3 光照强度检测
空气质量检测、光照检测、烟雾检测都有数字量和模拟量两个输出,人体红外感应检测只有数字量输出。以光照检测的两个输出为例介绍。
① 数字量输出:
通过灵敏度调节电位器设置光照强度阈值,高于阈值输出1,否则输出0,控制窗帘开(电机正转)闭(电机反转),即PA7和PC4的高低电平。
② 模拟量输出:
配合STM32的ADC转换器得到模拟量输出存放在12位的寄存器中,公式为 ,再将Dout根据实际意义控制PWM的占空比,给LED供电,可以得到随环境亮度变化的电灯。采用模拟看门狗中断也可以实现根据阈值控制的效果。

3.3.4 指纹锁模块
单片机要实现对AS608指纹模块的控制,就需要根据AS608芯片规定的通讯协议格式来发送和处理串口数据,整个模块各个功能的实现也是围绕该协议格式进行的。UART接口配置为默认波特率:57600,数据位:8,停止位1,校验位:none,TTL电平。

控制指令有三类,指令包、数据包、结束包;一般指令包是由单片机发送到模块上,模块接收到指令包后,返回对应的数据包;
l 指令包主要包括:包头、芯片地址、包标识、包长度、控制参数和校验和;
l 数据包主要包括:包头、芯片地址、包标识、包长度、数据和校验和 ;
l 数据包与结束包的区别在于包标识,02H: 数据包,且有后续包。 08H: 最后一个数据包,即结束包。
实现指纹锁步骤:
- 录入指纹:录入图像、生成特征(存入指纹图像,存入单片机给定的缓冲区号BufferID中)、快速查找图像(生成图像后要验证是否在Buffer里面)、自动注册模板(最后将Buffer里面的图像存入Flash里面)。
- 自动验证指纹:录入指纹后,就可以匹配本人的指纹实现开锁,只需要发送自动验证指纹指令,返回的确认码为0x00,即为匹配成功,不为0x00即匹配失败。
- 删除指纹:管理员如需删除系统中录入的指定指纹信息,需要写入删除所要删除指纹的ID号,然后发送删除指纹指令即可删除相应的指纹。
首先使能时钟、配置GPIO、配置UART(波特率:57600,数据位:8,停止位:1,无校验位)、配置NVIC、使能UART,然后与AS608模块握手,握手成功后,根据不同功能对应不同的指令码下达命令,应答包回复确认码,当匹配到正确指纹控制舵机转动开门,即可实现指纹锁。以录入图像和生成特征为例说明数据格式:

3.3.5 门锁(舵机)控制
舵机控制主要涉及定时器设置,输出PWM波,舵机的工作频率为50Hz,故设置PWM的周期为20ms,根据以下公式,设置预分频系数(PSC)为719,自动重装载值(ARR)为1999。
f=72MHz/((1+PSC)(1+ARR))=50Hz
使能定时器和该通道的输出,修改TIM1_CCR2来控制占空比,根据舵机转动角度和占空比的一次线性关系可得:
Duty=0.1xAngle/180+0.025
脉冲宽度即为Width=Dutyx20ms 。
3.4 中断服务子程序
- 定时器的中断函数
温度湿度传感器、空气质量传感器、光敏传感器检测数值变化相对连续缓慢,用定时器设置隔50s检测一次,并在OLED显示屏上刷新,检测光强阈值对窗帘控制。
① 设置定时器的预分频系数和自动重装载值均为59999,使定时时间为50s,即中断函数50s进行一次。
② 中断服务函数中流程如下:

- 指纹锁模块采用外部中断EXTI
① 配置GPIO为上拉输入,检测PS_Sta状态,0表示没有手指,1表示有手指,从0变为1表示有手指按下。
② 设置边沿检测电路为上升沿触发。
③ 设置NVIC中断分组,使能中断。
④ 编写中断服务函数,调用子函数中指纹锁模块的相关函数,清除中断标志位。

4 总结
至此,我完成了智能家居系统设计从需求分析、总体规划到硬件选型和设计再到软件流程分析的整个过程,对整体设计、嵌入式系统、各外设的使用、传感器与单片机的通信方式更加了解。为从想法到理论奠定了基础,但从理论到实践还有很长一段路要走,从自动化到智能也有很长一段路要走,这或许是我今后努力的方向。