
Sensor-Based Smart Air Convector直译过来就是“基于传感器的智能空气对流器”。我最初看到这个名字第一反应是这不就是给取暖器装个温度探头吗真做下来才发现从“能测温”到“控得稳、用得省、还够聪明”中间隔了整整一套系统工程——传感器选型、控温算法、人感策略、本地自动化每一项都是坑。这篇文章就把我从零搭建这类设备的完整过程拆开讲清楚包括传感器怎么选、控制逻辑怎么定、固件怎么配、实际调试中会遇到哪些问题。适合正在做全屋智能温控的朋友也适合手里有普通对流式电暖器、想低成本改造成智能设备的人参考。1. 先想清楚需求再做智能对流器到底要解决什么问题1.1 传统对流器最让人头疼的三个痛点空气对流器也叫对流式取暖器核心原理是利用冷热空气密度差形成自然对流让整个房间慢慢热起来。和暖风机相比它胜在安静、不干燥、体感舒服但也正因为加热过程温和带来了三个特别明显的痛点。第一个痛点叫“温度过冲”。大多数普通对流器温控就是机械式双金属片到达设定温度就断电低于设定温度再通电。听起来没问题但因为加热体本身有巨大的热惯性断电后余热还会继续释放房间温度往往会高出设定值1到2度。冬天睡觉时如果设定22℃一觉醒来可能已经24℃又热又闷这就是“过冲”。第二个痛点叫“人走机不关”。固定安装在对流器上的传感器只能感知自身周围的温度无法知道你离家后需不需要继续供暖。白天上班忘关一千多瓦的设备开一整天电费哗哗流。我身边有好几位朋友就因为这个问题放弃了所有电暖器宁可开空调。第三个痛点叫“数据不能联动”。普通对流器不知道自己所在的房间是卧室还是书房不知道今天外面降温也不知道你家智能门锁已经锁门。它永远是“单机版”和整个智能家居生态是断裂的。1.2 整体设计思路传感器控制器执行机构联动平台处理这三个痛点关键在于把“靠封装在机器里的简单温控器控制”换成“由外部多个传感器提供数据、由核心控制逻辑做决策、再由执行机构精确控制功率”的完整链路。整个系统按功能可以拆成四层感知层、决策层、执行层、联动层。感知层部署温湿度、人体存在、空气质量等传感器决策层是核心控制单元我选择用ESP32这类低功耗单片机做数据处理和PID运算执行层控制加热体通断比如继电器或固态继电器联动层则通过MQTT或Home Assistant把设备数据同步到全屋智能平台实现离家、睡眠模式等场景联动。这个思路最大的好处是传感器和加热器解耦。温度探头可以放在书桌旁、床边而不是被绑在机器侧面人感可以有多个卧室门口一个、床头一个控制逻辑想怎么改就怎么改。相当于把一台封闭的电器拆成了你可以自由组合的乐高套件。1.3 我为什么坚持“本地自动为主、云端联动为辅”很早以前我做过一版全云端的智能温控温度上传到云平台由云端规则引擎下发指令。结果遇到一次宽带故障整个供暖系统直接“罢工”我到家差点冻感冒。从那以后我的原则就变成凡是涉及安全、温度、能耗的关键控制必须本地闭环云端只做远程查看、统计和场景联动。也就是说断网的情况下对流器依然能按PID策略稳定控温依然能在感应到人离开后自动降功率只是暂时不能同步到手机App。这对实用性和安全性都是决定性的。你可以用Home Assistant或ESPHome搭建这种本地优先系统网络只是锦上添花不是命脉。2. 传感器选型与采集要点别让数据源头拉胯2.1 温湿度传感器DHT22、SHT30、BME280怎么选温湿度是整个系统里最关键的数据没有之一。很多人的第一反应是选最便宜的DHT11但我强烈建议至少在DHT22、SHT30、BME280之间做选择。DHT11的精度只有±2℃作为控温依据简直灾难会产生“明明显示21℃却冻得发抖”的崩溃体验。这三款传感器我用下来有很清晰的结论DHT22便宜够用但响应慢、读取时序敏感SHT30精度高、通信稳定I²C接口省事是性价比最好的选择BME280除了温湿度还能测大气压适合要做气象站场景的朋友但气压数据对供暖本身没太大帮助属于锦上添花。我最终在主卧室采用了SHT30书房用了BME280两者长期运行都非常稳。给一张实际对比表传感器温度精度湿度精度接口采样速率表现适用场景DHT22±0.5℃±2%RH单总线读取需间隔2秒低成本入门SHT30±0.3℃±2%RHI²C最高10Hz控温核心推荐BME280±0.5℃±3%RHI²C/SPI最高20Hz多参数气象监测DS18B20±0.5℃不支持单总线最高12位采样测加热器表面温度/防过热如果你打算把探头放在室外或窗户边测气温DS18B20这种防水封装很合适但要注意它和DHT22一样是单总线时序通信连续读的时候记得加延时。我测试中发现ESP32同时挂三个单总线传感器偶尔会有一个读失败加一个5秒重试机制基本就解决了。2.2 人体存在检测PIR、毫米波雷达的取舍要说智能对流器和普通温控最大的区别人体传感器是灵魂。传统PIR热释电传感器能感知“有没有人动”但人静坐看书、睡着后几乎不动PIR会误判为无人然后设备进入节能模式把人冻醒。这是所有第一批尝试PIR控温的人都会踩的坑。后来我换成毫米波雷达方案比如海曼LD2410或HI-Link LD2410B。它用的是多普勒雷达原理能检测到微动和呼吸带来的微小位移人坐在椅子上看手机一小时也能准确识别为“有人”。实测下来探头的“有人”“无人”状态输出非常稳定延迟也只在1到2秒左右。但毫米波雷达要注意安装位置和朝向。探头正对窗户、金属门框或电扇时容易产生误触发。我的经验是把雷达固定在墙体侧边向下倾斜15到20度避开直线朝窗的方向同时把检测距离调到2.5米左右。这样既覆盖整个书桌区域又不至于把隔壁走道的人算进来。2.3 空气质量传感器PM2.5和CO₂要不要加这个问题很看使用场景。如果对流器所在房间是卧室尤其晚上门窗紧闭我强烈建议加CO₂传感器。人闭门睡一晚CO₂浓度能轻松超过2000ppm早上起来头晕脑胀根本不是温度的问题。做好供暖的同时配合新风系统或定时开窗提醒体验提升是跨维度的。我选用的是盛思锐SCD40精度为±(40ppm5%读数)体积小、I²C接口友好长期稳定性比上一代SCD30也更好。实测校准后在900ppm附近的读数相当可信。PM2.5传感器则要看你是否重油烟或靠近马路边我用的是PMS5003数据很准缺点是功耗高、风机会造成轻微噪音所以我把它放在客厅而不是卧室。关于采集频率我的建议是温湿度每1秒读一次平滑后参与PID计算CO₂每10秒读一次PM2.5每30秒读一次。因为CO₂和PM2.5变化很慢高频采样纯属浪费电力和传感器寿命。2.4 传感器安装位置与防干扰经验这是我踩坑最多的地方。第一次我把温度探头直接放在对流器外壳上方结果机器一开探头测到的是热气流经过后的“虚假高温”加热器直接被“骗”得提前停机。后来学聪明了温度探头要放在室内热空气混合比较充分的回流区域比如距地面1.2米到1.5米、远离门窗和热源的墙面上或者在书桌边缘用支架固定。另一个坑是传感器线材过长。DHT22这类单总线传感器导线超过3米就会出现信号毛刺我试过在10米线长下读出来的相对湿度偶尔跳变5%以上。解决办法要么用带屏蔽层的双绞线要么把模拟传感器换成I²C传感器并在末端加一个0.1μF去耦电容。我在把SHT30用2米杜邦线连接到ESP32后读数就再没异常过。3. 控制逻辑与自动策略让设备真的“聪明”起来3.1 恒温控制为什么不能简单“到温就关机”很多普通电暖器的温控策略是温度达到设定值就完全断电降到设定值减1℃再开机。这种开关式控制带来的问题是过冲和频繁启停。电热管有余热、房间有热惯性即便断电室内温度还会继续爬升频繁启停又让继电器寿命缩短而且室内温度波动幅度可以到2℃以上体感忽冷忽热。真正舒适的控制应该让加热功率连续变化温度接近目标时降低功率温度远低于目标时全功率加热。这就得用比例控制或者PID控制。假设你设定目标温度24℃、当前温度为21℃如果只是开关式你会一直全功率加热到24℃但真实到了24℃时内部余热还将推到25℃以上。用比例控制当温度是23.5℃时功率已经降到20%24℃左右时几乎停热过冲就会小很多。我实际测试过同一间12㎡卧室开关式温控波动幅度为±1.2℃比例式控制在±0.4℃以内睡眠体感完全不是一个级别。3.2 PID控制参数整定用实测数据调出稳定曲线PID也就是比例-积分-微分控制是工业上最成熟的闭环控制算法。简单解释比例项针对当前误差做响应误差大功率大积分项消除长期静差防止始终差零点几度微分项抑制温度变化的速度防止震荡。对加热这种大惯性对象PID调好了温控曲线非常漂亮。我在ESP32上运行的逻辑伪代码是float kp 180.0f; // 比例增益单位功率%/温度误差 float ki 0.35f; // 积分增益单位功率%/(℃·s) float kd 45.0f; // 微分增益单位功率%/(℃/s) float target 24.0f; float currentTemp readSHT30(); float err target - currentTemp; integral err * dt; integral constrain(integral, -30.0f, 30.0f); float derivative (err - lastErr) / dt; float output kp * err ki * integral kd * derivative; output constrain(output, 0.0f, 100.0f); lastErr err;整定参数时我推荐先用“临界比例法”把ki和kd都设成0kp从100慢慢往上调直到温度开始出现等幅震荡记录此时增益Kc和震荡周期Tc。然后按经验公式kp0.6Kc、ki1.2Kp/Tc、kdKp·Tc/8初始值计算再根据实际曲线微调。我调出来的第一组参数是kp300、ki0.6、kd80温度能稳定但过头了一点点最终调整为kp180、ki0.35、kd45实测是在目标温度0.3℃范围内波动。这里有一个很重要的“为什么”积分项不能无限积累。如果房间一直开着窗误差始终是5℃积分项会越积越大最终导致功率长时间100%输出这是错误的所以要加限幅。另外PID输出是0到100%的功率需求如何映射到继电器控制见下面3.4。3.3 场景化策略人感、定时、地域天气联动接入人体传感器后就不只是恒温了而是形成一套状态机。我的一个典型状态表场景触发条件执行动作离家模式雷达检测无人门锁反馈锁门目标温度降为16℃进入防冻状态回家前预热手机定位进入2km范围将目标温度提前30分钟升到22℃睡眠模式时间到23:00或卧室雷达检测到人在床上目标温度24℃功率上限限制60%工作模式雷达检测有人在书桌区域目标温度按用户设定湿度保持45%以上全屋联动室外温度低于5℃客厅对流器提前预热防止体感骤冷这种场景化设计的核心价值是节能和舒适度平衡。离家模式让人不在家时不要烧高功率但又保持基础温度防止水管冻裂睡眠模式通过限制功率上限进一步减少气流扰动和温度波动。我还把天气数据接入了自动化如果本地气象预报未来3小时室外温度会骤降5℃以上系统会提前20分钟把目标温度上调1℃。这样即使房间热量开始流失你也感受不到明显的温度塌陷体感上“像一直暖着一样”。3.4 执行机构与功率控制开关型设备怎么输出百分比功率大部分普通对流器只有开和关没法直接从电网获取模拟功率。要把PID输出的0到100%功率需求变成实际加热最常见的有两种方案一是时间比例控制二是可控硅调压。时间比例控制在低成本改造里最实用。我设定一个固定周期比如15秒PID输出60%时继电器导通9秒、断开6秒。因为加热器和房间都有一两分钟以上的热惯性这种15秒级的通断不会让温度产生波动只是让热功率的平均值变化。在ESPHome里可以这样配置climate: - platform: pid name: Bedroom Convector PID sensor: bedroom_temperature default_target_temperature: 23°C heat_output: heater_power kp: 180 ki: 0.35 kd: 45 min_integral: -30 max_integral: 30可控硅调压则更平滑但硬件复杂度翻倍。需要过零检测电路、光耦和双向可控硅而且直接调节220V交流电的导通角对电网有谐波污染不适合普通家庭DIY。我建议除非你非常有电工经验否则时间比例控制是更稳妥的选择效果足够好。4. 硬件选型与组装实现从面包板到能长期运行的设备4.1 主控选型为什么是ESP32而不是Arduino或树莓派主控是整个智能对流器的大脑。我对比过几套方案最终确定为ESP32理由非常具体自带Wi-Fi/蓝牙方便接入Home Assistant有足够多的ADC、I²C、UART接口可以同时挂SHT30、SCD40、LD2410单片价格三四十元坏了就换也不心疼。Arduino Uno虽然也行但需要额外配ESP8266做Wi-Fi接线更多稳定性反而下降。树莓派功能强但完全没必要——跑个PID控制加MQTT通信ESP32绰绰有余而且树莓派要装系统、管理SD卡、关心掉电损坏长期7×24小时运行反而不如单片机方案省心。如果你对安全要求极高也可以考虑带隔离的PLC模块但成本至少几千元普通家庭用不上。4.2 加热执行端继电器、固态继电器、可控硅怎么选执行环节涉及220V高压这是全篇文章里最不能开玩笑的部分。我坚持“功率预留50%以上”的原则。常见对流器功率在1500W到2500W之间如果用普通电磁继电器一定要选额定电流不低于16A、线圈电压5V或24V的品牌货。某宝上几块钱的“蓝色继电器模块”我建议直接放弃触点烧蚀是迟早的事。固态继电器SSR是更好的选择无机械触点、无火花、响应快、噪音小适合时间比例控制。选型时注意25A额定电流的SSR用来带2000W负载配合一个足够大的散热片长期工作温度可以控制在60℃以下。另外SSR有一个特点负载为感性设备时需要加压敏电阻保护但电加热管是纯阻性负载反而省心。可控硅方案前面说了不推荐普通用户上手。我自用的是美国Omega的SSR价格稍高但用了两个冬天完全没有问题。如果预算有限国产品牌中选正品大厂的也扛得住。4.3 完整硬件清单与接线要点我最终落地的那台设备完整清单如下部件型号/规格数量作用主控ESP32 DevKitC1采集数据、跑PID、联网温湿度传感器SHT301室内恒温主信号人体存在雷达LD2410B1检测待人与微动CO₂传感器SCD401空气质量监测固态继电器25A SSR 散热片1控制加热通断电源模块HLK-PM03 220V转3.3V1给ESP32供电外壳铝型材86接线盒1收纳与固定接线时最重要的一条铁律强电和弱电必须完全物理隔离。交流220V走线的区域和3.3V信号线不能在同一条线槽里并排走至少保持5厘米以上距离否则SSR导通瞬间的脉冲会严重干扰传感器读数。我从第一版样机里学到血的教训把温湿度探头线绑在强电线旁边开机后湿度读数跳变成无规律毛刺排查了整整一个下午才发现是电磁干扰。220V侧用1.5平方毫米的铜线火线先接SSR输出端再接对流器加热管零线直接到加热管地线按厂家要求可靠接地。外壳选用金属材质的并且做好接地这样即使内部绝缘破损人碰到外壳也不会发生危险。4.4 固件实现基于ESPHome的完整配置示例ESPHome是我在这类项目里最推荐的开源方案。它的好处是YAML配置完成后自动生成固件里边已经把Wi-Fi重连、看门狗、OTA升级都处理好了不用自己写底层逻辑。整个智能对流器在ESPHome里就是一个climate实体原生支持PID加热还能自动注册到Home Assistant。我的一份可参考配置长这样省略了个人信息和网络密钥esphome: name: bedroom_convector platform: ESP32 board: esp32dev logger: api: ota: sensor: - platform: i2c address: 0x44 name: Bedroom Temperature id: bedroom_temp temperature: id: temp_value name: Bedroom Temperature humidity: id: humid_value name: Bedroom Humidity update_interval: 10s - platform: scd4x id: co2_sensor co2: name: Bedroom CO2 temperature: name: SCD40 Temperature humidity: name: SCD40 Humidity update_interval: 30s binary_sensor: - platform: ld2410 has_target: name: Bedroom Presence update_interval: 2s output: - platform: gpio pin: GPIO16 id: heater_relay climate: - platform: pid name: Bedroom Convector sensor: temp_value default_target_temperature: 23°C heat_output: heater_relay kp: 180 ki: 0.35 kd: 45 min_integral: -30 max_integral: 30这里需要说明的是output: gpio直接驱动SSR时PID会自动用时间比例模式控制GPIO高低电平。ESPHome的PID climate模块会把0到100%的功率需求映射到固定周期的通断默认周期对继电器不太友好我配置了max_power和min_power限制避免输出频繁换向。实际正式运行时我把集成面板里的人工开关设置成最大温度限制功能万一自动化出问题还能手动兜底。4.5 原型制作与长期运行细节从面包板到能长期稳定运行的设备中间有一条巨大的鸿沟。面包板插接的接触电阻在1A电流下还好但220V的继电器开关瞬间电流很大面包板根本扛不住。我的建议是第一版原型测试只用弱电部分把加热器换成40W白炽灯泡来做“虚拟负载”确认PID逻辑正确后再上加热器。长期运行时注意三个细节一是所有强电端子必须用压线端子压紧不能只靠螺丝直接锁裸线否则热胀冷缩后容易松动发热二是外壳要开散热孔SSR工作时发热量不小我用的是金属铝壳并在SSR底部涂了导热硅脂固定在外壳上三是ESP32的电源要做好稳压HLK-PM03这种隔离电源模块输出稳定千万别用劣质手机充电器长时间浮接我实验时一个充电器用了半年就掉电压导致重启。5. 常见问题与排查技巧实录5.1 温度读数跳变和“假高温”问题温度读数跳变刚组装好时最容易出现。如果你发现温度忽高忽低先别怀疑传感器坏了大概率是电源干扰或线材问题。用示波器看I²C引脚会发现一些高频毛刺。解决方案是传感器供电线和数据线分开走或者用带屏蔽的双芯线在传感器电源引脚和地线之间加一个100nF陶瓷电容再在软件层加滑动平均滤波取最近5次读数的平均值。“假高温”就是我前面提到的探头位置问题。探头放在出风口或壳体附近测的是加热器自身温度而不是室温。这类问题从读数曲线能看出来加热器一启动温度立刻跳升加热器一停温度立刻下跌。真正常见的室温曲线是斜率平缓、无突变。解决办法只有一个把温度探头物理移到房间热流循环到的位置软件再多聪明都救不了错误的数据源。5.2 PID控温出现震荡怎么办温度曲线像正弦波一样来回摆动常见原因是比例增益kp调得太大。我这个房间的典型问题是kp调到350目标温度23℃实际温度从22℃到24.5℃之间来回震荡周期大概8分钟。这种情况下系统内部其实是“过冲→关断→温度回落→又全开”的恶性循环。处理方法是减小kp同时启用微分项kd来抑制超调。如果震荡仍然存在再检查执行周期是不是太短SSR通断周期设成10秒比设成3秒会更稳。加一点死区也是一种办法我设了0.3℃的死区也就是误差小于0.3℃时不对输出做调整。这个死区不会影响舒适度但能显著减少继电器动作次数和温度噪声。5.3 频繁启停是哪里出了问题另一种常见问题是设备开几下关几下像“打嗝”一样。这种情况多半不是PID参数问题而是温度传感器的采样速率或者数据滤波导致的错误反馈。比如传感器每10秒才更新一次但在SSR通断的15秒周期内更新时机刚好落在边界PID就会误认为温度突变从而做出激烈反应。排查技巧是把传感器和PID执行数据都画到同一张图表上对比。我来回几次后总结出把SHT30的更新间隔从10s降到2s并在climate配置中把sample_duration设成60s让PID用过去一段时间的均值做计算问题立刻消失。从这个角度说选对数据时间尺度比调参数还有效。5.4 断网后设备“变傻”离线运行的容错设计如果设备依赖Home Assistant的自动化来开关一旦Wi-Fi断掉本地自动化全停对流器就变成“只听PID控制、不响应回家/离家场景的普通数控加热器”。这也正是我在第一章强调“本地闭环”的原因。为了避免断网时尴尬我在ESP32上直接写了兜底逻辑当检测到MQTT断连超过30分钟强制把目标温度切换到18℃节能模式网络恢复后再读取云端策略。此外我在Home Assistant自动化里做了一处细节所有场景触发都不阻塞如果执行失败会在1分钟后重试而不是直接放弃。实际体验下来断网情况虽然偶有发生但供暖行为几乎没有受影响的感知。5.5 常见问题速查表现象可能原因排查与解决温度值乱跳电源干扰、线长、缺滤波加去耦电容、缩短线距、加滑动平均一开机温度立刻升高探头靠近热源移动探头到回流区温度震荡不止PID kp过大减小kp、加死区、检查执行周期加热器频繁启停传感器更新过快/过慢调整update_interval与sample_duration断网后失去场景逻辑依赖云平台自动化主控本地写兜底目标温度读数被SSR开合干扰强电弱电并行走线分离走线、加屏蔽线CO₂数据偏高无变化传感器未校准、密封窗环境在室外新鲜空气下校准420ppm6. 后续扩展从“能用”到“好用”的进化方向6.1 加入电量统计与运行报表对流器是家庭耗电大户不统计电量等于盲人摸象。我在电箱里加了一个PZEM-004T电能计量模块通过TTL串口接到ESP32可以实时读到电压、电流、功率和累计电量。在Home Assistant里把这些数据生成日/周报表能非常直观地看到离家模式到底省了多少电。实测下来加装人体传感器后工作日白天耗电比之前少了一半以上一个冬天节省出来的电费就够买所有传感器了。如果你不想动电箱也可以买带功率统计的智能插座把对流器插上去大部分Wi-Fi插座都能上报实时功率。但要注意大功率加热器多档位开启时峰值电流很高劣质插座触点很容易发热建议选16A规格、带过流保护的大牌产品。6.2 语音控制与多设备联动接入Home Assistant后语音控制基本是白送的。我晚上躺床上会直接说“卧室温度调到23度”系统自动把睡眠模式目标温度改掉同时把客厅对流器降到防冻温度。如果是没接入智能家居的朋友也可以给ESP32刷一个支持小度或天猫精灵的固件但可定制性会打折扣。更实用的多设备联动是“温差联动”我在浴室和卧室各放一个温度传感器当卧室温度高于浴室3度以上时自动开浴室热风机把温差补平。冬天洗澡时再也不会出现“卧室26度、浴室12度”的冰火两重天体验。6.3 用运行时长保护硬件寿命电加热器长期运行最怕的是接头氧化和加热体老化。在ESPHome里统计主控输出端每次导通的累计时长再结合功率曲线判断加热效率下降。如果累计开启时间达到5000小时我会在自动化里发提醒做深度检查。如果是可控硅或SSR方案这个累计用电量数据还能预估SSR散热片是否要清灰。另外因为整个系统是模块化的后续哪部分坏了更换成本很低。我一个朋友按我这套方案组了一台用了两年只换过一块SSR散热片其他部件都还在稳定运行这种可持续性也是DIY设备的魅力所在。如果只让我保留一个改进我肯定会选“人感离家模式”。就这个功能让原本只是“一台比较贵的取暖器”变成真正懂你有没有在家的设备。很多人在一开始做这类项目时总想把功能堆满但实际体验下来把最痛点的三个问题解决——过冲、人走不关、能耗不可控就已经值回全部成本了。