目录
一、设计背景和意义
1.1设计背景
随着城市化进程的加快和人们生活水平的不断提升,居民对居住环境的安全性、舒适性和智能化提出了更高的要求。智能家居作为物联网在家庭场景中的具体应用,已逐渐从智能照明、智能家电控制延伸到家庭安防、环境监测等领域。其中,智能安防系统作为智能家居的核心组成部分,直接关系到用户的人身与财产安全,因而越来越受到研究者与市场的高度关注。
目前,传统的家居安防系统大多以单一功能设备为主,如红外报警器、门磁报警器、烟雾探测器等,这些设备通常无法互联互通,缺乏智能联动和远程监控能力,无法实时响应突发事件。同时,部分高端智能安防系统虽然功能完善,但其高昂的价格、复杂的部署以及用户操作门槛,限制了其在普通家庭中的普及。
1.2设计意义
该系统设计具有良好的扩展性和移植性,不仅能够满足家庭场景中的基本安防需求,还可灵活应用于出租屋、公寓、仓库、小型办公室等多种场景,推动智能安防的普及化、平民化发展。此外,该课题也具有一定的学术研究与工程实践价值,涵盖嵌入式编程、传感器数据采集与处理、WiFi通信协议、云平台集成、人机交互设计等关键技术,能够有效锻炼学生的综合设计能力与系统集成能力,是高校物联网与智能控制方向学生实践与科研结合的良好项目。
二、实物效果展示
2.1实物图片

2.2实物演示视频
【开源】基于STM32的智能家居安防系统
三、硬件功能简介
3.1项目功能详解
1)传感器:温湿度、烟雾、火焰、门磁
2)密码锁开门:薄膜按键密码开门
3)数据显示:0.96OLED屏幕
4)执行机构:声光报警
5)接入云平台:系统通过ESP8266 WIFI联网后,接入机智云平台
6)App监控:通过App远程监控全部传感器数据并设定阈值、切换模式
7)工作模式:回家模式下,将不再检测门磁状态,不会开启声光报警;离家模式,输入错误密码,将会自动开启声光报警,门磁触发后,将会自动声光报警
8)自动模式:检测数据到超过阈值,火焰,则会自动开启声光报警
3.2元器件清单
- 主控STM32F103C8T6
- 0.96OLED显示屏幕
- DHT11温湿度传感器
- MQ-2烟雾传感器
- 火焰传感器
- 门磁防盗检测模块
- 3*4薄膜按键
- 蜂鸣器报警模块
四、主框图与软件流程图
主框图

流程图

五、硬件PCB展示


六、软件程序设计
cpp
#include "delay.h"
#include "sys.h"
#include "bmp.h"
#include "usart.h"
#include "dht11.h"
#include "control.h"
#include "adc.h"
#include "IoData.h"
#include "key.h"
#include "timer.h"
#include "oled.h"
/**** 数据变量 ****/
char pass_init[6] = {1,2,3,4,5,6}; //初始解锁密码
char pass_word[6] = {0,0,0,0,0,0};
int Pass_flag = 1; //门锁状态 1锁 0开
int pass_num = 0;
int temp_door = 40;
int humi_door = 90;
int smoke_door = 2000; //烟雾浓度阈值
int home_mode = 0; //安防状态 0回家模式 1安防模式
int auto_mode = 0; //自动模式 0手动模式 1自动模式
uint8_t water_flag = 0;
/**** 菜单变量 ****/
uint8_t keu_num = 0;
uint8_t page_num = 1;
uint8_t option = 0;
/**** 功能函数声明 ****/
void get_all_sensor_data(); //传感器数据采集
void Sensor_Data_Handle(); //不同模式下控制效果
void Key_event_handle(void); //按键功能函数
void OLED_Show_FirstPage(); //第一屏显示内容
void OLED_Show_SecondPage(); //第二屏显示内容
void OLED_Show_ThirdPage(); //第三屏显示内容
void OLED_Show_OpenPage(); //第四屏显示内容
void PassWord_Open(void); //密码解锁函数
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//改变指定管脚的映射,JTAG-DP 禁用 + SW-DP 使能
delay_init(); //系统延时函数初始化
OLED_Init(); //屏幕初始化
uart3_init(115200); //串口3初始化,波特率115200
uart1_init(115200); //串口1初始化,波特率115200
uart2_init(9600); //串口2初始化,波特率9600
Control_Init(); //蜂鸣器初始化
Adc_Init(); //烟雾浓度、火情检测初始化
KEY_Init(); //按键初始化
DHT11_Init(); //DHT11温湿度初始化
Beep =0;
TIME_Config(); //定时器初始化
while(1)
{
PassWord_Open(); //密码解锁
Key_event_handle(); //按键监测
Sensor_Data_Handle(); //数据处理
get_all_sensor_data(); //传感器数据采集
if(page_num == 1){ //屏幕更新
OLED_Show_FirstPage();
}else if(page_num == 2){
OLED_Show_SecondPage();
}else if(page_num == 3){
OLED_Show_ThirdPage();
}
}
}
void PassWord_Open(void)
{
while(Pass_flag){
OLED_Clear();
while(1){ //输入6位数密码,大于0
pass_word[pass_num] = KeyScan(0);
if(pass_word[pass_num]==10){ //按*号键重新输入密码
pass_num=0;
memset(pass_word,0,6*sizeof(char));
Beep=1;delay_ms(10);Beep=0;
}
if(pass_word[pass_num]>0){ //
pass_num++;
}
OLED_Show_OpenPage();
if(pass_num>5)break; //输入6位密码后跳出循环进行判断
}
//密码正确
if(pass_word[0]==pass_init[0]&&pass_word[1]==pass_init[1]&&pass_word[2]==pass_init[2]&&pass_word[3]==pass_init[3]&&pass_word[4]==pass_init[4]&&pass_word[5]==pass_init[5])
{
Pass_flag = 0;
pass_num=0;
OLED_Clear();
memset(pass_word,0,6*sizeof(char));
delay_ms(1000);
home_mode=0;
}else { //密码错误
Beep=1;
pass_num=0;
memset(pass_word,0,6*sizeof(char));
delay_ms(1000);Beep=0;
}
}
}
void Key_event_handle(void)
{
keu_num = KEY_Scan(0); //按键扫描赋值
switch(keu_num)
{
case 1: //按键1按下
/* ------------- 页面切换 -------------- */
if(page_num == 1){
if(home_mode==1){
Pass_flag=1;
}else{
page_num = 2;
OLED_Clear();OLED_Show_SecondPage();
}
}else if(page_num == 2){
option++;
if(option>3){
option=0;
page_num = 1;
OLED_Clear();OLED_Show_FirstPage();
}else OLED_Show_SecondPage();
}
break;
case 2: //按键2按下
if(page_num==1){
auto_mode=!auto_mode;
}else if(page_num==2){
if(option==1)smoke_door+=15;
else if(option==2)temp_door++;
else if(option==3)humi_door++;
}
break;
case 3: //按键3按下
if(page_num==1){
home_mode=!home_mode;
}else if(page_num==2){
if(option==1)smoke_door-=15;
else if(option==2)temp_door--;
else if(option==3)humi_door--;
}
break;
case 4: //按键4按下
break;
}
}
void get_all_sensor_data()
{
DHT11_Read_Data(&temp,&hum); //获取温湿度数据
Get_MQ_Value(&MQ_Value); //获取烟雾数据
Get_Fire_Value(&Fire_status); //获取火焰数据
Get_door1(); //门磁开关检测
}
void Sensor_Data_Handle()
{
/*
离家模式下 且 检测到门磁开关为开
安放模式下 检测到有火情 或烟雾浓度超过阈值 或温度超过阈值 或湿度超过阈值
打开蜂鸣器报警
*/
if((home_mode==1&&door1_status==0)||(auto_mode==1&&(Fire_status==1||MQ_Value>smoke_door||temp>temp_door||hum>humi_door))){
Beep = 1;
}else Beep = 0;
}
七、项目资料包内容
