【STM32项目开源】基于STM32的智能家庭安防系统
目录
一、设计背景和意义
1.1设计背景
1.2设计意义
二、实物效果展示
2.1实物图片
2.2实物演示视频
三、硬件功能简介
3.1项目功能详解
3.2元器件清单
四、主框图与软件流程图
五、硬件PCB展示
六、软件程序设计
七、项目资料包内容
资料获取:查看主页介绍“充哥单片机设计”
一、设计背景和意义
1.1设计背景
随着科技水平的不断提升,物联网(IoT)技术在家庭生活中的应用逐渐普及,智能家居已从概念阶段走向实际部署阶段。人们在追求居住舒适性的同时,对居家安全提出了更高要求。特别是在城市化加速发展的背景下,家庭火灾、非法入侵等安全隐患频发,传统的安防手段如简单的门锁、机械报警器已难以满足现代家庭在实时监控、远程控制、数据追踪等方面的综合性安全需求。
目前市面上存在一些较为成熟的商用家庭安防产品,但多数价格较高,功能冗杂或封闭,无法根据用户个性化需求进行灵活定制。同时,这些系统往往依赖厂商的专属平台,扩展性和开发性差,导致二次开发成本高、维护不便,且对普通消费者与开发者不够友好。
1.2设计意义
在信息化与智能化高速发展的背景下,智能家居系统作为新兴技术的重要应用方向,已经逐渐从概念走向市场落地。特别是在国家推动“智慧城市”“数字家庭”建设的政策导向下,家庭场景中的智能控制、远程监测、安全防护等功能逐步受到人们广泛关注。智能安防作为智能家居的重要子系统,其核心任务是通过多种信息感知技术,对可能出现的火灾、盗窃、非法入侵等安全风险进行自动识别与及时响应,从而保障家庭成员的生命财产安全,提升居住的安全性与便利性。
从现实角度来看,传统家庭安防手段存在诸多不足,例如反应滞后、手段单一、依赖人工介入,甚至在紧急情况下无法第一时间做出有效应对。而现有的高端智能安防产品虽然功能齐全,但价格昂贵、系统封闭、二次开发困难,对于普通家庭和中小型开发者而言门槛较高。因此,设计一套低成本、可定制、易扩展且功能完备的智能家庭安防系统,具有非常重要的现实意义和市场价值。
二、实物效果展示
2.1实物图片
2.2实物演示视频
【开源】基于STM32的智能家庭安防系统
三、硬件功能简介
3.1项目功能详解
- 传感器:烟雾浓度、火情、温湿度、人体红外、门磁
- 数据显示:0.96OLED屏幕
- 接入云平台:通过ESP8266 WIFI联网后,接入机智云平台
- App监控:App远程监控全部传感器数据
- 阈值、模式设定:按键或APP设定阈值、切换工作模式
- 防盗模式:门磁检测人闯入,人体红外检测人体存在,声光报警
- 回家模式:门磁和人体红外将不再检测,不因此报警
- 自动模式:检测到烟雾浓度超过阈值声光报警;检测火焰后声光报警,并且开水泵灭火
3.2元器件清单
- 主控采用STM32F103C8T6
- ESP8266-ESP01S实现联网功能
- 0.96OLED显示屏幕
- MQ-2烟雾传感器
- DHT11温湿度传感器
- 火焰传感器
- 蜂鸣器神光报警
- 门磁防盗检测
- 人体红外检测
- 继电器+水泵
四、主框图与软件流程图
主框图
流程图
五、硬件PCB展示
六、软件程序设计
#include "stm32f10x.h"
#include "main.h"
#include "delay.h"
#include "usart1.h"
#include "timer2.h"
#include "dhtll.h"
#include "oled.h"
#include "rtc.h"
#include "adc.h"
#include "key.h" void wifiset(void);
void setzhi(void)
{u8 t=0; t=KEY_Scan(0); //得到键值switch(t){ case KEY0_PRES:keyflag++;if(keyflag>8) keyflag=0;OLED_Clear(); break;case KEY1_PRES:if(keyflag==1) {settemp++;if(settemp>=100)settemp=100;}if(keyflag==2) {sethumi++;if(sethumi>=100)sethumi=100;}if(keyflag==3) {setyw++;if(setyw>=100)setyw=100;}if(keyflag==4) {if(tempKG==22){tempKG=11;}else tempKG=22;}if(keyflag==5) {if(humiKG==22){humiKG=11;}else humiKG=22;}if(keyflag==6) {if(ywKG==22){ywKG=11;}else ywKG=22;}if(keyflag==7){if(hyKG==22){hyKG=11;}else hyKG=22;}if(keyflag==8){if(mcKG==22){mcKG=11;}else mcKG=22;}break;case KEY2_PRES:if(keyflag==1) {settemp--;if(settemp<=1)settemp=1;}if(keyflag==2) {sethumi--;if(sethumi<=1)sethumi=1;}if(keyflag==3) {setyw--;if(setyw<=1)setyw=1;}if(keyflag==4) {if(tempKG==22){tempKG=11;}else tempKG=22;}if(keyflag==5){if(humiKG==22){humiKG=11;}else humiKG=22;}if(keyflag==6){if(ywKG==22){ywKG=11;}else ywKG=22;}if(keyflag==7){if(hyKG==22){hyKG=11;}else hyKG=22;}if(keyflag==8){if(mcKG==22){mcKG=11;}else mcKG=22;}break;default:Delay_Ms(10); }
}int main(void)
{ SystemInit(); //将主频调整到72MNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); Delay_Init(); //延时功能初始化 Delay_Ms(500); OLED_Init();//oled初始化 OLED_Clear(); while(DHT11_Init()) {Delay_Ms(500);}//检测DS18B20是否纯在ds1302_init();buzz_init();ir_init();mq2_init();butt_init();Adc_Init(); KEY_Init(); Usart2_Init(115200); //串口1功能初始化,波特率9600TIM2_Init();Isr_Init();wifiinit();showbegin();ds1302_write_time();ds1302_read_time();while(1) //主循环{ setzhi(); //设置报警值if(keyflag==0){DHT11_Read_Data(&temp,&humi);YWADC = (Get_Adc_Average(9,10)); //获取计算后的带小数的实际电压值YWADC = (YWADC -600) ;if(YWADC<6) YWADC = 0;YWADC = YWADC /25 ;if(tempKG==11) {if(temp>settemp){WD=11;GPIO_SetBits(GPIOA, GPIO_Pin_7);}}if(humiKG==11) {if(humi>sethumi){SD=11;GPIO_SetBits(GPIOA, GPIO_Pin_7);}}if(temp<=settemp||(tempKG==22)){WD=22;}if(humi<=sethumi||(humiKG==22)){SD=22;}if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) != 0 && GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0 && YWADC<=setyw && temp<=settemp&&humi<=sethumi) {GPIO_ResetBits(GPIOA, GPIO_Pin_7);}if(((GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) == 0)&&(hyKG==11)) || ((GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) != 0)&&(mcKG==11)) ||((YWADC>setyw)&&(ywKG==11)) ){jingbao =1;GPIO_SetBits(GPIOA, GPIO_Pin_7);if((GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) == 0)&&(hyKG==11))//火灾{HY=11;OLED_Clear();OLED_ShowCHinese(80,4,14);OLED_ShowCHinese(96,4,15);OLED_ShowCHinese(80,2,22);OLED_ShowCHinese(96,2,23);showhuo(); //显示火灾图片}if((YWADC>setyw)&&(ywKG==11))//烟雾报警{YW=11;OLED_Clear();OLED_ShowCHinese(80,4,14);OLED_ShowCHinese(96,4,15);OLED_ShowCHinese(80,2,17);OLED_ShowCHinese(96,2,18);//showmei();}if((GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) != 0)&&(mcKG==11))//防盗{MC=11; OLED_Clear();OLED_ShowCHinese(80,4,14);OLED_ShowCHinese(96,4,15);OLED_ShowCHinese(80,2,3);OLED_ShowCHinese(96,2,21);//showman();}}else{MC=22;YW=22;HY=22;if(jingbao == 1){OLED_Clear();jingbao = 0;}OLED_ShowCHinese(0,2,9);OLED_ShowCHinese(16,2,10);//温度 OLED_ShowChar(32,2,':');OLED_ShowNum(40,2,temp,2,16);OLED_ShowChar(56,2,'C');OLED_ShowCHinese(0,4,11);OLED_ShowCHinese(16,4,10);//湿度OLED_ShowChar(32,4,':');OLED_ShowNum(40,4,humi,2,16);OLED_ShowChar(56,4,'%');OLED_ShowCHinese(0,6,12);OLED_ShowCHinese(16,6,13);//烟雾OLED_ShowChar(32,6,':');OLED_ShowChar(56,6,'%');OLED_ShowNum(40,6,YWADC,2,16);showtime();}wifiset();}}
}