目录
一、前言
项目成品图片:
哔哩哔哩视频链接:
STM32智能家庭安防系统
(资料分享见文末)
二、项目简介
1.功能详解
基于STM32的智能家庭安防系统
功能如下:
- STM32F103C8T6单片机系统板作为主控单元
- DHT11温湿度传感器采集温湿度
- MQ-7采集烟雾浓度/一氧化碳
- 门磁模块监控闯入报警
- DS1302时钟模块显示实时时间
- 火焰传感器判断是否有明火
- OLED显示屏显示当前时间和环境信息
- 按键设置阈值,蜂鸣器报警
- 手机APP接收环境数据和控制报警开关
2.主要器件
- STM32F103C8T6单片机
- OLED 屏幕
- DHT11温湿度传感器
- ESP8266-01S WiFi模块
- MQ-7一氧化碳传感器
- 火焰传感器
- 门磁模块
- DS1302时钟模块
三、原理图设计
四、PCB硬件设计
PCB图
五、程序设计
int main(void)
{
SystemInit(); //将主频调整到72M
NVIC_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功能初始化,波特率9600
TIM2_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();
}
else if(keyflag==1)
{
OLED_ShowCHinese(16,0,9);//温度
OLED_ShowCHinese(32,0,10);
OLED_ShowCHinese(48,0,24);//阈值
OLED_ShowCHinese(64,0,25);
OLED_ShowCHinese(80,0,26);//设置
OLED_ShowCHinese(96,0,27);
OLED_ShowNum(48,4,settemp,3,16);
}
else if(keyflag==2)
{
OLED_ShowCHinese(16,0,11);//湿度
OLED_ShowCHinese(32,0,10);
OLED_ShowCHinese(48,0,24);//阈值
OLED_ShowCHinese(64,0,25);
OLED_ShowCHinese(80,0,26);//设置
OLED_ShowCHinese(96,0,27);
OLED_ShowNum(48,4,sethumi,3,16);
}
else if(keyflag==3)
{
OLED_ShowCHinese(16,0,19);//烟雾
OLED_ShowCHinese(32,0,20);
OLED_ShowCHinese(48,0,24);//阈值
OLED_ShowCHinese(64,0,25);
OLED_ShowCHinese(80,0,26);//设置
OLED_ShowCHinese(96,0,27);
OLED_ShowNum(48,4,setyw,3,16);
}
else if(keyflag==4)
{
OLED_ShowCHinese(16,0,9);//温度
OLED_ShowCHinese(32,0,10);
OLED_ShowCHinese(48,0,28);//报警
OLED_ShowCHinese(64,0,14);
OLED_ShowCHinese(80,0,29);//开关
OLED_ShowCHinese(96,0,30);
if(tempKG==11) {OLED_ShowCHinese(48,4,31); OLED_ShowCHinese(64,4,29);}
if(tempKG==22) {OLED_ShowCHinese(48,4,30); OLED_ShowCHinese(64,4,32);}
}
else if(keyflag==5)
{
OLED_ShowCHinese(16,0,11);//温度
OLED_ShowCHinese(32,0,10);
OLED_ShowCHinese(48,0,28);//报警
OLED_ShowCHinese(64,0,14);
OLED_ShowCHinese(80,0,29);//开关
OLED_ShowCHinese(96,0,30);
if(humiKG==11) {OLED_ShowCHinese(48,4,31); OLED_ShowCHinese(64,4,29);}
if(humiKG==22) {OLED_ShowCHinese(48,4,30); OLED_ShowCHinese(64,4,32);}
}
else if(keyflag==6)
{
OLED_ShowCHinese(16,0,19);//烟雾
OLED_ShowCHinese(32,0,20);
OLED_ShowCHinese(48,0,28);//报警
OLED_ShowCHinese(64,0,14);
OLED_ShowCHinese(80,0,29);//开关
OLED_ShowCHinese(96,0,30);
if(ywKG==11) {OLED_ShowCHinese(48,4,31); OLED_ShowCHinese(64,4,29);}
if(ywKG==22) {OLED_ShowCHinese(48,4,30); OLED_ShowCHinese(64,4,32);}
}
else if(keyflag==7)
{
OLED_ShowCHinese(16,0,22);//火灾
OLED_ShowCHinese(32,0,23);
OLED_ShowCHinese(48,0,28);//报警
OLED_ShowCHinese(64,0,14);
OLED_ShowCHinese(80,0,29);//开关
OLED_ShowCHinese(96,0,30);
if(hyKG==11) {OLED_ShowCHinese(48,4,31); OLED_ShowCHinese(64,4,29);}
if(hyKG==22) {OLED_ShowCHinese(48,4,30); OLED_ShowCHinese(64,4,32);}
}
else if(keyflag==8)
{
OLED_ShowCHinese(16,0,33);//防盗
OLED_ShowCHinese(32,0,34);
OLED_ShowCHinese(48,0,28);//报警
OLED_ShowCHinese(64,0,14);
OLED_ShowCHinese(80,0,29);//开关
OLED_ShowCHinese(96,0,30);
if(mcKG==11) {OLED_ShowCHinese(48,4,31); OLED_ShowCHinese(64,4,29);}
if(mcKG==22) {OLED_ShowCHinese(48,4,30); OLED_ShowCHinese(64,4,32);}
}
if(sendflag) //串口每1s发送一次数据
{
sendflag = 0;
tempbai = temp/100;
tempshi = temp%100/10;
tempge = temp%10;
humibai = humi/100;
humishi = humi%100/10;
humige = humi%10;
YWADCbai = YWADC/100;
YWADCshi = YWADC%100/10;
YWADCge = YWADC%10;
u2_printf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d",tempbai,tempshi,tempge,humibai,humishi,humige,YWADCbai,YWADCshi,YWADCge,WD,SD,YW,HY,MC,tempKG,humiKG,ywKG,hyKG,mcKG);
u2_printf("AT+CIPSEND=0,29\r\n");
}
}
}