ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

STM32环境监测终端开源项目评测:DHT11与HC-SR04复现避坑指南

STM32环境监测终端开源项目评测:DHT11与HC-SR04复现避坑指南 最近挖到一个三件套齐全的STM32开源项目基于STM32F103C8T6的环境监测终端集成了DHT11温湿度采集、HC-SR04超声波测距、0.96寸OLED显示、按键和蜂鸣器报警。作者把Keil5工程源码、Altium Designer原理图和Proteus仿真全部丢在仓库里README还写了简单的接线说明。我花了两天时间把代码从头到尾走读了一遍又在仿真里折腾了几轮综合感觉是这项目属于“入门偏上”的典型水准能学到很多东西但也藏着不少只有真正踩过坑才能发现的问题。这篇就把我的完整评价和复现记录写出来想拿STM32做课设、准备毕业设计或者纯粹想找一个软硬件三件套齐全的练手项目的人可以参考一下。1. 项目整体画像三件套到底齐不齐1.1 功能拆解与外设选型逻辑这个项目的功能设计很典型用DHT11读温湿度用HC-SR04测前方障碍物距离把数据轮流显示在OLED屏上按键负责切换显示页面和调整报警阈值温湿度或者距离超出设定范围时蜂鸣器报警。整体看就是一个“环境参数监测 距离提醒”的小终端难度不算高但该有的嵌入式基本功全都能覆盖到。选型上作者用的是STM32F103C8T6这是目前课设和入门项目里最常见的主控没有之一。原因很简单C8T6这颗料有64KB Flash、20KB RAM跑这个项目绰绰有余价格便宜资料铺天盖地Keil5工程模板随便找。DHT11是单总线数字温湿度传感器成本极低但时序要求严格对新手来说是最容易卡壳的地方。HC-SR04超声波模块用TRIG和ECHO两个引脚工作原理简单测距范围和精度足够做避障演示。OLED是I2C接口的SSD13060.96寸128x64分辨率显示温湿度和距离绰绰有余。这套外设组合最大的优势是“覆盖面广”GPIO输入输出、外部中断、定时器、I2C、单总线时序、PWM蜂鸣器可以用PWM驱动基本上把STM32入门必学的几个外设全用上了。缺点也不是没有DHT11精度低、响应慢HC-SR04受声波反射角度影响大这两个传感器的读数波动明显用来演示没问题想拿去做严谨的数据采集就不太合适。我在看项目的时候一贯的观点是课设项目不怕功能简单怕的是外设单一、代码跑通就完事。这个项目的外设组合在展示层面是合格的。1.2 仓库结构与开源文档评价判断一个开源项目值不值得看我习惯先看仓库目录结构再看README最后才看代码。这个项目的目录是典型的正点原子风格分了Core、HARDWARE、SYSTEM、OBJ、MDK-ARM另外还有Doc和Simulation两个文件夹。Core里是启动文件和内核相关代码SYSTEM里是delay、sys、usart这三个基础模块HARDWARE里是各个外设驱动分层逻辑清楚不是那种所有代码堆在一个main.c里的反面教材。不过文档部分就有点遗憾了。README虽然写了功能清单和接线表但没有芯片型号的具体封装说明没有BOM表原理图原工程是在Doc里以PDF形式放出的没有留下可编辑的AD源文件。这带来一个实际问题如果你想自己改板子或者重新画PCB得照着PDF把原理图重画一遍工作量不小。开源项目最怕的不是代码烂而是“图纸缺胳膊少腿”。功能代码、原理图、仿真三件套虽然都齐了但文档的完整度只能算中等这在后续复现的时候会明显感觉到。我还注意到仓库里没有提供编译好的Hex文件也没有说明用的哪个编译器和芯片包版本。这个细节看着不起眼实际上对新手很不友好。不同版本的Keil5、不同版本的STM32F1芯片支持包编译出来的行为可能有细微差异尤其是启动文件和宏定义不匹配时代码可能直接编译不过。所以我的评价是代码和图纸本身有价值但开源资料的“工程完整性”还有提升空间。2. 源码走读能直接抄的部分和需要改写的部分2.1 工程模板与库的选择打开MDK-ARM的工程文件第一眼看到的是标准外设库StdPeriph_Lib而不是HAL库。这个选择在2025年的开源项目里其实有点“复古”现在ST官方主推的是HAL库和STM32CubeMX新项目基本都用HAL起步。但客观讲标准库对很多老工程师来说更亲切代码直白、寄存器操作看得见摸得着不像HAL那样包了好几层结构体读起来需要来回跳转。这个项目用标准库有个实际好处代码里你能直接看到GPIO_InitTypeDef结构体配置、RCC_APB2PeriphClockCmd开时钟、NVIC_Configuration配中断优先级整个外设初始化的流程非常透明。对于学习STM32的人来说标准库更容易建立“寄存器到外设”的对应关系。比如你想搞明白为什么用PA0之前要先开GPIOA的时钟标准库代码里那行RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE)就是答案。但代价也很明显。标准库已经停止维护新出的芯片型号根本不支持如果你以后想把这套代码移植到G0系列或者L4系列基本得推倒重来。另外工程里没有使用CubeMX生成的初始化代码所有外设初始化都是手写的这意味着换一个引脚、换一块板子都要去代码里翻配置对新手来说是个不小的门槛。我的建议是如果你是学原理标准库值得认真读一遍如果你是做项目建议迁移到HAL CubeMX代码生成快后续好维护。2.2 DHT11驱动时序是这门课的真正考点DHT11驱动是这个项目里最有分量的部分也是最能看出作者水平的部分。读完代码整体逻辑是对的主机先拉低DATA引脚至少18ms再释放然后读取DHT11的响应信号接着读40位数据8位湿度整数、8位湿度小数、8位温度整数、8位温度小数、8位校验和。校验和等于前四个字节之和的末8位这个校验逻辑在代码里实现了说明作者不是简单照搬例程而是理解了数据格式。核心代码如下我稍微做了整理uint8_t DHT11_ReadByte(void) { uint8_t i, byte 0; for (i 0; i 8; i) { while (DHT11_DQ_IN() 0); // 等待高电平50us低电平后是每一位的起始 delay_us(40); // 40us处采样 if (DHT11_DQ_IN() 1) // 如果还是高电平说明这一位是1 { byte (byte 1) | 1; while (DHT11_DQ_IN() 1); // 等待位结束 } else // 否则这一位是0 { byte (byte 1) | 0; } } return byte; }这段代码原理上没问题但我复现的时候调了好一阵。问题出在delay_us(40)的精度上。作者用的delay函数是SYSTEM文件夹里的软件延时基于SysTick实现在72MHz主频下通常比较准。可是如果工程里的时钟配置不对或者被编译器优化掉了这个40us的延时就会漂一旦漂到45us以上读出来的数据就会偶发错误。DHT11的时序手册上写的是高电平持续26us到28us表示070us表示1在40us这个采样点附近做判断容错窗口其实很窄。更靠谱的做法是用外部中断或者定时器输入捕获来测量高电平持续时间而不是靠延时后在中间采样。比如把DQ引脚配置成外部中断记录上升沿和下降沿的时间差时间差超过50us判为1否则判为0这样对延时函数完全没有依赖。这个项目用的是软延时方案在实物上勉强能用但每次读取前最好保证间隔超过1秒因为DHT11本身采样周期就是1秒读太频繁容易拿到旧数据甚至触发传感器无响应。2.3 HC-SR04测距超时保护比测量本身更重要HC-SR04的驱动逻辑比较好理解给TRIG引脚一个不低于10us的高电平脉冲模块内部会自动发出8个40kHz的超声波脉冲并等待回波回波到达后ECHO引脚会输出一段高电平高电平持续时间和距离成正比。用公式距离(cm) 高电平时间(us) / 58就能得到厘米值因为声速在空气中的传播速度大约是340m/s换算成往返距离就是每微秒0.034cm取倒数约29.4所以除以58是“去程回程”的标准算法。作者在代码里用的是阻塞式延时加读取void HC_SR04_Start(void) { GPIO_SetBits(GPIOB, GPIO_Pin_1); // TRIG拉高 delay_us(15); // 保持15us GPIO_ResetBits(GPIOB, GPIO_Pin_1); // TRIG拉低 } uint32_t HC_SR04_ReadDistance(void) { uint32_t time 0; HC_SR04_Start(); while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_2) 0); // 等待ECHO变高 TIM_SetCounter(TIM2, 0); TIM_Cmd(TIM2, ENABLE); while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_2) 1); // 等待ECHO变低 time TIM_GetCounter(TIM2); TIM_Cmd(TIM2, DISABLE); return time / 58; // 转换成厘米 }这段代码最大的问题是没有超时保护。如果超声波模块前方有吸音材料、模块损坏或者ECHO引脚根本没接对第一个while会永远等下去整个程序卡死在测距函数里。我实际测试时遇到过通信线接触不良导致ECHO一直低电平的情况现象就是OLED停在距离页面不再刷新按键也没反应。因为阻塞等待占用了CPU其他外设全部跟着停摆。正确做法有两个方向。其一是在等待循环里加超时判断比如用一个变量计数超过某个阈值比如100ms就认为测距失败返回一个错误标志其二是用外部中断加输入捕获让ECHO的上升沿触发定时器捕获下降沿触发第二次捕获两次捕获值相减得到高电平时间整个过程完全不阻塞CPU。对于这个项目来说哪怕只是在等待循环里加一个简单的超时计数器可靠性都能提升一大截。阻塞延时能跑通但不是工业级做法这是新手最容易忽略的问题。2.4 显示、按键与状态机OLED部分用的是SSD1306标准驱动I2C地址默认是0x787位地址0x3C代码里提供了基本的初始化、清屏、显示字符串和显示数字的函数。看代码能发现作者做了两个显示页面一个页面显示温湿度另一个页面显示距离和报警状态通过按键切换。按键处理算是个亮点。作者没有用简单的延时消抖而是用了一个基于循环扫描的简易状态机检测按键按下、确认消抖、触发动作、等待释放。这种写法虽然简单但比那种“delay(20ms)以后再判断一次”的粗暴方案好很多至少不会因为按键长按导致一次按下触发多次动作。当然也有槽点OLED的刷新方式是全屏清空再重新绘制每次刷新都会调用多次I2C写函数。在软件模拟I2C或者没有硬件I2C优化的工程里这个刷新过程会占用不少时间导致显示出现肉眼可见的闪烁。更合理的方式是只更新变化的区域或者使用局部刷新函数把温湿度数字对应的坐标区域单独重绘。反正我复现的时候闪烁问题比较明显最后改成局部刷新才舒服一点。2.5 代码层面最大的三个坑第一全局变量满天飞。温度、湿度、距离、报警阈值全是全局变量而且分散在多个文件里extern引用。代码量小的时候没问题一旦功能扩展比如加入WiFi模块、加入多级菜单这种写法会迅速失控。第二错误处理几乎为零。DHT11读取失败返回的是一组错误码但主循环里没做容错直接把错误码当成正常数据显示于是OLED上出现了“湿度: 255%”这种荒唐数据。正确的做法是给传感器数据加一个有效性标志连续多次读取失败后再显示异常提示。第三中断和主流程共享变量没有任何保护。虽然这个项目里中断会修改全局标志主循环读取标志看似简单但在复杂场景下会引发可重入问题至少应该加volatile修饰再考虑临界区保护。这些坑在这个小项目里不算致命但是带到以后的大项目里就是事故隐患。3. 原理图评价能从原理图看出作者的画板功底3.1 最小系统与电源设计原理图第一个值得看的是电源和最小系统部分。作者用了AMS1117-3.3把外部5V降压到3.3V给STM32供电输入输出各加了10uF和0.1uF电容滤波这点做得不错。AMS1117虽然压差大、效率一般但在这种USB供电或5V适配器供电的场景下完全够用。真正让我皱了皱眉的是3.3V电源网络的电容位置按常规做法10uF应该尽量靠近芯片输入端0.1uF靠近输出端但作者的图上两个电容都堆在电源入口附近没有严格贴近AMS1117的引脚。这种布局在面包板和手焊板上问题不大但如果是自己画PCB打样电源纹波可能会让DHT11和超声波模块读数飘。最小系统部分8MHz晶振加两个20pF负载电容、复位电路、BOOT0下拉、SWD下载口这些该有的都有。作者用的是SWD四线接口SWDIO、SWCLK、GND、3.3V这比JATG接口节省引脚对于C8T6这种20KB RAM的小芯片来说很实用。唯一缺的是没有在SWD接口旁边加一个TXD/RXD的串口引脚引出虽然代码里用到了USART1打印调试信息但板子上没有把PA9、PA10引到排针调试的时候还得飞线不太方便。3.2 传感器接口与电平匹配DHT11部分DATA引脚接PB0作者在DATA和3.3V之间画了一个4.7k上拉电阻这个细节很关键。DHT11单总线协议要求主机释放总线后由上拉电阻把电平拉高如果没有这个上拉电阻通信在长线或者高温高湿环境下会非常不稳定。很多新手抄DHT11例程时只画传感器不加上拉然后怪代码有问题其实问题出在硬件上。HC-SR04部分有一个更大的问题模块是5V供电的但是ECHO引脚输出的高电平也是5V而STM32的GPIO耐压和逻辑高电平上限是3.6V左右直接接会有风险。作者的原理图上HC-SR04的VCC接5VTRIG接PB1ECHO接PB2没有做任何电平转换。运气好时STM32的引脚内部的钳位二极管能把5V钳到3.6V左右仍然能读到高电平但长时间使用或者5V电源纹波大时引脚可能被拉坏更稳妥的做法是用两个电阻分压把ECHO的5V高电平分到3.3V即串一个1k和2k电阻2k电阻接地中间节点接STM32引脚。或者用一个简单的MOS管电平转换电路。这个点是这个原理图最大的硬件隐患如果要自己打板我建议优先改这里。OLED接口用的是I2CSCL和SDA分别接PB6和PB7上拉电阻也画了而且选的是4.7k。这个阻值在400kHz快速模式下略大但在100kHz标准模式下够用。OLED模块本身是3.3V供电和STM32共地这部分设计没问题。3.3 从EDA工程到PCB的隐患作者的原理图是在Altium Designer里画的打印成PDF后给到我们的只有图纸内容没有源工程。看图的整体观感是页面布局比较随意电源符号和网络标号使用不规范比如3.3V有时候画成电源端口符号有时候直接用网络标号GND也有两种画法中间还混着几个电源地的符号。这种风格自己看没问题但别人接手看图的时候需要花时间梳理。另外原理图上蜂鸣器驱动电路用的是NPN三极管S8050基极串联1k电阻接到STM32引脚集电极接蜂鸣器到5V发射极接地蜂鸣器两端没有反向续流二极管。这个电路用于无源蜂鸣器问题不大因为无源蜂鸣器本质是感性负载驱动PWM时三极管关断瞬间会产生反向电动势长期使用可能损坏三极管。如果是用有源蜂鸣器或者电磁式蜂鸣器最好在蜂鸣器两端反向并联一个1N4148续流二极管。细节虽小但对硬件的长期可靠性有直接影响。3.4 我改过的几个原理图细节复现时我在原图基础上做了三处修改效果立竿见影。第一处把HC-SR04的ECHO输出加了分压电阻虽然手焊有点丑但STM32引脚电压稳定在3.3V不用再担心烧引脚。第二处把OLED的I2C上拉改成2.2k在400kHz快速模式下波形更陡通信更稳定代价是功耗略高这个场景无所谓。第三处给蜂鸣器加续流二极管并且在基极电阻前面并了一个10k下拉电阻防止STM32上电瞬间GPIO高阻态导致三极管误导通蜂鸣器“上电叫一声”的毛病解决了。这些修改都是小改动但它们的价值在于你从“抄一个能用的原理图”进化到“理解每一个元件为什么在这里”。我经常说画原理图不是为了画得漂亮是为了让电路在电气特性上站得住脚。这个项目整体原理图水平能有个及格偏上的分但严谨性还差一些正好适合用来练习改进。4. 仿真工程评价仿真能跑通不等于实物能跑通4.1 Proteus仿真环境与文件情况作者在Simulation文件夹里放了一个Proteus工程文件我打开以后发现他用的Proteus版本是8.9以上芯片模型选的STM32F103C8外设画了OLED、DHT11、HC-SR04和按键。Proteus里跑STM32仿真有两种方式一种是直接加载Keil编译出来的Hex文件另一种是把.elf文件加载进去跑。作者给的是加载Hex文件的方案这比加载elf要省事因为不需要在Proteus里额外配置编译器路径。仿真工程里DHT11用的是Proteus自带的数字温湿度传感器模型HC-SR04也有现成模型OLED则是用了一个图形LCD模型来模拟SSD1306。这里有个值得注意的点Proteus的OLED模型和真实的SSD1306模块在初始化时序上兼容性有限经常出现真实代码在实物上正常但在仿真里显示异常的情况。我试过这个项目在Proteus里跑OLED一开始是全黑的后来发现是I2C时序在仿真环境下被拉长了把I2C时钟速度降低以后才显示出来。4.2 仿真里遇到的典型问题第一个典型问题就是刚才说的OLED黑屏。解决方式是修改SSD1306初始化的I2C延时参数或者直接把I2C时钟配置从400kHz改成100kHz。在真实硬件上400kHz能跑但仿真模型对时序更敏感慢一点反而稳定。第二个问题是DHT11在仿真里读出来的数据偶尔全是0xFF。排查后发现是仿真模型对上电时序有要求DHT11模型需要在仿真开始前给它至少2秒的“预热时间”否则传感器状态机没有准备好主机读到的永远是无效位。这个现象在真实硬件上几乎不会发生但也提醒我一件事如果仿真里传感器读数异常不要急着怀疑代码先检查模型是否处于正确的初始状态。第三个问题比较隐蔽。HC-SR04模型在Proteus里回波时间是完全理想的不受障碍物角度和材质影响所以仿真测距结果非常精准永远是整数厘米。但真实环境中超声波遇到斜面会产生漫反射测量值会跳变而且超过有效测量范围后ECHO可能长时间不拉低造成代码卡死。我在仿真里没发现代码的卡死问题恰恰说明阻塞式读取在理想仿真环境里把真实风险掩盖了。仿真适合验证逻辑正确性不适合验证硬件鲁棒性这句话在这个项目上体现得很充分。4.3 仿真和实物的差异到底在哪仿真和实物最核心的差异有两个层面。第一个是电气层面仿真模型不会真实模拟引脚驱动能力、电平上升沿时间、噪声和电源纹波所以I2C时序、单总线时序这些对电气特性敏感的部分仿真里能跑通不代表实物上波形合格。第二个是时序层面Proteus里的MCU模型执行指令的速度和真实芯片有偏差特别是软件延时函数在仿真里可能比真实环境慢很多或者快很多。这个项目大量使用delay_us所以仿真的表现和实物之间很可能对不上。我建议把仿真当成“代码逻辑的验证工具”而不是“最终验收工具”。在这个项目里你可以在仿真里确认按键切换页面、温湿度显示逻辑、报警阈值判断这些功能是否正确但在实物上你必须用示波器或逻辑分析仪确认DHT11的数据位宽度、HC-SR04的ECHO高电平时间是否合理。软件仿真永远代替不了硬件调试这是我做了这么多年嵌入式项目最深的体会。5. 复现全过程与避坑清单5.1 工具链准备Keil5、芯片包、ST-Link与常见故障复现的第一步是搭工具链。你需要Keil MDK 5.x然后安装STM32F1系列的器件支持包DFP。这个包可以在Keil官网或者Pack Installer里下载装好之后才能在Device列表里选到STM32F103C8。下载器我推荐ST-Link V2便宜、稳定兼容性比某些山寨J-Link好得多。连线和烧录用的是SWD四线ST-Link的SWDIO接PA13、SWCLK接PA14、GND接GND、3.3V接3.3V。这里必须提两个我见过无数人踩的坑。一个是编译时提示找不到头文件或者芯片型号九成是器件支持包没装对或者没在工程选项里选正确的Device型号C8T6的Device要选STM32F103C8不要选成CB或者RC。另一个是下载时报“Cannot Connect to Target”先检查ST-Link驱动是否正常、接线是否牢固如果还不行把STM32的BOOT0用跳线接到1高电平让芯片进入ISP模式再连接下载一次通常就能救回来。另外Keil5安装后如果报缺少msvcp140.dll那是因为电脑没有安装Visual C 2015-2022运行库去微软官网下载对应的vc_redist.x64.exe装上就能解决这跟Keil本身没什么关系。还有人在Windows下插上ST-Link后设备管理器里显示感叹号或者提示“STM32无法识别USB设备”优先检查是不是用了延长线或者劣质USB HUB换一个电脑原生USB口通常就好了。5.2 接线与硬件调试细节如果是买最小系统板加传感器模块来做实物接线就按作者README里的表格来。DHT11的DATA接PB0HC-SR04的TRIG接PB1、ECHO接PB2OLED的SCL接PB6、SDA接PB7。注意DHT11模块有些淘宝板子自带上拉电阻有些没有如果模块上没有上拉必须在面包板上补一个4.7k到3.3V否则读数大概率是0.0或者255。HC-SR04的供电比较讲究。很多人直接把模块的VCC接到STM32核心板的5V引脚上同时ECHO直接接STM32的PB2这就有前面说的电平不匹配问题。建议在面包板上做一个简单的分压ECHO引脚先串一个1k电阻然后再并一个2k电阻到GND分压节点接到PB2。这样5V高电平被分到约3.3V安全又稳定。TRIG引脚是输入信号STM32输出3.3V高电平就能触发不需要额外处理。还有一个接线细节是共地。STM32核心板的GND、HC-SR04的GND、OLED的GND、DHT11的GND还有5V电源的GND必须全部连在一起。如果使用USB供电核心板的GND往往已经和USB共地但面包板上的模块GND如果漏接传感器会偶发无响应。我复现时DHT11读数飘得厉害排查了半天最后发现是模块的GND没插紧重新插牢后一切正常。5.3 调试三板斧串口、逻辑分析仪、示波器代码跑起来以后建议先通过串口打印数据验证传感器是否正常。这个项目代码里已经有USART1的printf重定向用USB转TTL模块接PA9TX和PA10RX打开串口助手波特率115200能看到DHT11和HC-SR04的原始返回值。如果串口输出乱码多半是波特率不匹配或者晶振配置错误。DHT11时序用逻辑分析仪来抓是最直观的。把逻辑分析仪的通道接到PB0采样率至少10MHz然后触发一次读取分析仪上能清楚看到主机拉低18ms、传感器响应、40位数据脉冲。每一位的高电平宽度在26us到70us之间一看就知道代码的延时有没有跑偏。HC-SR04则用示波器观察ECHO引脚测距时应该能看到一个宽度随距离变化的高电平脉冲宽度除以58就是厘米数。如果示波器上ECHO始终没有脉冲先查TRIG引脚是否输出了10us以上的高电平再查模块供电。5.4 二次开发路线建议这个项目复现成功之后完全可以再往上加东西。最推荐的方向是把数据通过串口发给上位机做一个简单的实时曲线显示代码量不大但展示效果提升明显。如果你想往物联网方向走可以加一块ESP8266或者ESP32模块用UART把温湿度和距离数据上传到MQTT服务器这就是一个完整的物联网终端了做毕业设计会更有看点。如果想在嵌入式系统层面深挖可以在现有代码基础上引入FreeRTOS。DHT11读取、超声波测距、OLED刷新、按键扫描分别放到独立任务里用队列或者信号量做任务间通信。这样不仅解决了当前阻塞式读取导致的其他任务卡死问题还能让项目上一个档次面试时聊起RTOS任务调度也有实际案例可以讲。同样的硬件不同的软件架构项目的含金量完全不同这个项目就是很好的改造素材。6. 分项评分与使用建议6.1 打分表与评分依据复现完整之后我给这个开源项目做了一个分项评分评分标准是“作为一个给他人学习的开源参考项目在代码、图纸、仿真、文档四个维度的可用性”。打分如下评价维度分数满分10分主要依据代码完整性7.0外设驱动齐全、主流程清晰、能编译运行但全局变量多、错误处理缺失代码可读性6.5模块划分合理、函数命名清楚但缺少注释、部分延时参数魔法数原理图可读性7.5最小系统完整、传感器接口基本正确但画图规范一般、无PCB源文件仿真可用性7.0仿真工程能跑通但OLED显示兼容性差、模型理想化掩盖真实问题文档完善度5.5README有接线说明但缺BOM、缺芯片型号封装、缺编译配置说明综合推荐度7.0作为学习项目合格作为可直接照抄生产的项目不合格这个分数不算高但对于学习目的来说很合适。我见过太多“包装完美但代码空洞”的开源项目相比之下这个项目至少是实打实能跑、能改、能学到东西的。开源项目的好坏不只看代码质量更看它能给你多少改进和思考的空间。6.2 哪些人适合拿这个项目练手如果你是刚学完STM32基础、准备做第一个综合项目的学生这个项目很适合你。它把GPIO、外部中断、定时器、I2C、单总线全部串起来代码量适中原理图能看懂仿真能跑通你可以在它的基础上改功能、加页面、换传感器甚至重画PCB。如果你是准备做毕业设计建议不要直接拿它交差而是做二次开发。加一个ESP8266上传云端、做一个手机小程序查看数据、或者把DHT11换成SHT30提高精度整体工作量比从零开始做要小但项目完整度和技术难度都能明显提升。我特别喜欢把它当成一个“改造练习”先按原版复现一遍然后自己画一块PCB把电平转换、按揭消抖、传感器容错这些问题都修掉最后你会发现自己已经能把一个及格项目改造成优秀项目了。复现这个项目的整个过程里我最深的感受是真正有价值的不是作者写好的那套代码而是你发现代码缺陷、硬件隐患并动手修复的过程。从DHT11时序分析到HC-SR04电平匹配再到仿真和实物的差异每一个坑都是一次实打实的嵌入式基本功训练。如果你也准备啃这个项目建议把速度放慢不要只满足于下载、编译、烧录、看到OLED亮起来——把每一段代码、每一根连线、每一个元件的用途都问一遍为什么结束后你会感激这个看起来有点小瑕疵的开源项目。
返回列表