【STM32项目开源】STM32单片机智能温控风扇系统

目录

一、设计背景和意义

1.1设计背景:

1.2设计意义:

二、实物展示

三、硬件功能介绍

[2.1 硬件清单:](#2.1 硬件清单:)

[2.2 功能介绍:](#2.2 功能介绍:)

四、软件设计流程图

五、硬件PCB展示

六、软件主函序展示

七、单片机实物资料

[资料获取 查看主页介绍:兆龙电子单片机设计](#资料获取 查看主页介绍:兆龙电子单片机设计)


一、设计背景和意义

1.1设计背景:

在日常家庭室内温度调节、学生宿舍精准控温、办公场景局部降温、老人居家舒适温控及商铺门店分区散热的背景下,风速精准调节、温控智能响应、多场景便捷适配、能耗合理管控成为温控风扇类产品的核心需求。传统温控风扇控制方式存在明显局限:一方面,高端智能温控通风系统(如定制化室内环境管控中控平台、工业级精准温控网关、品牌成套商用智能通风设备)功能虽全但成本高昂,部署复杂且需专业人员上门调试与后期维护,难以普及到普通家庭、小户型住宅、租房群体及小型商铺等日常场景,且系统生态封闭性强,不同品牌、不同协议的温控设备与监测终端兼容性差,无法与个人移动终端、家庭智能设备、小型办公管理平台灵活联动,更换或升级成本高,无法满足不同人群(如普通家庭用户、学生、办公人员、独居老人)的便捷温控与通风调节需求;另一方面,普通简易温控风扇装置(如传统机械调速风扇、单一档位定时风扇、基础款手动温控小风扇)虽操作简单、价格低廉,但功能单一,仅能实现基础的风速调节或固定时间启停,缺乏多维度温度监测、风速智能调节、运行记录存储、远程温控调节及设备故障状态提醒(如电机卡滞、温度传感器失灵、设备断电)等功能,无法满足现代化生活与办公场景下对全面覆盖、智能响应、便捷高效的温控与通风管控需求。

现有关温控风扇管控方案还存在功能割裂与集成度低的问题:部分高端智能温控通风系统虽具备多维度温度管控与通风联动功能,但依赖复杂的软硬件架构与专属生态维护,后期使用成本高,难以覆盖预算有限的普通消费群体、学生群体或小型个体经营场景;而低成本温控风扇装置又在功能完整性与智能化上存在欠缺,无法实现温度数据与风扇控制终端、移动 APP、小型办公中控平台的实时联动,导致温控响应延迟、风速调节误差偏大、个性化需求(如老人居家恒温调控、学生宿舍夜间静音降温、商铺分区精准散热)无法满足等问题,无法为用户舒适居家生活(如精准把控室内温度)及高效开展办公与经营活动(如统筹办公区域散热、降低商铺能耗)提供可靠支撑。基于此,本设计以 STM32 单片机为核心,融合高精度温度采集与辅助模块(如温度传感模块、风速调节模块、定时控制模块、语音提醒模块)、LCD 显示模块、数据存储模块及蓝牙通信与异常提醒模块,构建低成本、高集成度的 STM32 单片机智能温控风扇系统,以解决传统温控风扇控制方式操作繁琐、智能化程度低、功能单一及温控通风管控效率低的问题。

1.2设计意义:

从使用体验与温控风扇精细化管控效率角度,该系统突破了传统温控风扇控制方式的局限:一是实现了多维度温度监测与全场景风速联动(如支持环境温度实时采集、目标温度精准设定、风速多档位智能调节、定时启停控制,联动蓝牙通信模块、异常声光提醒模块、风扇智能调速执行模块),无需用户手动调节风速、频繁核对环境温度或记录风扇运行状态,减少温控调节的繁琐性与风速管控的延迟性;二是配备 OLED 实时显示模块,直观呈现当前环境温度 / 目标温度 / 风扇档位、系统运行状态(正常 / 异常)及提醒类型,同时支持数据自动存储(可通过蓝牙传输至移动 APP / 个人温控管理平台 / 小型办公环境管控平台),方便用户与办公管理员长期追溯温度变化历史数据、风扇运行记录,也为优化室内温控方案、排查设备故障隐患及多区域散热统筹管控提供完整数据支撑;三是新增个性化温控预警与自动调速功能,当监测到环境温度超出预设范围(如高温自动升档、低温自动降档 / 停机)或异常状态(如温度传感器失灵、风扇电机卡滞、设备电量不足),系统根据状态类型自动触发对应执行动作(同时通过声光提醒模块反馈调速 / 预警信息与设备当前工作状态,蓝牙同步推送至关联移动终端),并联动风扇执行模块完成智能操作(如联动 "高温预警",自动提升风扇档位、记录温度峰值与调速时间,同步更新温控台账),无需人工现场干预即可实现温控风扇的智能化精细化管控,大幅提升了温控调节的便捷性与室内散热管理的高效性。

从技术实践与成本控制角度,本设计以 STM32 单片机为核心,充分利用其低功耗、高性价比的优势,搭配低成本的高精度温度采集模块及通用外围模块,在保证温控精度(核心温度监测准确率可控制在 98% 以上,风速调节与预警响应时间可控制在 0.5 秒以内)的前提下,有效降低了系统整体成本,相比同功能的高端智能温控通风系统成本降低 40%-60%,更易普及到普通家庭、学生宿舍、小型办公场所、个体商铺及老人居家照料等场景。同时,系统支持模块化扩展(如后续可新增多区域温度联动调控功能、多人个性化温控权限管理功能、远程手动调速与参数设置功能),为后续功能升级预留了空间,具备良好的灵活性与可扩展性。

**二、**实物展示

下方为实物演示视频

演示视频https://www.bilibili.com/video/BV1tHWgzHEws/?spm_id_from=333.1387.upload.video_card.click&vd_source=2a672ca4e8794dca68cbe6d047b42ca5

下方为实物展示图片

三、硬件功能介绍

2.1 硬件清单:

  • STM32F103C8T6

  • OLED显示

  • DHT11温湿度传感器

  • 声光报警

  • SR501红外检测

  • TB6612电机驱动模块

  • WIFI模块

2.2 功能介绍:

(1) 采用OLED显示屏实时显示当前温度、湿度、温度阈值、风扇档位、人体存在状态以及工作模式(自动/手动/定时);

(2) 可通过按键切换自动、手动和定时三种工作模式。在自动模式下可设置温度阈值;

(3) 手动模式下支持手动开启风扇并调节档位,档位范围0--5档,每调节一次档位递增一档;

(4) 自动模式下,当检测到有人且环境温度超过设定阈值时,风扇自动启动;

(5) 具备倒计时定时功能,可设定工作时间,计时结束自动关闭风扇;

(6) 支持Wi-Fi远程控制,可通过APP切换模式、设置温度阈值、调节档位、设定定时时间,并实时监控系统数据

四、软件设计流程图

五、硬件PCB展示

六、软件主函序展示

复制代码
int main(void)
{
	/*模块初始化*/
	OLED_Init();		//OLED初始化
	Motor_Init();
	DHT11_Init();
	MatrixKey_Init();
	Red_Init();
	Timer_Init();
	Serial_Init();

	BEEP_GPIO_Config();

	OLED_ShowChinese(0,0,"温度");
	OLED_ShowChinese(16*4,0,"湿度");

	OLED_ShowChinese(0,16,"模式");
	OLED_ShowChinese(16*4,16,"档数");
	OLED_ShowNum(16*2,16,Key_M,1,OLED_8X16);
	OLED_ShowNum(16*6,16,dang,1,OLED_8X16);

	OLED_ShowChinese(0,16*2,"速度:");
	OLED_ShowSignedNum(16*3,16*2,Speed,3,OLED_8X16);

	OLED_ShowChinese(0,16*3,"倒计时:");
	OLED_ShowNum(16*4,16*3,Time,2,OLED_8X16);
	OLED_Update();

	GPIO_SetBits(GPIOB, GPIO_Pin_0);
	GPIO_SetBits(GPIOB, GPIO_Pin_1);
	Delay_ms(100);
	GPIO_ResetBits(GPIOB, GPIO_Pin_0);
	GPIO_ResetBits(GPIOB, GPIO_Pin_1);

	while (1)
	{
		DHT11_Read_Data(&TH,&RH);//获取当前温湿度
		OLED_ShowNum(16*2,0,TH,2,OLED_8X16);
		OLED_ShowNum(16*6,0,RH,2,OLED_8X16);
		OLED_Update();
		if(Timedemo == 1)
		{
			if(RED_Data == 1)	//如果有人
			{
				OLED_ShowString(16*6,16*2,"Hi! ",OLED_8X16);
				if(temperature < TH)	//实际温度高于设置阈值
				{
					Speed = (TH-temperature)*20;	//每高一度速度+20
					if(Speed > 100)
					{
						Speed = 100;
					}
				}
				else Speed = 0;			
			}
			else
			{
				OLED_ShowString(16*6,16*2,"Bey!",OLED_8X16);
				Speed = 0;
			}
			OLED_ShowSignedNum(16*3,16*2,Speed,3,OLED_8X16);			

			OLED_Update();
			Motor_SetSpeed(Speed);
		}
		Delay_ms(500);

	}
}


uint16_t count;
uint8_t yy;

void TIM1_UP_IRQHandler(void)		//每1毫秒进一次中断
{
	if (TIM_GetITStatus(TIM1, TIM_IT_Update) == SET)
	{
		count++;
		if(count == 1000)
		{
			count = 0;
			if(Time_demo == 0 && Time > 0)	//进入倒计时模式
			{
				Time--;
				if(Time == 0)		//倒计时结束
				{
					Timedemo = 0;	//关闭自动挡
					Speed = 0;		//速度置0
					dang = 0;		//去除记录
					Time_1 = 0;
					Time_10 = 0;
					Motor_SetSpeed(0);
					OLED_ShowSignedNum(16*3,16*2,Speed,3,OLED_8X16);			
					OLED_ShowNum(16*6,16*1,dang,1,OLED_8X16);
				}
				OLED_ShowNum(16*4,16*3,Time,2,OLED_8X16);
				OLED_Update();

			}
		}
		if(count%20 == 0)	//获取按键值
		{
			RED_Data = Red_Rdata();		//检测是否有人
			if(RxData)		//
			{
				KeyNum = RxData-'0';//
				RxData = 0;
//				OLED_ShowNum(16*6,16*3,KeyNum,2,OLED_8X16);
//				OLED_Update();
			}
			else
			{
				KeyNum = Key_LoopY();
			}

			if(KeyNum)		//如果按键按下
			{
				if(KeyNum == 3)				//切换模式键 Key_M = 1:手动,Key_M = 2:自动
				{
					Num = 1;		//手动自动模式
					Key_M += 1;
					if(Key_M > 2){Key_M = 1;}

					OLED_ShowNum(16*2,16,Key_M,1,OLED_8X16);
					OLED_Update();
				}
				if(Num == 1)		//手动自动模式
				{
					if(Key_M == 1)			//模式1手动挡模式
					{
						Timedemo = 0;
						OLED_ClearArea(16*3,16,16*8,16);
						OLED_ShowChinese(16*4,16,"档数");

						if (KeyNum == 1)	//减档
						{
							dang--;
							if(dang < 0)
							{
								dang = 5;
							}
						}
						if (KeyNum == 2)	//加档
						{
							dang++;
							if(dang > 5)
							{
								dang = 0;
							}
						}
						Speed = dang*20;
						OLED_ShowString(16*6,16*2,"    ",OLED_8X16);
						OLED_ShowNum(16*6,16*1,dang,1,OLED_8X16);
						OLED_ShowSignedNum(16*3,16*2,Speed,3,OLED_8X16);			

						OLED_Update();
						Motor_SetSpeed(Speed);

					}
					if(Key_M == 2)
					{
						Timedemo = 1;
						dang = 0;
						OLED_ClearArea(16*3,16,16*8,16);
						OLED_ShowChinese(16*4,16,"阈值");

						if (KeyNum == 1)	//温度阈值--
						{
							temperature--;
							if(temperature < 16)
							{
								temperature = 16;
							}
						}
						if (KeyNum == 2)	//温度阈值++
						{
							temperature++;
							if(temperature > 40)
							{
								temperature = 40;
							}
						}
						OLED_ShowNum(16*6,16*1,temperature,2,OLED_8X16);
						OLED_Update();
					}
				}
				if(KeyNum == 4)		//切换倒计时模式
				{
					Num = 2;
					Time_demo++;
					if(Time_demo == 2)	//Time_demo=2相当于确定键
					{
						Num = 1;
						Time_demo = 0;
						OLED_ShowString(16*5+8,16*3,"  ",OLED_8X16);

						OLED_Update();
					}
				}
				if(Num == 2)
				{
					if(Time_demo == 1)	//输入需要倒计时的时间
					{
						if(KeyNum == 1)
						{
							Time_10++;
							if(Time_10 > 9)
							{
								Time_10 = 0;
							}
						}
						if(KeyNum == 2)
						{
							Time_1++;
							if(Time_1 > 9)
							{
								Time_1 = 0;
							}
						}
						Time = Time_10*10 + Time_1;
						OLED_ShowNum(16*4,16*3,Time,2,OLED_8X16);
						OLED_ShowString(16*5+8,16*3,"<-",OLED_8X16);

						OLED_Update();
					}
				}
			}

		}


		TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
	}
}

七、单片机实物资料

资料获取 查看主页介绍:兆龙电子单片机设计

相关推荐
云山工作室2 小时前
基于单片机的自动门控制系统设计(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计
KevinShi_BJ2 小时前
读李宁老师的《AIGC 自动化编程 -- 基于 ChatGPT和 GitHub Copilot》
chatgpt·自动化·aigc
VekiSon2 小时前
ARM架构——UART 串口通信详解
c语言·arm开发·单片机·嵌入式硬件
橙露2 小时前
工业控制嵌入式开发:Modbus 协议在 STM32 中的实现与调试
服务器·网络·stm32
zmj3203242 小时前
单片机中NVM和FLASH的区别
单片机·嵌入式硬件
想放学的刺客2 小时前
单片机嵌入式试题(第21期)嵌入式系统启动异常排查与多任务同步机制设计两个核心方向,涵盖硬件调试、软件架构等综合能力考察。
stm32·单片机·嵌入式硬件·物联网·51单片机·proteus
Y1rong2 小时前
STM32之DMA
stm32·单片机·嵌入式硬件
一殊酒2 小时前
【前端开发】Vue项目多客户配置自动化方案【二】
javascript·vue.js·自动化
beginner.zs2 小时前
AgentCPM 全面介绍与实战指南:轻量开源智能体的全流程落地方案
开源