新闻详情

新闻详情

首页 / 资讯中心 / 详情

STM32温控风扇系统设计:从DHT11采集到PWM调速的完整嵌入式实践

发布时间:2026/9/6 13:39:15来源:尧图网络
STM32温控风扇系统设计:从DHT11采集到PWM调速的完整嵌入式实践
做嵌入式开发的朋友应该都经历过这个阶段学完GPIO、定时器、中断这些基础外设之后总想做一个能真正跑起来的东西而不是流水灯和按键点灯轮着玩。我这个多功能智能温控风扇系统就是在这个节点上做的做完之后对STM32的理解深度完全不一样了。项目本身不复杂——核心就是用STM32F103C8T6读取温度传感器的数据通过PWM控制风扇转速再加上按键、显示、手动/自动模式切换这些交互功能。但它把一个完整的嵌入式产品链路走了一遍传感器采集、数据处理、控制策略、驱动输出、人机交互还覆盖了原理图绘制、PCB设计、Proteus仿真、真机调试这几个开发环节。这篇就把整个项目的设计思路、原理图要点、代码逻辑、仿真搭建和踩坑记录全部拆开讲代码和工程文件都是开源的想复现或者改造成自己的毕业设计、课程项目都可以直接抄作业。1. 项目整体设计与思路拆解1.1 核心需求一个风扇要加多少智能才算够用先说清楚这个项目到底要做什么。市面上几十块钱的USB小风扇也有调速但那是人手拧的不叫智能。我这边的需求拆出来是这样的能实时采集环境温度并且把温度显示出来根据温度自动调节风扇转速温度越高转得越快温度降下来就自动减速甚至停转因为有多功能三个字光自动还不够还得能手动切挡位一共设了四挡停止、低速、中速、高速需要一个按键做模式切换和挡位调节需要一个显示屏显示当前温度、模式、转速挡位。这套需求映射到嵌入式开发的技能点上就是ADC或者单总线协议的温度采集、定时器PWM输出、外部中断或者轮询按键检测、I2C或并口驱动屏幕。可以说一个温控风扇把STM32最常用的外设全串起来了。做之前我列了个功能清单画了简单的状态流转图花了一个晚上把需求和方案对齐后面写代码几乎没做过大的返工。这个习惯建议大家养成越小的项目越要先想清楚再动手。1.2 主控选型为什么是STM32F103C8T6而不是别的主控这块其实没有太多悬念就是STM32F103C8T6。Cortex-M3内核主频72MHzFlash 64KBSRAM 20KB在2024年的今天它依旧是最适合入门的一块片子。原因有几点第一资料极其丰富。江科大、正点原子、野火这些教程全是基于F103的遇到问题搜一下别人的解决思路一抓一大把。这个项目里几乎所有外设的初始化我都能找到现成的参考代码节省了大量时间。第二资源完全够用。这套系统里面用到的资源一个定时器做PWM输出两个GPIO接到DHT11两个GPIO接按键四个GPIO接LCD1602数据线如果不用I2C转接板就是11个加一个ADC采集电位器模拟量作为手动调速输入。满打满算外设也就这么点F103C8T6的20KB SRAM跑这套绰绰有余64KB Flash塞完整个工程还剩下大半。第三价格便宜到可以随便折腾。正品芯片散片几块钱一片蓝板核心板十几块包邮焊坏了不心疼多买两片备用也就是一顿饭钱。相比之下如果用F407、H743这些高性能芯片做这么个小东西纯粹是拿大炮打蚊子。1.3 系统架构数据从传感器到风扇的完整链路整个系统的数据流是这样的DHT11温湿度传感器采集环境温度通过单总线协议把40bit的数据8bit湿度整数、8bit湿度小数、8bit温度整数、8bit温度小数、8bit校验和送回STM32STM32解析出温度值之后跑一段控制策略代码得出目标PWM占空比然后把占空比写入定时器的比较寄存器TIM输出的PWM波形经过驱动电路放大控制风扇端电压实现调速。人机交互这条线是并行的按键通过外部中断或者轮询方式输入切换自动/手动模式、调节挡位LCD1602负责把温度、模式、挡位这些状态实时刷出来。为了调试方便我还额外引出了串口通过USART1把温度和控制参数打印到串口助手上后期加WiFi模块或者上位机也是走这条线扩出去。这个架构最值得说的一点是采集、决策、执行三层分离。DHT11驱动只管把温度读出来返回控制策略函数只管输入温度输出占空比风扇驱动只管根据占空比输出PWM。每一层之间通过函数接口和全局结构体解耦后面想换传感器、换控制算法、换显示设备都只需要改对应模块不用把整个工程推倒重来。2. 硬件设计原理图拆解与关键电路分析2.1 电源与最小系统稳定供电是一切的前提原理图设计从最小系统开始画。STM32F103C8T6是3.3V供电而我用的是12V的电脑散热风扇所以板子上需要两套电源5V输入经过AMS1117-3.3稳压给MCU供电12V直接给风扇供电。这里有个很多新手容易踩的坑12V电源给风扇供电地线和MCU的GND必须共地否则PWM信号根本没有参考基准MOS管或者三极管无法正常工作。我在第一版PCB上就是因为电源地的处理不够干净风扇转起来之后MCU偶尔复位后来加了共地点和滤波电容才解决。最小系统的外围电路包括8MHz晶振加两个20pF负载电容这是HSE时钟源的起振条件复位电路用10k上拉电阻加100nF对地电容保证NRST引脚在正常工作时是高电平按下复位键时拉低BOOT0和BOOT1引脚通过10k电阻下拉到地确保从主Flash启动这点经常被忽略因为如果BOOT0悬空或者被拉到高电平芯片上电会进入系统存储器启动模式代码怎么也跑不起来。2.2 温度采集方案DHT11、DS18B20、NTC怎么选温度传感器我前后对比了三种方案NTC热敏电阻、DS18B20、DHT11。最终选了DHT11主要是看中它便宜和免校准。DHT11出厂前做过校准校准系数存在OTP内存里读取数据的时候直接带上湿度数据温度精度正负2℃对于风扇控制这种应用完全够用。但要注意一个信息DHT11的数据引脚是开漏输出必须在数据线和VCC之间接一个4.7k到10k的上拉电阻。这个电阻不接的话传感器响应的时候拉不上去高电平读出来的数据全是0或者乱码。原理图上这个上拉电阻很容易漏画仿真里有时候能跑是因为Proteus模型内部帮你处理了真机上就原形毕露了。如果对温度精度要求更高比如正负0.5℃以内可以换成DS18B20同样是单总线协议略有不同但代码逻辑差不多如果项目预算充足而且想要模拟量采集的实验效果用LM35或者NTC加ADC也行。我个人建议学习阶段就用DHT11便宜耐造还能顺带学一下单总线协议这种不需要时钟线的通信方式。2.3 风扇驱动电路三极管、MOS管还是驱动芯片风扇驱动是很多新手原理图翻车的地方。STM32的GPIO输出电流最大也就20mA左右带不动一个几百毫安的直流风扇必须加驱动级。最省事的方案是NPN三极管比如S8050做低边开关基极串一个1k限流电阻接GPIO发射极接地集电极接风扇的负极风扇正极接12V。这个方案能用但三极管在饱和导通的边界上压降比较大大电流下会发热而且开关频率高了之后开关损耗也大。第二版我换成了N沟道MOS管AO3400同样低边驱动栅极串一个10欧电阻再接GPIO栅源之间加一个10k下拉电阻防止上电瞬间GPIO悬空导致风扇误转。用MOS管的好处是导通电阻只有几十毫欧几乎不发热而且开关速度远快于三极管适合PWM调速。MOS管栅极的驱动电压要注意AO3400是逻辑电平MOS管3.3V的栅极电压就能完全导通如果误选了一个普通MOS管比如IRF540开启电压要4V以上3.3V驱动会导不通风扇只能怠速转或者干脆不转。无论三极管还是MOS管感性负载电机内部是线圈关断瞬间会产生反向感应电动势必须在风扇两端并联一个续流二极管1N5819或者1N4007都行阴极接12V阳极接风扇负极给反电动势一个泄放回路。这个二极管不加MOS管很容易被尖峰电压击穿我第一版就烧过两个AO3400血泪教训。2.4 显示与按键人机交互的最小闭环显示部分我用了LCD1602加I2C转接板。为什么不用OLED因为LCD1602在Proteus里仿真特别成熟而且真实硬件上LCD1602加I2C转接板只要接四根线VCC、GND、SCL、SDA比OLED的I2C接线还省事。I2C转接板上有PCF8574芯片把8位并口转成I2C默认地址是0x27用扫描程序能确认实际地址。LCD1602本身不带字库的版本要小心带字库的一般是汉字模块显示ASCII码直接发就行。按键就三个一个模式切换键自动/手动、一个挡位加键、一个挡位减键。按键电路加10k下拉电阻GPIO配置为下拉输入按下时引脚读到高电平。软件上必须做消抖我用的方案是检测到电平变化后延时10ms再确认一次简单可靠。有人用外部中断再做消抖但三个按键用轮询就已经足够中断反而容易因为抖动触发多次处理起来更麻烦。2.5 原理图绘制工具嘉立创EDA与规范化习惯原理图我是在嘉立创EDA上画的免费、在线、不用装破解版而且元件库和封装库特别全STM32F103C8T6、AO3400这些常用器件都有现成的。画原理图的时候我建议养成几个习惯所有网络标号要起有意义的名字TEMP_DATA、FAN_PWM、KEY_MODE这种电源网络用不同颜色区分元件位号重新排序关键信号线上加测试点。这些习惯在原理图转PCB、后期调试、以及把工程分享给别人的时候价值会成倍放大。另外如果你用的是Cadence这类专业工具注意器件原理图符号和封装的对应关系别到时候画完原理图转PCB发现封装对不上回头改封装很痛苦。3. 固件代码实现从初始化到控制策略3.1 开发环境搭建Keil MDK配合CubeMX的工程结构代码部分我用的是Keil MDK加STM32CubeMX的组合。开发环境搭建很简单但是有几个坑一是Keil的版本和芯片支持包的匹配问题。用Keil MDK 5.3x版本的话需要在Pack Installer里装好STM32F1系列的支持包Keil.STM32F1xx_DFP我第一次装完开工程报一堆红叉就是Pack没装。二是如果之前电脑上装过C51的Keil和MDK装在一起可能出现兼容问题最好用不同的安装路径安装MDK时选Add to PATH别用默认的C51路径覆盖。工程结构上我用CubeMX生成底层初始化代码包括时钟树外部8MHz晶振倍频到72MHz、GPIO、TIM2的PWM通道、USART1、I2C1然后自己分三个模块写业务代码dht11.c管温度采集、fan.c管PWM控制和模式状态机、lcd1602_i2c.c管显示主循环里只管调用。这种分层是模仿实际工程项目的组织方式写出来的代码即使过三个月再回来看也知道每个文件是干嘛的。3.2 DHT11驱动单总线时序的精髓DHT11单总线协议的时序是整个项目里最需要扣细节的地方。一条完整的读时序是主机把数据线拉低至少18ms然后拉高20到40us这是起始信号DHT11响应拉低80us再拉高80us之后连续输出40bit数据每一位bit的传输都是拉低50us然后拉高高电平持续26到28us表示逻辑0持续70us表示逻辑1全部结束后数据线释放由外部上拉电阻维持高电平。代码实现的核心就是微秒级延时。我用的SysTick做的微秒延时配合HAL库的__HAL_TIM_SET_COMPARE来控制PWM占空比。这里有几个必须注意的点代码编译优化级别如果开-O2微秒延时函数可能被优化掉导致时序不对建议保持-O0或者-O1调试实测下来-O0最稳主机起始信号期间要把GPIO配置成推挽输出去拉低读数据的时候要把GPIO重新配置成输入模式用寄存器操作切换速度最快标准库的GPIO_InitTypeDef反复初始化也能用但每次切换多花几个微秒时序余量变小读到的原始数据是湿度整数、湿度小数、温度整数、温度小数、校验和校验和等于前四个字节之和的低8位。校验不通过的数据要丢弃否则偶尔一次干扰就会显示一个离谱的温度风扇跟着乱转。下面贴一段经过验证的关键读取代码基于标准库CubeMX生成的HAL库版本可以直接替换延时和GPIO读写函数static uint8_t dht11_read_byte(void) { uint8_t i, byte 0; for (i 0; i 8; i) { while (!DHT11_DATA_IN()); // 等待50us低电平结束 delay_us(30); if (DHT11_DATA_IN()) // 30us后仍为高 - 逻辑1 { byte | (uint8_t)(0x01 (7 - i)); while (DHT11_DATA_IN()); // 等待高电平结束 } // 否则为逻辑0不需要额外处理 } return byte; }这段代码的关键在于第30us处的采样判断因为逻辑0和逻辑1的区别在于高电平持续时间不同。采样太早会把逻辑1误判成逻辑0采样太晚会把逻辑0误判成逻辑1。30us是我实测下来最稳的中间值不同批次传感器有少量差异可以在28到32us之间微调。3.3 PWM调速与控制策略从分段控制到滞回控制PWM部分用的是TIM2的CH1通道输出引脚PA0。初始化代码由CubeMX生成关键参数是预分频器PSC设为7172MHz除以72得1MHz自动重装值ARR设为999这样PWM频率就是1MHz除以1000等于1kHz。这里说一下PWM频率的选择1kHz对于直流电机调速是够用的但实际上如果频率太低低于几百Hz风扇会发出明显的嗡嗡开关噪声如果频率太高比如超过20kHz虽然听不到声音但MOS管的开关损耗会变大驱动电路发热。实物上用1kHz到10kHz之间都行我最终选了1kHz因为Proteus仿真对高频PWM的支持不好仿真速度会变得很慢1kHz在仿真里比较流畅真机上表现也不差。控制策略部分我没有直接用线性映射这么简单的东西。线性映射的问题在于温度刚过阈值时风扇就开始转温度还没怎么变化占空比就顶到100%实际体验就是风扇忽快忽慢而且在阈值附近来回震荡。我用的方案是分段PID的简化版准确来说是滞回分段控制#define TEMP_TARGET_BASE 26 // 26℃以下风扇停止 #define TEMP_MAX 34 // 34℃及以上风扇全速 uint16_t fan_speed_from_temp(float temp) { uint16_t duty; if (temp TEMP_TARGET_BASE - 1) // 降到25℃才停避免临界震荡 { duty 0; } else if (temp TEMP_MAX) // 34℃封顶 { duty 999; // 占空比100% } else { // 26℃~34℃之间线性映射占空比 (temp - 25) / 9 * 999 duty (uint16_t)((temp - 25.0f) * 111.0f); } return duty; }滞回控制的奥妙在启动和停止的阈值差了1℃升温到26℃启动降温到25℃才停。如果不做这个滞回风扇会在26℃附近不断启动-停止-启动-停止继电器和MOS管寿命都会受影响。超出死区之后的线性段占空比随温度平滑上升实际体验就是夏天坐在旁边温度升高一点风扇就转快一点没有突兀的跳变感。3.4 模式状态机按键交互和显示刷新的组织方式模式切换我用了一个简单的状态机枚举定义如下typedef enum { MODE_AUTO 0, MODE_MANUAL_STOP, MODE_MANUAL_LOW, MODE_MANUAL_MID, MODE_MANUAL_HIGH } fan_mode_t;按键逻辑是这样的模式键短按在自动模式和手动模式之间切换切换后首次进入手动模式默认是低速挡手动模式下加键和减键调节挡位但不会切出手动模式。每次按键按下除了消抖之外我还加了一个松手检测就是按键释放后才算一次有效按下这样连击不会误触发。主循环里每200ms刷新一次显示。LCD1602第一行显示Temp: xx.xC第二行显示Mode: AUTO FAN: 80%。200ms的刷新频率对人眼来说足够流畅同时不会因为频繁操作I2C拖慢主循环。有一点需要注意LCD1602的写入速度很慢每次写一个字符都要等几十微秒如果用HAL_Delay在主循环里等会导致按键响应迟钝。我用了非阻塞方式按键检测放在定时器中断里10ms一次显示刷新放在主循环里两者互不阻塞实测手感很好。3.5 串口调试输出嵌入式开发者的另一只眼代码里我特意加了串口调试功能USART1波特率115200。每秒钟通过串口输出一行调试信息格式是temp28.5 auto duty388 rpm2400。为什么要花这个代码量因为很多时候LCD上只显示最终结果看不到过程中间的变化。比如风扇不转到底是温度没到阈值、还是PWM没输出、还是MOS管坏了串口一打出来立刻就能定位是哪一环出了问题。调试信息用printf重定向到串口记得在工程里勾选MicroLIB否则浮点格式化字符串会占用大量Flash空间。4. Proteus仿真那副不会烧板子的试错工具4.1 仿真工程搭建与Hex文件加载Proteus仿真在这套项目里的定位是不用上电也能跑通逻辑特别适合在板子还没做出来、或者不敢直接上电测电路的时候做预验证。仿真工程搭建步骤整理如下在Proteus里放置STM32F103C8T6搜索STM32F103C8或STM32F103C6放置在元件列表里直接有的模型放置DHT11Proteus 8.9以上版本自带DHT11的仿真模型并有对应的驱动文件.mdl放置后需要设置好上拉电阻阻值选10k放置LCD1602LM016L数据线和控制线的接法要和代码里的引脚定义一致放置风扇模型Proteus里直接用DC MOTOR电机模型加一个电压表模拟风扇在不同占空比下的转速变化双击单片机芯片在Program File一栏加载Keil编译生成的Hex文件设置外部晶振频率8MHz注意Proteus里STM32模型的时钟设置要和代码里的时钟树匹配。仿真里最方便的一点是可以随时暂停用一个滑动变阻器模拟温度变化看PWM占空比和电机转速的实时响应。调试控制策略的时候我就是在仿真里把25℃到35℃的温度变化反复扫了好几遍确认滞回逻辑符合预期才去烧真机。4.2 仿真与真机的三大差异别过度依赖仿真虽然Proteus好用但有三个差异是我实际对比之后总结出来的写在这里给大家提个醒第一时序精度不一样。仿真里DHT11的时序是模型模拟的不会出现真实传感器那种因为导线电容、上拉电阻阻值偏差导致的时序边缘问题。真机上能读数据的代码仿真不一定能跑通反过来也一样。第二Proteus对PWM和电机这类动态负载的仿真速度很慢仿真器要在一个时间片内处理无数个模拟事件跑起来像慢动作。第三真实电机工作时的EMI干扰、电源纹波、MOS管开关尖峰这些在仿真里完全不存在所以仿真通过只代表逻辑没问题不代表硬件能稳定工作。我的做法是先在Proteus里验证控制逻辑和显示逻辑确保代码的主要流程没有低级错误然后尽快打板或者用面包板搭真机把更多时间花在真机调试上。仿真擅长的是查逻辑真机擅长的是查电路两者互补。5. 常见问题与排查技巧实录5.1 下载仿真器连接失败error: no stm32 target found!这条错误应该是STM32开发里出现频率最高的一条。我用ST-Link V2下载代码时遇到过好多次总结下来无非这几个原因第一接线错误。ST-Link和板子要接四根线SWDIO、SWCLK、GND、3.3VSWDIO和SWCLK不能反这个看着低级但实际很容易犯特别是用杜邦线的时候颜色一样的线插错位置是完全可能的。第二目标板没上电有些ST-Link可以从自己的3.3V引脚给板子供电但电流有限接了风扇这类负载后电压会被拉垮导致芯片无法进入调试模式。第三BOOT0引脚被拉高导致芯片进入ISP模式下载器连不上这个时候把BOOT0跳线恢复到低电平再试。第四板卡上电时序问题可以先按住板子上的复位键在Keil点下载的瞬间松开复位键这种先复位后连接的土办法我也用过还真的解决过一次顽固问题。还有一个容易踩的点如果你用的是ST-Link的固件版本比较老连接F103C8T6这种老的Cortex-M3内核没有太大问题但如果以后换到G0、L4系列的新芯片需要先通过STM32CubeProgrammer升级ST-Link固件否则同样会出现no target found。5.2 DHT11读数全零或者乱码真机上DHT11读数出问题优先排查顺序是上拉电阻没焊或虚焊、数据线过长超过20cm就很危险、GPIO模式配置错误读取阶段必须是输入模式、微秒延时不准编译器优化等级要调低、传感器供电电压不够DHT11供电范围3.3-5V但供电不能低于3V否则读出来的数据不稳定。一个比较典型的坑是用杜邦线把DHT11连到开发板上测试一切正常画了PCB之后把传感器也用排针连接结果读数开始随机跳变。后来发现是传感器排线太长且没有在传感器附近放100nF的退耦电容。在PCB上给DHT11的VCC和GND之间加一个100nF陶瓷电容数据线保持尽量短问题就消失了。5.3 风扇不受控一直全速转或者完全不动风扇一直全速转大概率是MOS管栅极被拉死了也就是GPIO输出高电平这时候要检查GPIO初始化是否成功、PWM是否真的在输出。我曾经遇到过一个很隐蔽的问题TIM2的PWM输出正常初始化了但在某次调试中断里我手动把GPIO拉高之后PWM占空比怎么改都无效因为GPIO输出模式被手动改成了推挽输出而不是复用推挽输出。定时器PWM功能要求引脚工作在复用模式下普通推挽输出不会经过定时器通道。风扇完全不转但PWM波形正常重点查驱动电路。用万用表量MOS管栅极电压如果栅极有3.3V、漏源之间也有12V压降而风扇不转很可能是MOS管型号选错开启电压过高或者是续流二极管接反了直接导通导致风扇两端电压被钳位。续流二极管接反是最容易烧元件的事故画PCB之前一定要先检查原理图的二极管方向。5.4 LCD1602显示乱码或者黑块LCD1602最常见的两个问题一是对比度没调好1602的V0脚要接一个10k电位器调节电压调到字符清晰可见为止有些转接板已经集成电位器就不需要外接二是I2C地址不对PCF8574的地址范围是0x20到0x27不同批次模块地址可能不同用一个I2C扫描程序把所有地址扫一遍是最快的确认方式。另外5V的LCD1602接到3.3V的STM32时I2C上拉电阻要接到3.3V而不是5V否则STM32引脚会被5V拉灌电流长时间运行有烧引脚的风险。5.5 仿真中DHT11一直显示温度不变在Proteus里如果DHT11的温度值始终不变检查一下元件是否处于交互仿真模式还有没有把DHT11模型切换到实时输入状态。Proteus里可以通过双击DHT11元件在属性窗口里手动修改温度值或者用一个滑动变阻器接到温度控制引脚来实现动态变化。之前有朋友问为什么仿真里DHT11的温度值是0而且怎么调都不变其实就是没把温湿度参数从默认值改成实时调整导致的Proteus的交互式仿真需要你在运行的时候主动改变元件的输入参数。6. 真机调试与性能优化笔记6.1 用示波器和逻辑分析仪看PWM有条件的话强烈建议在真机调试时把示波器探头夹在MOS管栅极上看一下PWM波形是否标准频率对不对、占空比是否随温度变化、边沿是否干净。没有示波器的朋友可以买一个几十块钱的逻辑分析仪配合PulseView软件一样能看PWM波形的频率和占空比。我之前遇到过一个风扇转速档位不明显的问题四个挡位之间转速差不明显用逻辑分析仪一看发现挡位1到挡位4的占空比分别是5%、10%、15%、20%差值太小风扇特性曲线的非线性把这几个点压缩在了一起。后来我把手动挡位的占空比改成曲线分布停止0%、低速30%、中速60%、高速100%四个点拉开之后基本每个挡位的风力都能明显感知。自动模式的分段控制用线性映射也有类似的问题低温区间占空比增长过快26℃到28℃之间风扇就冲到80%了后面温度再涨也没多少余量。解决方案是把映射曲线改成S型或者直接在代码里用查表法做了24级变速曲线每个温度点有一一对应的占空比数值拟合出来后手感好了很多。6.2 功耗、发热与温升实测整个系统实测功耗MCU整板含LCD背光静态电流约45mA风扇全速时电流约380mA总功耗不到6W。MOS管在1kHz开关频率下导通损耗和开关损耗加起来很小实测连续运行一小时AO3400外壳温度只比环境高五六度完全在安全范围内。AMS1117-3.3在5V输入转3.3V时压差约1.7V乘以总电流45mA稳压器的功耗只有约80mW也几乎不发热。但我发现一个问题风扇离温度传感器太近的话传感器会读到风扇吹过来的气流温度出现正反馈或者读数波动。解决方法是把传感器放在避开风扇直吹的位置或者让传感器感知的是环境的温度而不是风扇出风口的温度。如果条件允许可以在传感器外面套一个开孔的遮罩既不影响测温又阻挡风扇气流直吹。6.3 固件体积与启动速度优化这个项目大部分情况下不需要优化代码体积因为64KB的Flash怎么用都用不完。但有一个点值得提到如果把DHT11的首次读取放在main函数的开头上电瞬间传感器需要1秒左右的稳定时间这段时间读数据大概率会失败。我的处理是在main里先延时500ms再初始化LCD和DHT11读取失败也不影响系统启动只是显示temp: --.-下一轮循环200ms后会自动恢复正常。这个设计对用户体验影响很大上电不要出现长时间白屏或者卡住的情况。7. 开源资料与二次开发方向7.1 开源文件清单与使用建议整个项目我开源出来了一套完整的资料包包含源码工程Keil MDK工程文件标准库版本所有模块拆分清晰编译一次通过没有任何加密和需要license的库原理图嘉立创EDA源文件和导出的PDF版包含最小系统、DHT11接口、风扇驱动、LCD接口、按键接口、电源输入整个完整原理图PCB图纸两版第一版是学习用的大封装直插元件方便面包板转PCB验证第二版是邮票孔核心板加底板的分立式布局适合直接打样Proteus仿真工程仿真文件可以直接打开运行程序烧进Hex就能看到温度变化和风扇调速的效果。使用建议是先照着原理图在面包板上搭一遍电路把代码烧进去跑通再去看PCB和仿真工程。直接上手PCB打样当然也可以但少了面包板这个环节你就很难体会到电路有问题的时候怎么量电压、怎么排查短路这些实打实的调试技能。7.2 还能往哪个方向扩展做完这个基础版之后想加功能的话有几个现成的方向第一加WiFi模块ESP8266或ESP32和手机App联动把温度数据上报到MQTT服务器手机远程开关风扇、切换模式这就是一个物联网温控设备的雏形第二把LCD1602换成带触摸的屏幕比如SPI接口的TFT屏直接做图形化界面变成一个小型智能家居控制面板第三把控制策略从滞回分段换成完整的PID或者模糊控制针对不同环境做自整定甚至可以在Flash里记录一周的温度曲线预测接下来几个小时的温度变化来预判式调速第四给整个系统加个超级电容或者电池管理断电后还能保存最后一次的运行状态上电自动恢复这是很多商业产品必须考虑的一点。我自己最近就在往WiFi和数据可视化的方向改用ESP8266通过串口把温湿度数据传到上位机用Python画温控曲线的实时图表。这套扩展做完之后整个项目的完整度基本就可以对标一个简化版的产品原型了。回到这个项目本身做完之后我最大的感受是STM32的学习曲线确实陡但一个能跑起来的项目会帮你把所有知识点串成一张网。GPIO、定时器、中断、I2C、串口这些外设分开学每一个都像在背单词但是把它们组合成一个温控风扇系统的时候你就开始理解嵌入式开发是怎么用代码控制物理世界的了。如果你也卡在学完基础外设不知道该做什么的阶段强烈建议从这个小项目开始画原理图、写驱动、做仿真、调真机把整个流程完整走一遍。等你把这个风扇跑起来的那一刻再回头看那些datasheet和原理图一定会觉得顺眼很多。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

学术问卷设计量表开发与信效度检验完整指南 2026/9/6 14:12:20

学术问卷设计量表开发与信效度检验完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
南方NTS全站仪实训教程:从原理到放样的关键操作与避坑指南 2026/9/6 14:12:20

南方NTS全站仪实训教程:从原理到放样的关键操作与避坑指南

简介:南方NTS全站仪使用教程PPT课件是一份专业教学课件,系统讲解全站仪的定义、主流品牌与选型、使用注意事项,并重点拆解南方NTS系列的结构组成、显示屏符号、软键与星键操作。面向测量工程专业学生、测绘入门人员及需要快速掌握全站仪实操的…

阅读更多 →
Modelica建模语言入门:从物理方程到多领域仿真实践 2026/9/6 14:12:20

Modelica建模语言入门:从物理方程到多领域仿真实践

简介:这份PPT课件系统介绍Modelica语言,面向从事物理系统建模与仿真的工程师、科研人员及相关专业学生,旨在帮助读者建立对多领域统一建模、基于方程的非因果建模和面向对象建模的整体认知,理解Modelica如何用方程而非传统赋值语句…

阅读更多 →
嵌入式开发工具怎么选?目标导向让“好用”与“专业”兼得 2026/9/6 14:12:20

嵌入式开发工具怎么选?目标导向让“好用”与“专业”兼得

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
语音放大电路课程设计全攻略:从方案选型到调试避坑 2026/9/6 14:12:20

语音放大电路课程设计全攻略:从方案选型到调试避坑

简介:面向电子科学与技术专业本科生的模电课程设计文档,以“语音放大电路设计”为课题,完整覆盖从设计任务、技术指标、方案论证到仿真调试的整条流程,适合正在完成模拟电子技术课程设计,或想学习低频小信号放大、带通…

阅读更多 →
铸造厂总降压变电所及厂区配电系统设计要点解析 2026/9/6 14:09:19

铸造厂总降压变电所及厂区配电系统设计要点解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞