资讯动态

基于STM32F103C8T6的甲醛CO2温湿度检测与自动换气系统设计

发布时间:2026/10/2 1:20:55 来源:尧图企业网站定制
1. 从一个甲醛超标的新装修房间说起去年帮朋友处理新房入住前的空气检测问题他买了几百块的所谓专业检测仪测出来的数据跟第三方CMA机构的结果差了将近三倍。拆开一看里面就是一颗廉价半导体传感器加一个没有标定的ADC连温湿度补偿都没做。这件事让我重新审视了室内空气质量检测这个看起来门槛很低、实际上坑很深的领域。这篇内容要聊的是用STM32F103C8T6这颗经典到不能再经典的单片机搭一套能同时检测甲醛、CO2、温湿度并且带自动换气警示的室内空气质量检测系统。核心传感器选型是DHT11温湿度、MQ-138甲醛、MQ-135空气质量/CO2趋势。整套方案的成本可以压到百元以内精度虽然比不上专业仪器但用于家庭日常趋势监测和换气提醒完全够用。适合谁来读如果你正在做单片机课程设计、毕业设计或者想自己动手做一个真正能用的环境监测设备而不是那种跑个Demo就吃灰的玩具这篇内容会把你从选型、电路、驱动到标定、警示逻辑的完整链路讲透。我会重点讲那些教程里不会写、但实际调试时一定会遇到的问题比如MQ系列传感器的预热曲线、DHT11的时序容错、以及为什么你的甲醛读数一直在飘。2. 传感器选型为什么是这三颗而不是别的2.1 DHT11的定位与被低估的时序坑温湿度检测这块可选的方案很多DHT11、DHT22、SHT30、AHT20、BME280……为什么标题里锁定DHT11原因很现实——便宜、资料多、单总线协议简单一颗不到五块钱是学生项目和入门产品的默认选择。但它的缺点同样明显湿度精度±5%RH温度精度±2℃采样率只有1Hz而且单总线时序对延时极其敏感。很多人用HAL库驱动DHT11时直接调用HAL_Delay()做微秒级延时结果读出来的数据全是0或者校验失败。根本原因是HAL_Delay()的最小分辨率是1ms而DHT11的时序要求是微秒级。正确的做法是用DWTData Watchpoint and Trace周期计数器或者定时器来做微秒延时。我实测下来用SysTick配置成1us中断也能凑合但会引入抖动最稳的还是DWT方案代码量也就十几行。另一个坑是上拉电阻。DHT11的数据线必须接一个4.7k到10k的上拉电阻到3.3V或5V。有些模块自带上拉有些裸传感器没有如果你直接从裸传感器飞线到单片机忘了上拉读出来的永远是高电平。这个坑我见过太多人踩。2.2 MQ-138与MQ-135半导体传感器的真实面目MQ系列是半导体式气敏传感器工作原理是敏感材料通常是二氧化锡SnO2在加热状态下接触到还原性气体时电导率发生变化从而引起输出电阻变化。MQ-138对甲醛、苯、甲苯等VOC敏感MQ-135对氨气、硫化物、烟雾以及CO2趋势敏感。这里必须说清楚一个残酷的事实MQ系列传感器无法精确测量单一气体浓度。它们输出的是对多种气体的综合响应你只能得到一个相对趋势值。市面上那些标称甲醛检测精度0.01mg/m³的产品如果用的是MQ-138基本都是在忽悠。但这不代表它没用——用于判断空气质量变差了该开窗了这个场景它完全胜任。选MQ-138和MQ-135而不是MQ-2、MQ-7是因为前者对甲醛和CO2相关气体的交叉灵敏度更匹配室内场景。MQ-2主要测可燃气体MQ-7测一氧化碳用在室内空气质量检测上属于专业不对口。2.3 三颗传感器的协同逻辑传感器检测目标输出形式预热时间典型精度DHT11温度、湿度数字单总线1s±2℃ / ±5%RHMQ-138甲醛/VOC模拟电压24h完全稳定趋势级MQ-135CO2趋势/空气质量模拟电压24h完全稳定趋势级三者的数据要联合解读才有意义。比如甲醛读数升高同时湿度也升高、温度下降那很可能是传感器受温湿度影响产生的漂移而不是真的甲醛超标。这就是为什么系统里必须同时采集温湿度——温湿度补偿是半导体传感器数据可用的前提。3. 硬件架构STM32F103C8T6最小系统怎么接3.1 引脚分配与资源规划STM32F103C8T6有48个引脚可用IO足够。我的分配方案如下PA0MQ-138模拟输出 → ADC1_IN0PA1MQ-135模拟输出 → ADC1_IN1PA2DHT11数据线需4.7k上拉PA3蜂鸣器控制换气警示PA4LED指示灯空气质量等级PA9/PA10USART1用于调试输出和上位机通信PB0风扇/换气设备继电器控制PB1按键输入手动消警/切换显示ADC用12位分辨率参考电压3.3V。MQ传感器的模拟输出范围通常在0到3.3V之间但要注意MQ-135在清洁空气中输出约0.5V到1V污染时可能超过3V所以不需要额外分压直接接ADC即可。3.2 供电与加热电路的注意事项MQ系列传感器内部有一个加热丝功耗不小。MQ-138加热功耗约800mWMQ-135约800mW两个加起来1.6W。如果用USB 5V供电电流约320mA加上STM32和其他外设总电流可能超过500mA。不要用电脑USB口直接供电容易触发过流保护导致单片机复位。建议用独立的5V/2A电源适配器或者用AMS1117-3.3给单片机单独稳压。还有一个细节MQ传感器的加热丝需要持续供电不能间歇断电。有些人为了省电用IO口控制加热丝通断结果每次上电都要重新预热数据根本没法用。正确做法是加热丝直接接5V常通只在整机断电时才停止加热。3.3 继电器与换气设备的接口自动换气警示的核心执行机构是继电器模块。STM32的IO输出3.3V驱动能力只有20mA左右不能直接驱动继电器线圈。标准做法是用S8050三极管或者现成的光耦继电器模块。如果继电器模块是低电平触发注意STM32复位期间IO默认是高阻态可能导致继电器误动作。稳妥的做法是在三极管基极加下拉电阻确保复位期间继电器保持断开。继电器控制的是排气扇或者新风系统的电源。如果是交流220V设备强电部分必须做好隔离继电器模块的强弱电间距要足够走线不要交叉。这部分涉及用电安全动手能力不强的建议直接买带光耦隔离的成品继电器模块。4. 软件驱动从ADC采样到数据滤波4.1 DHT11的微秒级时序实现DHT11的通信流程是主机拉低至少18ms → 释放 → 等待DHT11响应 → 读取40位数据。关键在于读取每一位时的延时判断。每一位以50us低电平开始随后高电平持续26-28us表示0持续70us表示1。用DWT实现微秒延时的核心代码// DWT初始化 void DWT_Init(void) { CoreDebug-DEMCR | CoreDebug_DEMCR_TRCENA_Msk; DWT-CYCCNT 0; DWT-CTRL | DWT_CTRL_CYCCNTENA_Msk; } // 微秒延时 void DWT_Delay_us(uint32_t us) { uint32_t start DWT-CYCCNT; uint32_t ticks us * (SystemCoreClock / 1000000); while ((DWT-CYCCNT - start) ticks); }读取一位的逻辑uint8_t DHT11_ReadBit(void) { uint8_t retry 0; while (HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) GPIO_PIN_RESET) { if (retry 100) return 0; // 超时保护 } DWT_Delay_us(40); if (HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) GPIO_PIN_SET) { retry 0; while (HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) GPIO_PIN_SET) { if (retry 100) return 1; } return 1; } return 0; }注意DWT_Delay_us里的超时保护不能省。如果传感器没接好或者损坏没有超时保护的程序会死循环整个系统卡死。4.2 ADC多通道采样与DMA搬运MQ-138和MQ-135需要持续采样。用轮询方式会占用CPU推荐用ADCDMA自动搬运。配置ADC1为扫描模式规则组两个通道DMA循环模式缓冲区大小2。这样CPU只需要定期读取缓冲区即可。采样频率建议每秒10次然后做滑动平均滤波。半导体传感器的输出噪声比较大单次采样波动可能有±50mV。用20点滑动平均能把波动压到±10mV以内。如果追求更平滑可以用一阶低通滤波filtered filtered * 0.9 new_sample * 0.1;这个系数0.1对应的时间常数大约10个采样周期即1秒。对于空气质量监测这种慢变量1秒的响应完全够用。4.3 温湿度补偿的简化模型半导体传感器的输出受温湿度影响显著。一个简化的补偿思路是以25℃、50%RH为基准温度和湿度每偏离基准一定量对传感器读数做线性修正。具体系数需要根据实测数据拟合但一个经验公式是补偿后读数 原始读数 × (1 0.02 × (温度 - 25)) × (1 - 0.005 × (湿度 - 50))这个公式不是精确的物理模型但能把温湿度变化引起的漂移压掉一大半。实际项目中我建议先用这个公式跑起来然后根据实际数据微调系数。5. 标定让读数从能看变成可信5.1 为什么必须做标定MQ传感器出厂时没有经过标定每个传感器的初始电阻R0都不一样。不标定的读数只能看相对变化不能看绝对值。标定的目的就是确定每个传感器在清洁空气中的基准电阻R0之后所有浓度计算都基于R0进行。标定方法把传感器放在清洁空气中室外或通风良好的室内预热24小时记录此时的传感器电阻Rs这个值就是R0。注意预热时间不够的话R0会偏大导致后续所有读数偏低。5.2 从电阻到浓度的换算MQ传感器的标准换算公式是Rs (Vc - Vout) / Vout × RL 浓度 a × (Rs/R0)^b其中Vc是回路电压通常5VVout是ADC测到的电压RL是负载电阻模块上通常已焊好a和b是拟合系数需要查传感器手册或者自己拟合。对于MQ-138测甲醛一个常用的近似系数是a0.4b-1.5针对甲醛浓度单位ppm。但这个系数因传感器批次而异最好用标准气体或者对比专业仪器做一次两点标定。5.3 没有标准气体怎么办大多数个人项目没有条件用标准气体标定。我的经验是用清洁空气和已知污染源做两点标定。比如先在室外清洁空气中记录读数然后在密闭小空间里放一块新板材或者喷一点酒精记录读数变化。虽然不能得到精确的ppm值但能确定报警阈值对应的ADC读数这对于自动换气警示这个核心功能来说已经足够。标定方式精度成本适用场景标准气体高高商业产品专业仪器对比中高中有条件的个人项目清洁空气污染源低低学生项目、DIY6. 自动换气警示的逻辑设计6.1 多级阈值与迟滞比较最简单的警示逻辑是超过阈值就开风扇但这样会导致频繁启停。比如甲醛读数在阈值附近波动风扇就会反复开关。解决办法是引入迟滞比较超过阈值A时开启低于阈值B时才关闭A和B之间留出10%到20%的间隔。我设定的三级阈值如下一级良好甲醛0.08mg/m³CO2趋势值800ppm等效绿灯二级轻度污染甲醛0.08-0.15CO2趋势800-1200黄灯蜂鸣器间歇响三级重度污染甲醛0.15CO2趋势1200红灯蜂鸣器长响继电器开启换气迟滞设计三级降到二级的阈值比二级升三级的阈值低15%二级降到一级的阈值比一级升二级的阈值低15%。6.2 温湿度参与的综合判断单纯看甲醛读数容易误判。如果温度高、湿度大甲醛释放速度本来就快这时候读数偏高是正常的。我的做法是当温度超过28℃且湿度超过70%时把甲醛报警阈值上调20%避免因为环境因素导致的误报。反过来如果温度低、湿度低甲醛读数还很高那说明污染源确实严重应该更积极地报警。6.3 换气设备的联动策略继电器控制换气设备时不要一报警就立刻开。我的策略是三级污染持续超过30秒才开启换气避免瞬时干扰导致误动作。开启后即使读数降到二级也继续运行至少2分钟确保空气充分置换。这个最小运行时间的设计能显著延长继电器寿命也避免风扇频繁启停。7. 调试中遇到的真实问题与解决过程7.1 甲醛读数一直飘换了三个传感器才找到原因项目刚跑起来时MQ-138的读数在半小时内从0.05飘到0.3完全没有规律。我一开始怀疑是ADC噪声加了滤波没用又怀疑是电源纹波换了LDO也没用。最后用示波器看加热丝电压发现5V电源在加热丝启动瞬间有200mV的跌落导致传感器输出跟着跳。解决办法是在加热丝供电脚旁边并一个100uF电解电容加0.1uF陶瓷电容把瞬态跌落压到20mV以内。读数立刻稳定了。这个坑很隐蔽因为万用表看不出来必须用示波器才能抓到。7.2 DHT11偶尔校验失败不是传感器坏DHT11的校验和是前四个字节相加取低8位。偶尔失败通常是时序抖动导致的。我试过三种方案DWT延时、定时器延时、汇编NOP延时。最终DWT方案成功率最高但在中断频繁的系统里仍然会偶发失败。解决办法是读失败后重试三次三次都失败才报错。实测下来重试机制能把有效读取率从95%提到99.9%以上。7.3 继电器动作导致单片机复位这个问题困扰了我两天。每次继电器吸合的瞬间单片机就重启。排查后发现是继电器线圈的反向电动势通过共地路径干扰了单片机。解决办法是在继电器线圈两端并一个续流二极管1N4148即可同时在单片机和继电器之间加光耦隔离。如果用的是成品继电器模块通常已经带了续流二极管但光耦隔离不一定有买的时候要看清楚。7.4 长时间运行后数据漂移系统连续运行一周后MQ-135的基线慢慢往上飘。查资料后确认这是半导体传感器的正常老化现象敏感材料会随时间缓慢变化。解决办法是定期自动重新标定每天凌晨3点当室内空气质量应该最好的时候把当前读数作为新的R0参考值做一次软标定。这个策略能把长期漂移控制在可接受范围内。8. 外壳与部署让设备真正融入室内环境8.1 传感器开孔与气流设计MQ传感器需要空气流通才能准确反映环境浓度。如果外壳完全密封传感器周围的气体不流动读数会严重滞后。我的做法是在外壳底部和顶部各开一排小孔形成自然对流通道。DHT11也要暴露在气流中但不能被阳光直射否则温度读数会偏高。8.2 放置位置的选择室内空气质量检测设备的放置位置对读数影响很大。不要放在墙角、柜子里、或者靠近窗户。最佳位置是房间中央、离地1到1.5米、离墙至少30厘米。如果只能放桌上也要避免靠近空调出风口和暖气片。我实测过同一个房间不同位置的甲醛读数能差30%以上。8.3 长期运行的稳定性建议如果打算长期运行建议加一个看门狗STM32内置IWDG即可防止程序跑飞。另外每季度用毛刷清理一次传感器表面的灰尘灰尘覆盖会显著降低灵敏度。电源适配器要选质量好的劣质适配器的纹波会直接干扰ADC采样。9. 关于这套系统能做什么、不能做什么我在多个房间部署过这套方案累计运行超过半年。它最大的价值是趋势监测和换气提醒——当甲醛或CO2趋势上升时及时开窗这个功能非常实用。但它不能替代专业检测如果你需要法律效力的检测报告还是得找CMA认证机构。这套系统的成本大概在80到120元之间其中STM32最小系统板约15元DHT11约5元MQ-138约25元MQ-135约20元继电器模块约8元加上外壳、电源、杂项百元出头。相比市面上几百上千的智能检测仪它的数据透明度更高你知道每一个读数是怎么来的也知道它的局限性在哪里。最后分享一个我在实际部署中总结的小技巧把报警阈值设得比国标略低一点。比如甲醛国标是0.08mg/m³我把一级报警设在0.06。这样在真正超标之前就能收到提醒留出足够的通风时间。对于有老人小孩的家庭这个提前量很有意义。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑