单片机毕业设计stm32智能家居安防控制系统(烟雾监测MQ-2+火焰监测+温湿度DHT11+光照强度bh1750+步进电机ULN2003+0.96oled+自动开关灯+自动窗帘+继电器风扇+声光报警)
本文介绍了一个基于STM32F103C8T6的智能家居安防系统设计。系统通过多种传感器(烟雾、火焰、温湿度、光照)实时监测环境参数,并实现自动控制(灯光、窗帘、风扇)和声光报警功能。硬件采用模块化设计,包括传感器模块、执行器模块和显示报警模块,通过I2C、ADC等接口与主控连接。软件基于Keil开发环境,使用C语言编写,实现了数据采集、阈值判断、自动控制和OLED显示等功能。设计文档包含完整代码、
·
一、设计简介
本设计以STM32F103C8T6单片机为核心,构建一个智能家居安防系统。系统实时监测环境参数(如烟雾浓度、火焰、温湿度、光照强度),并通过自动控制(如开关灯、调节窗帘、风扇启停)和声光报警来提升家居安全。
stm32单片机毕设智能家居安防控制系统(烟雾监测MQ-2+火焰监测+温湿度DHT11+光照强度bh1750+步进电机ULN2003+0.96oled
二、功能设计
系统功能包括:
- 烟雾监测(MQ-2):检测烟雾浓度。当浓度超过阈值时,触发继电器动作和声光报警。
- 火焰监测:使用红外火焰传感器检测火焰。检测到火焰时,系统立即报警并关闭潜在火源。
- 温湿度监测(DHT11):实时采集温度和湿度,启动风扇降温。
- 光照强度监测(BH1750):测量光照强度(单位:lux)。自动开关灯和窗帘
- 步进电机控制(ULN2003驱动):用于自动窗帘。基于光照控制窗帘开合。
- OLED显示(0.96英寸):实时显示传感器数据和系统状态。
- 自动开关灯:通过控制LED灯,基于光照强度自动调节。
- 自动窗帘:步进电机驱动窗帘移动,实现自动化。
- 继电器风扇:温湿度超标时,继电器启动风扇。
- 声光报警:蜂鸣器和LED组成报警系统,在异常事件(如烟雾或火焰)时激活。
三、所需硬件连接
硬件连接基于STM32的GPIO、I2C和ADC接口:
- MQ-2烟雾传感器:连接到ADC引脚,输出模拟电压信号。
- 火焰传感器:连接到数字输入引脚
- DHT11温湿度传感器:连接到单总线引脚。
- BH1750光照传感器:通过I2C接口连接)。
- 步进电机(ULN2003驱动):ULN2003驱动板连接至GPIO引脚,控制电机步进。
- OLED显示屏:通过I2C接口连接。
- 继电器模块:用于风扇和灯控制,连接到GPIO输出引脚
- 声光报警:蜂鸣器连接至IO口通过开关电路控制
- 电源:5V外部电源为所有模块供电,STM32通过USB或3.3V稳压器供电。
四、软件环境
开发环境包括:
- IDE:Keil uVision 5(用于C代码编写和调试)。
- 库支持:STM32标准库
- 编程语言:C语言(基于ARM Cortex-M3架构)。
- 通信协议:I2C用于BH1750和OLED,单总线用于DHT11,ADC用于MQ-2和火焰传感器。
- 调试工具:ST-Link调试器,串口通信(UART)用于数据监视。
五、所需硬件以及传感器模块
所需硬件清单:
- 主控制器:STM32F103C8T6开发板。
- 传感器模块:
- MQ-2烟雾传感器
- 红外火焰传感器
- DHT11温湿度传感器
- BH1750光照强度传感器
- 执行器模块:
- ULN2003步进电机驱动板(驱动28BYJ-48步进电机)
- 5V继电器模块(控制风扇和LED灯)
- 0.96英寸OLED显示屏(I2C接口)
- 报警组件:有源蜂鸣器、LED灯。
六、原理图及设计流程图



程序设计流程:
系统工作流程如下:
- 初始化:STM32启动,配置外设(I2C、ADC、GPIO)。
- 数据采集:循环读取传感器数据(烟雾浓度、火焰状态、温湿度、光照强度)。
- 数据处理:比较数据与阈值,判断异常。
- 控制执行:
- 如果光照$L < 50$,继电器开灯。
- 如果温度$T > 30$,继电器启动风扇。
- 如果检测火焰或烟雾,触发声光报警。
- 基于光照或定时,步进电机调节窗帘位置。
- 显示更新:OLED实时显示数据和状态。
- 循环监测:返回步骤2,持续运行。
七、实物图

八、程序代码
关键代码使用C语言编写,基于stm32标准库。以下是主程序框架和部分函数:
void PAGE_Home(void) //页面显示函数页面1
{
OLED_ShowChinese(0,0,"温度");
OLED_ShowChar(28,0,':',OLED_8X16);
OLED_ShowNum(36,0,Temperature,2,OLED_8X16); //显示屏显示温度
OLED_ShowChar(52,0,'C',OLED_8X16);
OLED_ShowChinese(64,0,"湿度");
OLED_ShowChar(96,0,':',OLED_8X16);
OLED_ShowNum(104,0,Humi,2,OLED_8X16); //显示屏显示温度
OLED_ShowChar(120,0,'%',OLED_8X16);
OLED_ShowChinese(0,16,"光照");
OLED_ShowChar(32,16,':',OLED_8X16);
// OLED_ShowNum(72,16,light,5,OLED_8X16);
// OLED_ShowString(112,16,"LX",OLED_8X16);
if(light>=light_D|light<=light_G)
{
OLED_ShowChinese(40,16,"正常");
OLED_ShowString(0,50," ",OLED_8X16);
}
if(light>=light_G)
{
OLED_ShowChinese(40,16,"强烈");
OLED_ShowImage(80,32,15,15,Motor);
}
if(light<=light_D)
{
OLED_ShowChinese(40,16,"昏暗");
OLED_ShowImage(80,32,15,15,Light);
}
OLED_ShowChinese(0,32,"温度");
OLED_ShowChar(32,32,':',OLED_8X16);
if(Temperature>=Temperature_G)
{
OLED_ShowChinese(40,32,"高");
OLED_ShowString(56,32," ",OLED_8X16);
OLED_ShowImage(96,32,15,15,Fan);
}
else
{
OLED_ShowChinese(40,32,"舒适");
// OLED_ShowString(16,50," ",OLED_8X16);
}
OLED_ShowChinese(0,48,"烟雾");
OLED_ShowChar(32,48,':',OLED_8X16);
if(Smoke>=Smoke_G)
{
OLED_ShowChinese(40,48,"异常");
OLED_ShowImage(112,32,15,15,Window);
}
else
{
OLED_ShowChinese(40,48,"正常");
}
if(MODE==0)
OLED_ShowChinese(96,48,"自动"); //显示自动/手动
else
OLED_ShowChinese(96,48,"手动");
}
void PAGE_Threshold(void) //页面显示函数页面2,阈值设定,监控开关
{
OLED_ShowChinese(0,0,"光照低");
OLED_ShowChar(48,0,':',OLED_8X16);
OLED_ShowNum(56,0,light_D,4,OLED_8X16);
OLED_ShowString(88,0,"LX",OLED_8X16);
OLED_ShowChinese(0,16,"光照高");
OLED_ShowChar(48,16,':',OLED_8X16);
OLED_ShowNum(56,16,light_G,5,OLED_8X16);
OLED_ShowString(96,16,"LX",OLED_8X16);
OLED_ShowChinese(0,32,"温度");
OLED_ShowChar(32,32,':',OLED_8X16);
OLED_ShowNum(40,32,Temperature_G,2,OLED_8X16);
OLED_ShowChar(56,32,'C',OLED_8X16);
OLED_ShowChinese(0,48,"烟雾");
OLED_ShowChar(32,48,':',OLED_8X16);
OLED_ShowNum(40,48,Smoke_G,4,OLED_8X16);
if(SetSelect==1&&PAGE==2)
{
if(setflash==1)OLED_ShowNum(56,0,light_D,4,OLED_8X16);
else OLED_ShowString(56,0," ",OLED_8X16);
}
if(SetSelect==2&&PAGE==2)
{
if(setflash==1)OLED_ShowNum(56,16,light_G,5,OLED_8X16);
else OLED_ShowString(56,16," ",OLED_8X16);
}
if(SetSelect==3&&PAGE==2)
{
if(setflash==1)OLED_ShowNum(40,32,Temperature_G,2,OLED_8X16);
else OLED_ShowString(40,32," ",OLED_8X16);
}
if(SetSelect==4&&PAGE==2)
{
if(setflash==1)OLED_ShowNum(40,48,Smoke_G,4,OLED_8X16);
else OLED_ShowString(40,48," ",OLED_8X16);
}
}
void PAGE_Manual(void) //页面显示函数页面3,手动控制
{
OLED_ShowChinese(0,0,"灯光");
OLED_ShowChar(32,0,':',OLED_8X16);
OLED_ShowChinese(0,16,"风扇");
OLED_ShowChar(32,16,':',OLED_8X16);
OLED_ShowChinese(0,32,"窗帘");
OLED_ShowChar(32,32,':',OLED_8X16);
OLED_ShowChinese(0,48,"窗户");
OLED_ShowChar(32,48,':',OLED_8X16);
if(Light_State==1)
OLED_ShowChinese(56,0,"开");
else
OLED_ShowChinese(56,0,"关");
if(Fan_State==1)
OLED_ShowChinese(56,16,"开");
else
OLED_ShowChinese(56,16,"关");
if(Curtain_State==1)
OLED_ShowChinese(56,32,"开");
else
OLED_ShowChinese(56,32,"关");
if(Window_State==1)
OLED_ShowChinese(56,48,"开");
else
OLED_ShowChinese(56,48,"关");
if(SetSelect_Manual==0)
OLED_ShowImage(72,0,15,15,Arrow);
if(SetSelect_Manual==1)
OLED_ShowImage(72,16,15,15,Arrow);
if(SetSelect_Manual==2)
OLED_ShowImage(72,32,15,15,Arrow);
if(SetSelect_Manual==3)
OLED_ShowImage(72,48,15,15,Arrow);
if(MODE==0)
OLED_ShowChinese(96,48,"自动"); //显示自动/手动
else
OLED_ShowChinese(96,48,"手动");
}
九、资料内容清单
本设计提供以下资料:
- 程序代码:完整Keil工程文件,包括主程序、传感器驱动库、OLED显示代码。
- 硬件清单:详细BOM表(Bill of Materials),列出所有组件型号和供应商。
- 原理图,PCB文件:AD格式PDF格式电路原理图和PCB文件。
- 设计文档:本文档的扩展版,含流程图详解和调试指南。
- 使用说明:系统安装和操作手册。
- 视频讲解:实物演示,原理图讲解,元件选型,程序介绍

更多推荐



所有评论(0)