Project Finished Product Image:

Bilibili Video Link:
https://www.bilibili.com/video/BV1K1z3YJE6a/?share_source=copy_web&vd_source=097fdeaf6b6ecfed8a9ff7119c32faf2
(Material sharing at the end of the article)
01
—
Project Overview
1. Function Details
STM32 Smart Home Security System
Functions are as follows:
-
STM32F103C8T6 microcontroller board as the main control unit
-
DHT11 temperature and humidity sensor for collecting temperature and humidity
-
MQ-7 for collecting smoke concentration/carbon monoxide
-
Door magnetic module for intrusion alarm monitoring
-
DS1302 clock module to display real-time time
-
Flame sensor to determine the presence of open flames
-
OLED display to show current time and environmental information
-
Button to set thresholds, buzzer alarm
-
Mobile app to receive environmental data and control alarm switch
2. Bill of Materials
-
STM32F103C8T6 microcontroller
-
OLED screen
-
DHT11 temperature and humidity sensor
-
ESP8266-01S WiFi module
-
MQ-7 carbon monoxide sensor
-
Flame sensor
-
Door magnetic module
-
DS1302 clock module
02
—
Schematic Design

03
—
PCB Hardware Design
PCB Diagram


04
—
Program Design
#include "stm32f10x.h" // Include necessary header files
#include "main.h" // Include necessary header files
#include "delay.h" // Include necessary header files
#include "usart1.h" // Include necessary header files
#include "timer2.h" // Include necessary header files
#include "dhtll.h"
#include "oled.h"
#include "rtc.h"
#include "adc.h"
#include "key.h" // Include necessary header files
u8 rexflag = 0;
u8 rexnum = 0;
u8 xinxi = 0;
u8 sendflag = 0;
u8 YW=0;
u8 MC=0;
u8 WD=0;
u8 SD=0;
u8 HY=0;
u8 tempbai,tempshi,tempge;
u8 humibai,humishi,humige;
u8 temp;
u8 humi;
int YWADC;
u16 YWADCbai,YWADCshi,YWADCge;
uint8_t jingbao = 0;
u8 keyflag = 0;
u8 settemp = 40;
u8 sethumi = 85;
u16 setyw = 40;
u8 tempKG=11,humiKG=11,ywKG=11,hyKG=11,mcKG=11;
int main(void) {
SystemInit(); // Adjust main frequency to 72M
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Delay_Init(); // Delay function initialization
Delay_Ms(500);
OLED_Init(); // OLED initialization
OLED_Clear();
while(DHT11_Init()) { Delay_Ms(500); } // Check if DS18B20 exists
ds1302_init();
buzz_init();
ir_init();
mq2_init();
butt_init();
Adc_Init();
KEY_Init();
Usart2_Init(115200); // Serial port 1 function initialization, baud rate 9600
TIM2_Init();
Isr_Init();
wifiinit();
showbegin();
ds1302_write_time();
ds1302_read_time();
while(1) { // Main loop
setzhi(); // Set alarm values
if(keyflag==0) {
DHT11_Read_Data(&temp,&humi);
YWADC = (Get_Adc_Average(9,10)); // Get calculated actual voltage value with decimals
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)) { // Fire alarm
HY=11;
OLED_Clear();
OLED_ShowCHinese(80,4,14); // Alarm
OLED_ShowCHinese(96,4,15); // Alarm
OLED_ShowCHinese(80,2,22); // Fire
OLED_ShowCHinese(96,2,23); // Fire
showhuo(); // Show fire image
}
if((YWADC>setyw)&&(ywKG==11)) { // Smoke alarm
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)) { // Theft alarm
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); // Temperature
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); // Humidity
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); // Smoke
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); // Temperature
OLED_ShowCHinese(32,0,10);
OLED_ShowCHinese(48,0,24); // Threshold
OLED_ShowCHinese(64,0,25);
OLED_ShowCHinese(80,0,26); // Set
OLED_ShowCHinese(96,0,27);
OLED_ShowNum(48,4,settemp,3,16);
} else if(keyflag==2) {
OLED_ShowCHinese(16,0,11); // Humidity
OLED_ShowCHinese(32,0,10);
OLED_ShowCHinese(48,0,24); // Threshold
OLED_ShowCHinese(64,0,25);
OLED_ShowCHinese(80,0,26); // Set
OLED_ShowCHinese(96,0,27);
OLED_ShowNum(48,4,sethumi,3,16);
} else if(keyflag==3) {
OLED_ShowCHinese(16,0,19); // Smoke
OLED_ShowCHinese(32,0,20);
OLED_ShowCHinese(48,0,24); // Threshold
OLED_ShowCHinese(64,0,25);
OLED_ShowCHinese(80,0,26); // Set
OLED_ShowCHinese(96,0,27);
OLED_ShowNum(48,4,setyw,3,16);
} else if(keyflag==4) {
OLED_ShowCHinese(16,0,9); // Temperature
OLED_ShowCHinese(32,0,10);
OLED_ShowCHinese(48,0,28); // Alarm
OLED_ShowCHinese(64,0,14);
OLED_ShowCHinese(80,0,29); // Switch
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); // Temperature
OLED_ShowCHinese(32,0,10);
OLED_ShowCHinese(48,0,28); // Alarm
OLED_ShowCHinese(64,0,14);
OLED_ShowCHinese(80,0,29); // Switch
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); // Smoke
OLED_ShowCHinese(32,0,20);
OLED_ShowCHinese(48,0,28); // Alarm
OLED_ShowCHinese(64,0,14);
OLED_ShowCHinese(80,0,29); // Switch
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); // Fire
OLED_ShowCHinese(32,0,23);
OLED_ShowCHinese(48,0,28); // Alarm
OLED_ShowCHinese(64,0,14);
OLED_ShowCHinese(80,0,29); // Switch
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); // Theft
OLED_ShowCHinese(32,0,34);
OLED_ShowCHinese(48,0,28); // Alarm
OLED_ShowCHinese(64,0,14);
OLED_ShowCHinese(80,0,29); // Switch
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) { // Send data via serial every 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");
}
}
}
05
—
Experimental Results


Material Sharing (Baidu Cloud)
https://pan.baidu.com/s/1264zuyALDj1dv8NlyOQw2A?pwd=xrdx Extraction Code: xrdx
(Or scan the QR code below to obtain)
For physical purchase, scan the QR code below