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
For physical purchase, scan the QR code below