【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);
	}
}

七、单片机实物资料

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

相关推荐
笨笨饿40 分钟前
69_如何给自己手搓一个串口
linux·c语言·网络·单片机·嵌入式硬件·算法·个人开发
易生一世2 小时前
自动化Pipeline中的Kiro CLI详解
自动化·pipeline·key·headless·kiro
薛定猫AI4 小时前
【深度解析】Kimi K2.6 的长上下文 Agentic Coding 能力与 OpenAI 兼容 API 接入实践
人工智能·自动化·知识图谱
FreakStudio5 小时前
MicroPython 内核开发者直接狂喜!这个 Claude 插件市场,把开发全流程做成了「对话式外挂」
python·单片机·嵌入式·面向对象·并行计算·电子diy
天诚智能门锁5 小时前
天诚公租房管控平台CAT.1人脸猫眼智能锁助力青神县公租房管理
人工智能·嵌入式硬件·物联网·智能家居·智能硬件
菩提小狗7 小时前
每日极客日报 · 2026年05月03日
ai·开源·极客日报·it热点·技术资讯
m0_377108148 小时前
5月1日zzz
单片机
踏着七彩祥云的小丑8 小时前
嵌入式——认识电子元器件——晶体谐振器系列
单片机·嵌入式硬件
玩转单片机与嵌入式8 小时前
TinyML应用场景解析:动作识别!
人工智能·单片机·嵌入式硬件·嵌入式ai·ai+嵌入式