【STM32项目开源】基于STM32的智能家居安防系统
目录
一、设计背景和意义
1.1设计背景
1.2设计意义
二、实物效果展示
2.1实物图片
2.2实物演示视频
三、硬件功能简介
3.1项目功能详解
3.2元器件清单
四、主框图与软件流程图
五、硬件PCB展示
六、软件程序设计
七、项目资料包内容
资料获取:查看主页介绍“充哥单片机设计”
一、设计背景和意义
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展示
六、软件程序设计
#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初始化,波特率115200uart1_init(115200); //串口1初始化,波特率115200uart2_init(9600); //串口2初始化,波特率9600Control_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位数密码,大于0pass_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;
}