这套多功能智能温控风扇系统是我基于STM32F103C8T6做的一个完整开源项目从需求梳理、原理图设计、C语言代码编写到Proteus仿真验证整个流程走了一遍最后把代码、原理图和仿真工程全部打包开源。一句话概括它的功能通过DHT11温湿度传感器实时采集环境温度单片机根据温度自动调节风扇转速温度高转得快温度低转得慢甚至停转同时还带手动调速、OLED显示、阈值报警这些实用功能。它能解决的问题很实在——设备一热风扇自动跟上降温后自动减小噪音和功耗不用人反复去拨开关。如果你想拿STM32练手从零跑通“传感器采集→数据处理→执行器控制→人机交互”这条完整链路或者正在找课程设计、毕业设计的参考项目这份开源资料可以直接拿当样板。1. 为什么做这个项目温控风扇背后的设计逻辑1.1 从需求出发一个风扇能解决什么问题先说应用场景。路由器和NAS长期开机夏天摸外壳烫手风扇一直全速转又吵3D打印机的热床和喷头旁边需要一个辅助散热风扇温度到了才启动工控机柜、实验室设备、甚至鱼缸降温都面临“什么时候该吹、吹多大风”的问题。普通风扇只有开关和固定档位不管温度高低都是同一个转速要么散热不足要么噪音和功耗浪费。很多入门者做温控风扇直接就是个“开环”方案温度超过阈值就开风扇低于阈值就关。这能用但体验很一般。实际做项目你会发现如果阈值设成30℃风扇会在29℃和31℃之间来回开关继电器“咔哒咔哒”响电机频繁启停寿命和噪音都受不了。所以这套系统我一开始就定了几个目标第一温度连续控制风扇转速而不是简单的开和关第二加滞回区间解决临界点反复跳变第三保留手动模式让使用者在自动之外能强制控制第四要有显示和按键方便调试。这些需求拆解下来核心其实就是一个“温度到 PWM 占空比的映射”问题再往外扩展就是模式切换、显示刷新、报警处理这些状态管理。想明白这一点整个项目架构就清晰了。1.2 核心方案选型主控、传感器、驱动、显示怎么组合方案选型是嵌入式项目最早也是最重要的一步选错了后面全得返工。先给出一套我用下来最稳的组合然后逐个说理由。模块选型方案备选方案选择理由主控STM32F103C8T6STM32F103RCT6、APM32F103C8T6价格低、资料多、Flash够用、国产替代容易找温度采集DHT11DS18B20、SHT30、NTC热敏电阻单片价格便宜、直接输出温湿度、接线简单风扇驱动NPN三极管低端驱动N-MOS管、L298N、ULN2003小功率风扇用三极管即可成本几毛钱显示0.96寸OLED SSD1306LCD1602、LCD12864I2C接口省引脚显示内容丰富调试方便供电USB 5V AMS1117-3.312V适配器 降压模块小功率场景5V够用LDO纹波小主控选STM32F103C8T6没什么悬念72MHz主频、64KB Flash、20KB RAM对付这种项目绰绰有余。芯片便宜而且资料全到不能再全网上随便一搜就是上千篇教程。另外一个现实因素是国产APM32F103C8T6在硬件上基本兼容程序可以直接烧进去跑这也是我做项目时的一个小心得选主流芯片后面做产品降本、找替代料都从容。温度传感器我选了DHT11而不是DS18B20因为这套系统除了温度还想顺便显示湿度DHT11一个传感器两路数据性价比高。如果对温度精度要求高比如要控制到±0.5℃DHT11不够看得换DS18B20或SHT30这个后面在“常见问题”里我会展开对比。风扇驱动部分很多人一开始想用继电器的简单通断但继电器没法做连续调速而且频繁吸合寿命堪忧直接否决。驱动部分用三极管还是MOS管取决于风扇功率0.1A级别的小风扇S8050三极管就够0.5A以上的大风力风扇建议换成N-MOS管比如AO3400导通电阻小发热低。显示选了OLED因为I2C只要两根线还能做成一个小的状态面板直观看到当前温度、湿度、模式和PWM占空比比LCD1600省引脚也好看。2. 硬件设计原理图里那些容易被忽略的细节2.1 最小系统搭建晶振电容计算与启动配置原理图设计从最小系统开始。STM32F103C8T6的最小系统比51单片机稍微讲究一点主要包括电源、晶振、复位电路、BOOT引脚和下载电路。先说晶振。板子上用8MHz无源晶振作为HSE时钟源再经过PLL倍频到72MHz。无源晶振需要两个负载电容容值不是随便接的要匹配晶振的负载电容参数。计算公式是CL (C1 × C2) / (C1 C2) Cstray其中Cstray是PCB走线和引脚引入的寄生电容一般估3~5pF。拿8MHz晶振常用负载电容12pF为例如果C1和C2各取22pF并联后是11pF加上寄生电容约4pF正好15pF左右偏大一点想更接近12pF可以取18pF。实际我焊过的板子18pF和22pF都能正常起振但有一个坑如果PCB走线太长、布局太差取22pF偶尔会起振不稳定表现是程序能下载但跑不起来万用表量晶振引脚电压异常。稳妥做法是电容先按18pF来留两个空焊盘方便以后调。复位电路就是一个10kΩ上拉电阻加一个100nF电容到地注意STM32是低电平复位。BOOT0和BOOT1引脚要拉低确保从主Flash启动。下载电路用标准的ST-Link SWD四线SWDIO、SWCLK、GND、3.3V再加上NRST复位脚四针加上一根复位线足够用。还有一个容易漏的细节STM32每个VDD引脚旁边都要放一个100nF去耦电容而且尽量靠近引脚电源入口再放一个10μF/16V的钽电容或电解电容做储能。很多人做板子只放一个总电容结果电机一启动单片机就复位就是这个原因。另外如果购买的是最小系统板而不是自己画PCB这些电路板厂已经处理好了直接插上就能用。但如果你计划把这套智能温控方案产品化建议还是从最小系统开始自己画一遍原理图对电源完整性、去耦、晶振布局这些概念会有非常直观的理解。2.2 传感器与执行器电路上拉电阻和续流二极管不能省DHT11接线非常简单VCC接3.3VGND接地DATA信号线接到单片机GPIO同时需要在DATA线上接一个4.7kΩ到10kΩ的上拉电阻到VCC。这个上拉电阻看起来不起眼但去掉它之后DHT11的通信会非常不稳定数据要么读不出来要么校验失败。因为DHT11是单总线开漏输出靠外部上拉电阻产生高电平。我用4.7kΩ比较多PCB走线稍长就用10kΩ经验值都能工作。风扇驱动电路是这个项目里最容易出问题的地方我单独强调一下。小风扇驱动用NPN三极管S8050做低端开关电路结构是风扇正极接5V电源风扇负极接三极管集电极三极管发射极接GND基极通过1kΩ电阻接单片机PWM输出引脚。基极电阻一定要加它是限流用的不加的话GPIO口灌电流过大轻则波形变形重则烧引脚。S8050的放大倍数高10kΩ也能导通但为了让开关速度更快、饱和压降更低1kΩ到4.7kΩ之间比较合适。最关键的是必须在风扇两端反向并联一个续流二极管正极接电源端负极接三极管集电极端。这个二极管的作用是吸收风扇关断瞬间产生的反电动势。风扇是感性负载电流突然中断时会产生一个很高的反向电压峰值几十伏不加二极管这一下就能把三极管击穿。我第一次焊驱动板就吃过这个亏风扇“啪”一声响三极管烧了后来才意识到是续流的问题。小电流用1N4148大电流用1N4007或者SS34肖特基都行。如果是12V大风扇驱动方案类似但注意三个问题第一单片机PWM信号电平是3.3V驱动12V系统时要确认三极管或MOS管的开启电压阈值能满足第二12V电源和5V/3.3V电源必须共地否则PWM信号没有参考地风扇不会有反应第三大电流走线要加粗。更稳妥的做法是用光耦隔离比如PC817把3.3V控制侧和12V功率侧隔开安全性高很多。不过做课程设计级别的小项目三极管直连加共地就够了。2.3 电源设计与功耗预算电源部分是很多新手容易忽略的。STM32F103C8T6工作在3.3V而DHT11和OLED通常也走3.3V但风扇用5V或12V。所以整个系统至少需要两路电压3.3V给逻辑部分5V/12V给驱动部分。我的方案是USB 5V输入经过AMS1117-3.3稳压到3.3V风扇直接由5V供电不需要额外升压。AMS1117最大输出1A而STM32整板电流加OLED屏幕也就几十毫安绰绰有余。特别提醒风扇不要从AMS1117的输出端取电因为风扇启动瞬间电流可能冲到几百毫安会导致3.3V电压跌落单片机直接复位。风扇一定要接在5V入口侧和LDO前面这样即使AMS1117短暂压降3.3V波动也小。如果开关电源输入波动大在5V入口并一个100μF电容在3.3V输出并一个10μF电容整个电源会稳很多。功耗也好估算STM32F103C8T6全速跑大约80mAOLED峰值约20mADHT11工作电流小于1mAS8050驱动小风扇时风扇电流约80mA总功耗大概5V × 180mA 0.9W。这个功耗用USB口供电完全没问题。如果换12V大风力风扇电流0.3A以上功耗会到3.6W那就要考虑外置适配器供电不能指望USB口带得动。3. 软件实现从温度采集到PWM调速的完整逻辑3.1 工程结构状态机为核心模块化拆分软件架构我拆成了几个独立模块main.c负责整体流程和状态机dht11.c负责温湿度采集display.c负责OLED显示fan.c负责PWM驱动key.c负责按键处理buzzer.c负责报警。每个模块只公开几个接口函数内部实现细节封装起来这样调试的时候能快速定位问题在哪个环节。整体运行逻辑是一个典型的状态机系统启动后做外设初始化进入主循环主循环里依次处理温度采集、按键扫描、模式切换、风扇控制、显示刷新。状态分为手动模式、自动模式和报警模式。手动模式用户通过按键直接设定风扇转速自动模式根据温度计算目标转速当温度超过报警阈值时不管当前什么模式蜂鸣器都会响同时风扇强制全速转直到温度回落到安全范围。关于用标准外设库还是HAL库我个人的建议是如果是入门学习或者想快速做出可以跑的东西标准外设库就够用代码直接清晰网上例程也最多如果以后准备往企业开发方向走HAL库是主流但上手难度高一点。这套项目源码我用的标准外设库因为中断、定时器PWM、GPIO这些操作在寄存器层面更容易理解对初学者友好。3.2 DHT11温度采集单总线时序与坑点DHT11是单总线通信数据线只有一根所有时序都由高低电平脉冲的宽度来定义而且时序要求比较严格差个几十微秒就可能读错数据。通信过程分两步主机先发送起始信号DHT11响应后连续发送40位数据每一位都以50μs低电平开始高电平26~28μs表示“0”高电平70μs表示“1”。湿度高8位、湿度低8位、温度高8位、温度低8位最后8位是校验和前四个字节相加等于校验和才说明数据有效。读取一个字节的核心代码如下uint8_t DHT11_ReadByte(void) { uint8_t i, data 0; for (i 0; i 8; i) { while (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) 0); // 等待50us低电平结束 Delay_us(30); // 延时到数据位中间 if (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) 1) data (data 1) | 0x01; // 此时仍为高 - 1 else data (data 1) | 0x00; // 此时已变低 - 0 while (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) 1); // 等待电平释放 } return data; }这段代码逻辑上没毛病但实际用的时候有一个很大的坑延时函数必须足够精确。用延时循环Delay_us(30)的时候编译器优化等级不同、主频不同实际延时时间差很多可能变成50μs甚至80μs读回来的数据就是错乱的。所以我自己写的时候直接用SysTick做us级延时保证延迟精度在±2μs以内再关掉可能干扰时序的中断。另外DHT11的采样间隔要求大于1秒意思是从主机发送起始信号到下一次发送起始信号中间至少间隔1秒。如果读取频率太高传感器不响应返回的数据全是高温高湿的乱码这个很容易误判成传感器坏了。注意读完之后把数据线拉高让总线保持空闲状态否则下一次读取也会失败。3.3 风扇PWM调速定时器配置和温度映射策略PWM输出用STM32的定时器我用的是TIM3通道1选择PA6引脚。定时器配置的核心是确定频率和占空比。频率太高MOS管和三极管的开关损耗变大频率太低风扇会发出明显的“嗡嗡”声。我的经验是5kHz到25kHz之间都可以耳朵几乎听不到噪音我最终选了10kHz。计算方法72MHz主频分频后得到想要的频率(PSC1) × (ARR1) 72MHz / 10kHz 7200所以取PSC71ARR99即72MHz / 72 / 100 10kHz。定时器初始化代码TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_TimeBaseStructure.TIM_Period 99; // ARR 99 TIM_TimeBaseStructure.TIM_Prescaler 71; // PSC 71 - 10kHz TIM_TimeBaseStructure.TIM_ClockDivision 0; TIM_TimeBaseStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse 0; // CCR初始为0占空比0% TIM_OCInitStructure.TIM_OCPolarity TIM_OCPolarity_High; TIM_OC1Init(TIM3, TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_Cmd(TIM3, ENABLE);调节占空比就是修改CCR寄存器的值CCR0对应占空比0%CCR99对应100%。温度到占空比的映射我用分段线性方案25℃以下占空比0风扇停25℃到40℃之间线性从30%升到100%40℃以上全速。这个区间设置可以根据实际场景改比如散热要求高的设备可以把25℃下调到20℃。核心代码#define TEMP_BASE 25.0f #define TEMP_FULL 40.0f #define DUTY_MIN 300 // 对应30% #define DUTY_MAX 999 // 对应99.9% uint16_t TempToDuty(float temp) { if (temp TEMP_BASE) return 0; else if (temp TEMP_FULL) return DUTY_MAX; else return (uint16_t)((temp - TEMP_BASE) / (TEMP_FULL - TEMP_BASE) * (DUTY_MAX - DUTY_MIN) DUTY_MIN); }这里有个细节ARR设成99CCR最大只能到9930%对应30100%对应99。如果我想让占空比精度高一点会把ARR设成999CCR范围0~999。代码里DUTY_MAX我写了999意味着实际用的时候ARR应该设成999PSC重新计算让频率保持在10kHz附近。这个细节在源码里要注意不然初始化配置和占空比计算会对不上。再一个必须处理的问题滞回。假设没有滞回温度正好卡在25℃附近风扇会一会儿转一会儿停非常烦。我加了一个简单的滞回逻辑开启阈值30℃关闭阈值28℃温度升到30℃以上风扇启动之后要降到28℃以下风扇才停中间保持上一次状态。这样既保证了响应速度又不会频繁启停。#define FAN_ON_TEMP 30.0f #define FAN_OFF_TEMP 28.0f static uint8_t fan_run 0; if (temp FAN_ON_TEMP) fan_run 1; else if (temp FAN_OFF_TEMP) fan_run 0; if (fan_run) PWM_SetDuty(TempToDuty(temp)); else PWM_SetDuty(0);3.4 按键交互和OLED显示状态机按键我用三个独立按键模式切换键、加键、减键。模式逻辑是短按模式键在“自动模式”和“手动模式”之间切换手动模式下加键和减键调节目标PWM占空比步进5%长按模式键进入“参数设置模式”可以设置报警阈值。参数设置模式里OLED显示内容变化加键和减键变成调阈值。按键处理最大的坑是抖动。机械按键按下和释放的瞬间会产生几毫秒到几十毫秒的电平抖动不去抖动的话一次按键会被识别成好几次参数乱跳。我用了最简单的延时消抖检测到低电平后延时20ms再确认一次还是低电平才认为是有效按下。注意延时消抖期间要避免阻塞太久20ms在项目里可以接受不影响其他任务。OLED显示用SSD1306的I2C接口地址0x3C。显示内容分两屏第一屏显示实时温度、湿度、当前模式、PWM占空比第二屏显示报警阈值和温度曲线趋势。OLED刷新不要在主循环里每圈都全量刷新那样会占用很多时间且屏幕闪烁我是每150ms刷新一次够用也不晃眼。这里也提示一下STM32F103的硬件I2C在实际使用中有一些已知的兼容性问题偶尔会卡在BUSY状态出不来如果遇到OLED一直无响应可以改用软件模拟I2C稳定很多。我在这套代码里就是用的软件I2C省心。4. Proximity仿真搭建与整体调试从Proteus到实物的落差4.1 Proteus仿真环境搭建步骤Proteus仿真最大的价值在于在没有硬件的情况下把整个程序的逻辑跑通一遍尤其是状态切换、PWM输出、按键响应这些行为层面的验证。我用的Proteus 8.x版本搭建步骤如下。第一步新建工程在元件库搜索并放置STM32F103C8T6、DHT11、LCD/OLED如果你想让仿真贴近实物Proteus里有OLED模型、按键、电阻、风扇模型或者用一个LED加示波器代替。第二步连接电路STM32的PA6接风扇控制引脚PD0接DHT11数据线加上拉电阻PD1接OLED SDAPD2接OLED SCL。第三步编译工程生成hex文件在Proteus里双击STM32芯片找到Program File选项加载hex文件同时把Crystal Frequency设置成8MHz。第四步点击运行如果一切正常虚拟OLED屏幕开始显示温度改变时PWM输出变化。DHT11模型在Proteus里的使用方式和实物不太一样。真实DHT11需要时序精确调用Proteus的模型也模拟了单总线时序但它在仿真中读取温度和湿度是靠元件属性设置的。你可以在仿真里双击DHT11修改它的Temperature和Humidity属性来模拟环境变化观察风扇转速是否按预期变化。如果模型属性改不了一个替代办法是用数字电位器或者按键调节模拟量再用ADC通道采集临时验证“采集→处理→输出”的链路。两种方式都能帮助验证主控代码逻辑。4.2 仿真验证的边界哪些问题一定要上实物仿真环境对逻辑验证非常友好但有几个坑必须提前知道免得被误导。Proteus仿真默认是理想化的芯片引脚的GPIO翻转时间、上电时序、电源瞬态都和真实芯片有区别。DHT11在Proteus里是模型不存在真实传感器的电气噪声和时序抖动所以你在仿真里跑通的读取代码拿到实物上不经过调试可能读不到正确数据这是最典型的“仿真一时爽实物两行泪”。另外Proteus仿真里没有“风扇启动瞬间的大电流“、没有“电源线上的纹波”也没有“三极管发热”。所以仿真通过不代表硬件一定正常。我个人的调试经验是仿真负责把算法和逻辑调对实物负责把驱动和时序调稳两个阶段缺一不可。这也是为什么我强烈建议先做仿真再做板子而不是直接焊板子然后边猜边调。如果不想装Proteus在线仿真平台Wokwi也是一个选择它对STM32F103有实验性支持可以在浏览器里写代码、接电路、看串口输出适合快速验证想法但支持的元件库和模型丰富度目前还比不上Proteus。4.3 实物调试三步走拿到打样的板子或者面包板搭好电路之后我的调试习惯是分三步绝不一步到位直接跑完整程序。第一步最小系统点灯。只烧一个GPIO翻转的程序用LED验证芯片能跑起来顺便确认下载器和烧录链路没问题。这一步很多初学者跳过了结果后面程序没反应分不清是芯片没烧进去还是外设没工作浪费时间。第二步单独测DHT11。写一个最简单的串口打印程序只读温湿度通过串口助手观察数值是否合理。这时候如果读到0或乱码重点查上拉电阻、GPIO配置、时序延时。DHT11在正常室温下读到温度20多度、湿度40%~60%都算合理读到55℃、湿度99%这种极端值基本可以断定通信有问题。第三步再接PWM驱动和风扇。用固定占空比测试比如先写死CCR500约50%占空比看风扇是否转、转速是否稳定。这时候要重点观察风扇启动时声音是否正常、有没有异味、震动大不大。固定占空比能跑通再上自动调速逻辑否则温度一变风扇就乱转很难定位是测温问题还是驱动问题。5. 常见问题与排查技巧实录5.1 烧录和环境类问题报错“No STM32 target found”是出现频率最高的问题之一。这个报错说明ST-Link没有和芯片建立连接。排查顺序从硬件到软件先检查ST-Link的SWDIO、SWCLK、GND三根线是不是真的接到了芯片对应引脚很多是杜邦线松了再确认芯片供电是否正常3.3V引脚能测到电压芯片不能过热然后看BOOT0有没有被拉高如果BOOT0是1芯片进入系统存储器模式SWD连接不一定会失败但有时会被干扰拉回0更稳最后检查ST-Link驱动是否正常Windows设备管理器里看到“STM32 Virtual COM Port”感叹号这类情况重装ST-Link驱动即可。还有一个容易忽略的点如果板子上有电解电容极性接反会导致整个电源系统异常ST-Link也无法连接。如果用的是最小系统板经常遇到“能识别到芯片但下载提示Flash时代不支持”或者干脆连接超时。这种情况下先确认MDK工具里的Flash Download选项是否选对了芯片容量STM32F103C8T6是64KB Flash选错成512KB的型号下载会失败。5.2 传感器读数和显示问题DHT11读回来的数据一直是0或者是固定值首先要怀疑通信时序。用逻辑分析仪抓一下数据线波形看起始信号是否发出、DHT11是否有80μs的响应低电平如果没有响应大概率是传感器供电或上拉电阻问题。如果响应了但数据全是0那就是读取延时不准确把us级延时函数校准一遍。注意用SysTick做完延时之后读单字节时中断优先级要控制好避免在时序关键点被定时器中断打断。温度跳变特别大比如一会25℃一会60℃回来除了传感器本身故障外还可能是传感器位置离热源太近或者被风扇吹到出风口。DHT11外壳有一定热惯性放在出风口附近会受到风扇气流影响测到的温度和真实环境温度不一致。解决办法是把传感器放在进风口或者远离风扇的位置。OLED花屏或完全不显示先量I2C地址是不是0x3C再查SCL和SDA是否接反最后确认上拉电阻。SSD1306的板子有的自带I2C上拉有的没有外部加上4.7kΩ上拉比较稳。软件I2C一般不会有硬件I2C的BUSY卡死问题但延时不能太短I2C时钟频率控制在100kHz~400kHz软件延时循环如果太快OLED也会不按章法出字符。5.3 风扇驱动和电源问题风扇不转但是万用表量ST-Link输出的PWM引脚有波形问题往往出在驱动级。先用示波器看三极管基极的电压波形正常应该在0和3.3V之间切换再看集电极波形关断时电压会冲到接近电源电压如果有尖峰到十几伏但没烧管说明续流二极管正常工作。风扇“嗡嗡”响但转不起来是典型的启动电压不够。有些风扇电机在低速占空比下启动困难解决办法是启动时给一个全速脉冲比如占空比100%持续200ms然后再回落到目标转速。另一个我踩过的坑是风扇正负极接反。无刷散热风扇内部有驱动电路接反了不会反转而是根本不转有的会烧内部元件。接线前一定看风扇标签上的红黑线定义。电源问题最典型的是“一开风扇单片机就复位”。原因基本是风扇启动瞬间电流把3.3V电压拉垮了。检查风扇是否接在LDO前面如果接在3.3V输出端立刻改接同时在5V入口加大电容。如果还复位考虑在STM32的VDD引脚再加一个100μF电容给芯片提供一个瞬间的能量缓冲。5.4 排查速查表现象可能原因排查优先级ST-Link连接不上SWD接线松、芯片没供电、BOOT0被拉高、驱动异常1. 接线 2. 供电 3. BOOT0 4. 驱动DHT11读0或固定值上拉电阻缺失、时序不准、采样间隔过短、传感器损坏1. 上拉 2. 时序 3. 采样间隔OLED不显示I2C地址错误、SDA/SCL接反、无上拉1. 地址 2. 接线 3. 上拉风扇不转但有PWM波三极管接错、基极电阻过大、续流二极管反接1. 驱动管脚 2. 基极电压波形风扇低速不启动启动电压不足、占空比映射下限太低1. 启动全速脉冲 2. 调高最低占空比一开风扇MCU复位风扇接在LDO后、电源储能不足1. 改电源接法 2. 加大电容这套排查思路不仅适用于这个温控风扇几乎所有“单片机传感器电机”的项目都可以套用。先隔离问题软件层查波形功率层量电压电源层抓纹波不要一上来就怀疑芯片坏了。芯片坏的几率远远低于接线错、配置错。最后再分享一个小经验。这个项目做完之后我把它重新整理开源不只是扔一堆代码文件了事而是把硬件设计说明、仿真使用步骤、常见问题都写成文档放进仓库。很多人会把开源简单理解成“挂代码”但实际上代码之外的设计思路和踩坑记录才是最大的财富。后来有网友拿这套架构改成了鱼缸温度控制用加热棒替代风扇加热逻辑和降温逻辑本质上是同一个问题只是执行器从风扇换成了加热棒PWM控制从调转速变成调加热功率。这也印证了这个项目的价值核心在于“传感器采集→数据处理→执行器控制”的完整闭环把这个框架吃透后面无论做智能家居、小型设备散热还是温度控制类产品都能很快上手。