一、设计简介

本设计以STM32F103C8T6单片机为核心,构建一个智能家居安防系统。系统实时监测环境参数(如烟雾浓度、火焰、温湿度、光照强度),并通过自动控制(如开关灯、调节窗帘、风扇启停)和声光报警来提升家居安全。

stm32单片机毕设智能家居安防控制系统(烟雾监测MQ-2+火焰监测+温湿度DHT11+光照强度bh1750+步进电机ULN2003+0.96oled

二、功能设计

系统功能包括:

  1. 烟雾监测(MQ-2):检测烟雾浓度。当浓度超过阈值时,触发继电器动作和声光报警。
  2. 火焰监测:使用红外火焰传感器检测火焰。检测到火焰时,系统立即报警并关闭潜在火源。
  3. 温湿度监测(DHT11):实时采集温度和湿度,启动风扇降温。
  4. 光照强度监测(BH1750):测量光照强度(单位:lux)。自动开关灯和窗帘
  5. 步进电机控制(ULN2003驱动):用于自动窗帘。基于光照控制窗帘开合。
  6. OLED显示(0.96英寸):实时显示传感器数据和系统状态。
  7. 自动开关灯:通过控制LED灯,基于光照强度自动调节。
  8. 自动窗帘:步进电机驱动窗帘移动,实现自动化。
  9. 继电器风扇:温湿度超标时,继电器启动风扇。
  10. 声光报警:蜂鸣器和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)用于数据监视。
五、所需硬件以及传感器模块

所需硬件清单:

  1. 主控制器:STM32F103C8T6开发板。
  2. 传感器模块
    • MQ-2烟雾传感器
    • 红外火焰传感器
    • DHT11温湿度传感器
    • BH1750光照强度传感器
  3. 执行器模块
    • ULN2003步进电机驱动板(驱动28BYJ-48步进电机)
    • 5V继电器模块(控制风扇和LED灯)
    • 0.96英寸OLED显示屏(I2C接口)
  4. 报警组件:有源蜂鸣器、LED灯。
六、原理图及设计流程图


 

程序设计流程
系统工作流程如下:

  1. 初始化:STM32启动,配置外设(I2C、ADC、GPIO)。
  2. 数据采集:循环读取传感器数据(烟雾浓度、火焰状态、温湿度、光照强度)。
  3. 数据处理:比较数据与阈值,判断异常。
  4. 控制执行
    • 如果光照$L < 50$,继电器开灯。
    • 如果温度$T > 30$,继电器启动风扇。
    • 如果检测火焰或烟雾,触发声光报警。
    • 基于光照或定时,步进电机调节窗帘位置。
  5. 显示更新:OLED实时显示数据和状态。
  6. 循环监测:返回步骤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,"手动");	
	
}
九、资料内容清单

本设计提供以下资料:

  1. 程序代码:完整Keil工程文件,包括主程序、传感器驱动库、OLED显示代码。
  2. 硬件清单:详细BOM表(Bill of Materials),列出所有组件型号和供应商。
  3. 原理图,PCB文件:AD格式PDF格式电路原理图和PCB文件。
  4. 设计文档:本文档的扩展版,含流程图详解和调试指南。
  5. 使用说明:系统安装和操作手册。
  6. 视频讲解:实物演示,原理图讲解,元件选型,程序介绍

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐