ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

基于ESP32的DIY智能温控器:热泵空调远程监控与换向阀控制实战

基于ESP32的DIY智能温控器:热泵空调远程监控与换向阀控制实战 1. 项目缘起与整体设计思路热泵空调在北美和部分寒冷地区的家庭里普及率越来越高它跟传统燃气炉最大的区别在于换向阀决定了它到底是在制冷还是在制热。普通单冷空调的温控器只需要控制压缩机、风机和辅助加热而热泵系统多了一个换向阀一旦接线或逻辑搞错夏天吹热风、冬天吹冷风都是轻的严重时还会把压缩机干报废。我手上这套系统是给一栋两层小楼做的室内机是典型的24VAC控制接口室外机是热泵机组带辅助电加热。原装温控器功能太死板不能远程看状态也不能根据室外温度自动切换辅助加热的启用阈值所以决定自己搭一套。这个项目的核心目标很明确用一块带WiFi的微控制器接管24VAC温控信号实现本地自动控制加远程监控。说人话就是温控器该干的活它全干同时把数据传到手机或电脑上让我随时知道屋里几度、机组在干嘛、有没有异常。适合谁来参考有一定电子基础、会焊接、能看懂继电器接线图、愿意折腾的DIY玩家。如果你连万用表都没摸过建议先找个报废的温控器拆开看看里面长什么样再决定要不要动手。整体方案我选的是ESP32作为主控原因有三第一它自带WiFi和蓝牙省掉外挂模块的麻烦第二GPIO数量够用价格便宜烧了不心疼第三Arduino和ESP-IDF两套开发环境都成熟社区资料多。24VAC这边不能直接进ESP32必须做隔离和电平转换。我的做法是用光耦做信号隔离用继电器做输出控制24VAC经过整流桥和稳压后给继电器线圈供电同时分出一路经过电阻分压和光耦给ESP32读状态。这样强电和弱电彻底分开就算24VAC那边短路也不会把ESP32带走。注意24VAC虽然电压不高但它是交流而且来自变压器短路电流可能很大。操作前务必断开空气开关用万用表确认无电后再动手。为什么不用现成的智能温控器改我试过市面上的WiFi温控器大多封闭了协议云端接口不开放想根据室外温度做自定义逻辑几乎不可能。自己搭虽然费时间但每一行代码、每一根线都清楚出了问题能查。这个项目前后折腾了大概三周中间烧过一块ESP32接线时24VAC碰到了GPIO也遇到过继电器吸合导致WiFi断流的问题后面会详细说。2. 核心硬件选型与电路细节解析2.1 主控与WiFi模块的取舍ESP32我选的是ESP32-WROOM-32模组不是开发板。开发板体积大而且自带USB转串口芯片放在温控器盒子里太占地方。模组直接焊在自制PCB上用排针引出烧录口调试时接USB转TTL调完拔掉。这里有个细节ESP32的WiFi和蓝牙共用射频前端同时开WiFi和蓝牙会导致功耗上升和轻微发热但在这个项目里蓝牙只用来做初始配网配完就关所以影响不大。如果你打算用蓝牙做长期传感器接入建议选双核版本并做好散热。关于WiFi连接稳定性我踩过一个坑早期用网页版测速工具跑压力测试发现每隔几分钟就断流一次。排查后发现是继电器吸合瞬间的电流冲击导致电源纹波变大ESP32的WiFi射频对电源噪声很敏感。解决办法是在ESP32的3.3V供电脚旁边并一个470uF电解电容和一个0.1uF陶瓷电容同时把继电器线圈的续流二极管换成肖特基管响应更快。改完之后连续跑72小时没再断过。2.2 24VAC信号采集与隔离24VAC来自空调变压器常见的是24VAC/40VA也就是大约1.67A的容量。这个容量要同时供继电器线圈、光耦和稳压电路使用所以得算一下总功耗。我用的继电器是松乐SRD-05VDC-SL-C线圈功耗约0.36W五个继电器全开就是1.8W。光耦用PC817每路约0.05W六路加起来0.3W。稳压部分用LM2596降压模块效率约80%总输入功率大约2.6W折算到24VAC侧电流约0.11A远小于1.67A余量充足。信号采集这边24VAC不能直接接光耦输入端因为光耦LED是直流器件交流会让它每秒亮灭50次ESP32读到的就是一堆抖动。我的做法是先用整流桥把24VAC变成脉动直流再经过RC滤波变成平滑直流然后通过限流电阻接光耦。限流电阻的计算光耦LED正向压降约1.2V目标电流5mA整流后电压约33V24VAC峰值所以电阻取(33-1.2)/0.005≈6.3kΩ实际用6.8kΩ电流约4.7mA光耦能可靠导通。光耦输出侧接ESP32的GPIO配置为上拉输入光耦导通时把GPIO拉低。提示整流桥后面一定要加滤波电容否则光耦输出会有50Hz纹波ESP32读到的状态会跳。我用的电容是100uF/50V实测纹波从3V降到0.2V以下。2.3 继电器输出与换向阀控制热泵系统的输出通道一般包括压缩机Y1、换向阀O/B、室内风机G、辅助加热W1/W2、24VAC公共端C。我的板子上放了五个继电器分别对应这五路。换向阀有个特殊之处不同品牌的热泵换向阀在制热时是通电还是断电定义不一样。有的品牌是O端制热通电有的是B端制热通电。我在代码里做了一个配置项可以切换O/B逻辑这样换温控器时不用改硬件。继电器输出侧接24VAC负载公共端接变压器的C端。这里要注意继电器触点容量压缩机接触器线圈的浪涌电流可能达到稳态的3-5倍所以继电器触点额定电流至少选5A以上。我用的SRD-05VDC-SL-C触点是10A/250VAC带压缩机接触器绰绰有余。如果你直接驱动压缩机不推荐那得用接触器继电器只做信号级控制。2.4 电源设计与功耗核算整个系统的电源来自24VAC变压器。24VAC经过整流桥后得到约33V直流然后分两路一路直接给继电器线圈供电继电器是5V的所以中间要加LM2596降到5V另一路再经过AMS1117降到3.3V给ESP32和光耦输出侧供电。这里有个顺序问题如果5V和3.3V同时上电ESP32可能会在继电器吸合的瞬间被拉低电压导致复位。我的解决办法是在3.3V稳压前面加一个肖特基二极管和100uF电容形成一个短暂的储能继电器吸合时电容放电维持3.3V稳定。功耗方面ESP32在WiFi连接状态下平均电流约80mA峰值可能到200mA。光耦输出侧每路约2mA六路12mA。3.3V总电流约100mA加上5V继电器线圈电流每个约70mA五个全开350mA总功耗约5V×0.35A3.3V×0.1A2.08W。24VAC侧输入功率约2.6W变压器容量40VA余量很大。实测连续运行一周LM2596和AMS1117的温度都在50度以下不需要额外散热片。3. 固件架构与核心逻辑实现3.1 开发环境搭建与基础配置固件我用的是Arduino框架不是ESP-IDF。原因很简单Arduino的WiFi库和WebServer库封装得好几行代码就能跑起来适合快速验证。如果你追求极致性能或者要用蓝牙Mesh那ESP-IDF更合适。开发环境是VS Code加PlatformIO插件比Arduino IDE好用库管理方便还能直接看串口输出。基础配置里最关键的是WiFi连接策略。我设了三个模式STA模式连家里路由器、AP模式自己当热点用于初始配置、STAAP共存调试时用。正常运行时用STA模式如果连不上路由器自动切换到AP模式手机连上后打开配置页面输入WiFi密码。这里有个细节ESP32的WiFi库在STA模式下如果路由器重启它会自动重连但重连期间WebServer会阻塞。我的做法是把WebServer放在单独的任务里用FreeRTOS的双核特性一个核跑WiFi和Web另一个核跑温控逻辑互不干扰。// WiFi连接状态机核心代码 enum WiFiState { WIFI_STA_CONNECTING, WIFI_STA_CONNECTED, WIFI_AP_MODE }; WiFiState wifiState WIFI_STA_CONNECTING; void wifiTask(void *parameter) { while(1) { switch(wifiState) { case WIFI_STA_CONNECTING: if(WiFi.status() WL_CONNECTED) { wifiState WIFI_STA_CONNECTED; } else if(millis() - lastAttempt 30000) { WiFi.begin(ssid, password); lastAttempt millis(); } break; case WIFI_STA_CONNECTED: if(WiFi.status() ! WL_CONNECTED) { wifiState WIFI_STA_CONNECTING; } break; case WIFI_AP_MODE: // AP模式处理 break; } vTaskDelay(1000 / portTICK_PERIOD_MS); } }3.2 温度采集与滤波算法温度传感器我用的是DS18B20防水封装分别放在回风口、送风口和室外。DS18B20是单总线协议一根线能挂多个传感器每个有唯一64位地址。读取时要注意转换时间12位精度下需要750ms如果连续读会读到旧值。我的做法是启动转换后等800ms再读读到的值做滑动平均滤波窗口大小10去掉最大最小值后取平均。这样能滤掉开关风机时的瞬时波动。回风口温度用来判断室温送风口温度用来判断机组是否在有效工作。如果压缩机启动后送风口温度在3分钟内没有明显变化制热时上升制冷时下降就判定为异常触发报警。这个逻辑帮我抓到过一次冷媒泄漏压缩机在转但送风口温度一直不升后来发现是冷媒漏了。实操心得DS18B20的供电方式有两种寄生电源和外部电源。寄生电源省线但转换期间总线必须强上拉否则读数会漂。我建议直接用三线制外部供电稳定得多。3.3 热泵控制状态机热泵的控制逻辑比单冷空调复杂核心是换向阀和压缩机的时序。换向阀切换时压缩机必须停机否则高压侧和低压侧压力没平衡换向阀可能卡死。我的状态机里换向阀切换前先关压缩机等30秒后再切换换向阀再等10秒后启动压缩机。这个延时参数来自热泵厂家的维修手册不同品牌可能不同建议查一下自己机组的资料。状态机的主要状态包括待机、制热、制冷、除霜、辅助加热、故障。除霜逻辑是热泵特有的制热时室外机结霜效率下降需要短暂切换到制冷模式把室外机加热化霜。我的做法是监测室外温度和制热运行时间当室外温度低于5度且连续制热超过40分钟就进入除霜除霜时换向阀切换到制冷压缩机继续运行室内风机停转防止吹冷风。除霜时间最长10分钟或者室外温度回升到10度以上就退出。辅助加热的启用条件我设了三层室外温度低于0度、制热运行超过15分钟室温仍低于设定值2度、或者除霜期间。辅助加热功率大不能频繁启停所以加了最小运行时间和最小停机时间各5分钟。3.4 远程监控与数据上报远程监控我用的是MQTT协议推送到本地服务器上的Mosquitto。为什么不用HTTP轮询因为轮询费电而且实时性差。MQTT是长连接有变化才推送ESP32的功耗也低。上报的数据包括室温、送风温度、室外温度、当前模式、压缩机状态、辅助加热状态、故障码。上报频率是每30秒一次有状态变化时立即上报。手机端我用的是Home Assistant通过MQTT自动发现功能ESP32发布配置主题后HA会自动创建实体不用手动写YAML。这个功能省了我很多时间。如果你不想用HA也可以用Node-RED搭一个简单的仪表盘或者直接用MQTT客户端看原始数据。// MQTT上报核心代码 void publishState() { StaticJsonDocument256 doc; doc[room_temp] roomTemp; doc[supply_temp] supplyTemp; doc[outdoor_temp] outdoorTemp; doc[mode] currentMode; doc[compressor] compressorOn; doc[aux_heat] auxHeatOn; doc[fault] faultCode; char buffer[256]; serializeJson(doc, buffer); mqttClient.publish(hvac/thermostat/state, buffer); }4. 实操过程与关键环节记录4.1 PCB设计与焊接注意事项PCB我用的是KiCad画的两层板尺寸10cm×8cm刚好放进一个标准温控器底盒。布局上把强电区和弱电区分开继电器和整流桥放在板子一侧ESP32和光耦放在另一侧中间用地线隔离。走线时24VAC的走线宽度至少1mm因为电流虽然不大但瞬态可能高。继电器输出侧的走线也要加粗并且尽量短减少干扰。焊接顺序很重要先焊矮的元件再焊高的。我先焊电阻、光耦、二极管再焊继电器、整流桥最后焊ESP32模组和排针。ESP32模组焊接时要注意天线区域不能铺铜否则WiFi信号会被屏蔽。我在PCB上把天线下方挖空实测信号强度比铺铜时好了10dBm。注意焊接ESP32模组时烙铁温度不要超过350度每个引脚焊接时间不超过3秒否则可能损坏模组。我第一块板子就是焊太久模组直接不启动了。4.2 接线与系统联调接线前先用万用表确认每根线的功能。标准24VAC温控线色一般是红R24VAC火线、蓝C公共端、黄Y压缩机、绿G风机、白W辅助加热、橙O/B换向阀。但不同品牌可能不同一定要看机组接线图。我把每根线都贴了标签接错一次换向阀制热变制冷还好及时发现没造成损坏。联调分三步先测电源、再测信号、最后测输出。电源测整流桥输出是否33V左右LM2596输出是否5VAMS1117输出是否3.3V。信号测每路光耦输出手动给24VAC信号看ESP32的GPIO是否翻转。输出测继电器吸合时用万用表通断档测触点是否导通。三步都过了再接负载。实测中发现一个问题继电器吸合时光耦输入侧的电压会瞬间跌落导致ESP32误读状态。原因是24VAC变压器容量虽然够但线路阻抗导致瞬态压降。解决办法是在光耦输入侧并一个100uF电容储能维持电压。改完之后误读消失。4.3 外壳安装与散热处理外壳我用的是3D打印的ABS盒子尺寸比PCB大一圈留出接线空间。盒子上开了散热孔因为LM2596和继电器会发热。安装位置选在室内机回风口附近那里温度稳定而且有现成的24VAC线。固定时用尼龙柱不要用金属柱防止短路。散热方面实测夏天室温35度时盒内温度约45度LM2596表面温度约55度在可接受范围内。如果你家环境温度更高建议在盒子上加一个小风扇或者把LM2596换成同步整流的DC-DC模块效率更高发热更小。4.4 参数配置与阈值调整所有阈值都放在config.h里方便修改。主要参数包括温度设定值、回差、辅助加热启用室外温度、除霜间隔、除霜时长、压缩机最小停机时间。回差我设的是0.5度太小会导致压缩机频繁启停太大室温波动明显。辅助加热启用室外温度我设的是0度因为我的热泵在0度以下效率下降明显与其让它硬扛不如早点开辅助加热。这些参数没有标准答案得根据自己家的保温情况、热泵型号、当地气候来调。我的建议是先按保守值跑一周看数据再调。比如除霜间隔如果发现室外机结霜严重但还没到除霜时间就把间隔缩短。如果除霜太频繁导致室温波动就延长间隔。5. 常见问题与排查技巧实录5.1 WiFi连接不稳定排查WiFi断流是这个项目最常见的问题。我遇到过三种情况一是电源纹波导致射频不稳定解决办法是加电容和换肖特基二极管二是路由器信号弱解决办法是把ESP32天线朝向路由器或者加一个外置天线三是MQTT服务器断连解决办法是加心跳包和自动重连。排查时先用串口看WiFi状态如果频繁掉线先查电源再查信号强度。现象可能原因排查方法解决措施WiFi频繁掉线电源纹波大示波器看3.3V纹波加470uF电容信号强度低天线被遮挡看RSSI值调整天线方向MQTT断连服务器重启看串口日志加自动重连网页打不开WebServer阻塞看任务优先级分离到独立任务5.2 温度读数异常处理DS18B20读数异常一般是接线问题或转换时间不够。如果读到85度那是默认值说明转换没完成。如果读到-127度那是断线。如果读数跳动那是滤波不够。我的做法是每次读之前先检查CRCCRC错了就重读连续错三次才报警。另外DS18B20的线不要和24VAC线捆在一起交流干扰会导致读数漂移。5.3 继电器误动作与干扰抑制继电器误动作我遇到过两次一次是光耦输入侧干扰24VAC线靠近了信号线导致光耦误导通一次是ESP32复位继电器全部释放。解决办法信号线用屏蔽线屏蔽层接地ESP32的复位脚加10k上拉和0.1uF电容防止干扰复位。另外继电器线圈的续流二极管一定要加否则断电瞬间的反向电动势会干扰整个电路。实操心得如果你发现继电器偶尔自己吸合先查光耦输入侧有没有干扰再查ESP32有没有复位。用串口打印复位原因如果是Brownout那就是电源问题。5.4 换向阀逻辑错误的修正换向阀逻辑错误的表现是制热时吹冷风制冷时吹热风。原因是O/B定义搞反了。我的代码里有一个配置项REVERSING_VALVE_TYPE可以设成O或B。如果你不确定自己机组是哪种可以试制热模式下如果换向阀通电是制热那就是O型如果断电是制热那就是B型。试的时候注意听换向阀有没有咔嗒声有声音说明在切换。5.5 辅助加热频繁启停的优化辅助加热频繁启停会缩短接触器寿命也会导致室温波动。我的优化是加最小运行时间和最小停机时间各5分钟。另外辅助加热启用条件里加了延时确认室外温度低于阈值后等5分钟再启用防止温度短暂波动导致误触发。实测下来辅助加热每天启停次数从20多次降到5次以内。6. 后续扩展与个人经验分享这套系统跑了大半年整体稳定。后续我打算加两个功能一是室外温度预测通过天气预报API提前判断是否需要预加热二是能耗统计通过继电器吸合时间估算压缩机运行时长折算成电费。这两个功能都不难主要是数据积累和逻辑调优。最后分享一个我踩过的坑不要用USB供电调试24VAC部分。我一开始图方便ESP32用USB供电24VAC部分用变压器供电结果USB的地和24VAC的地没共地光耦读数全是乱的。后来把USB的5V和变压器的5V共地问题才解决。所以调试时要么全用USB供电24VAC不接要么全用变压器供电不要混用。另外如果你家热泵是变频压缩机那这套继电器控制方案就不适用了变频机需要通信协议控制一般是RS485或者厂家私有协议。买之前先确认自己机组的控制类型定频机才能用继电器方案。这个项目适合定频热泵变频机请绕道。
返回列表