1. 项目概述:当除湿机遇上Arduino Uno
家里的除湿机突然罢工,压缩机不转,风扇没声,只剩个指示灯在闪烁,这场景估计不少人都遇到过。直接找售后?过保的机器维修费可能比买台新的还贵。扔了又觉得可惜,毕竟外壳还完好,核心的压缩机和换热器说不定还是好的。最近一次我遇到这个情况时,冒出一个想法:能不能用手边闲置的Arduino Uno开发板,给它做个“大脑移植手术”,让它重获新生?这个项目,就是一次典型的硬件修复与智能化改造的跨界尝试。
简单来说,这个项目的核心是用Arduino Uno微控制器,替代除湿机原有但已损坏的控制电路板,实现对其压缩机、风扇、湿度传感器等核心部件的精准控制。它解决的不仅仅是“修好”的问题,更是“修得更好、更智能”的需求。你不仅能恢复基础的除湿功能,还能获得原厂机可能都不具备的附加能力,比如通过手机查看湿度曲线、设置自定义的启停周期、甚至接入智能家居平台实现联动。
这个项目非常适合有一定动手能力和电子基础的爱好者、创客,或者是对家电维修感兴趣,不满足于简单替换零件,想深入理解其工作原理并加以改造的朋友。整个过程就像一次精密的“外科手术”,你需要诊断“病情”(故障点),设计“手术方案”(控制逻辑),然后进行“器官移植”(替换控制核心)。最终,你将得到一台独一无二的、由你完全掌控的智能除湿设备。
2. 核心思路与方案设计
2.1 故障诊断与可行性评估
动手之前,最关键的一步是确定旧除湿机是否具备改造价值。盲目拆机可能白忙一场。我的经验是,遵循“先外围,后核心”的原则进行排查。
首先,检查最容易出问题的部分:电源。用万用表测量电源线入口处的电压,确保220V交流电(以国内为例)能正常输入。然后,打开机壳,找到原控制板。通常你会看到一块集成了继电器、电容和一个小型控制芯片的绿色电路板。重点观察是否有肉眼可见的损坏,比如电容鼓包、烧焦的痕迹、电路板铜箔断裂,或者元器件的焊点脱落。很多除湿机的故障根源就是这颗鼓包的电解电容,它负责为控制芯片供电,一旦失效,整个逻辑控制就瘫痪了。
其次,测试核心负载是否完好。这是决定项目可行性的关键。你需要安全地绕过原控制板,直接测试压缩机和风扇。警告:此操作涉及市电,务必断电操作,并由具备安全用电知识的人员进行。通常,压缩机和风扇电机都有独立的引线连接到控制板的继电器输出端。你可以小心地将压缩机的两根线(注意区分,可能有启动电容线)通过一个额外的、额定电流足够的交流接触器或固态继电器,直接连接到电源。瞬间通电测试(最好串接一个保险丝),如果压缩机发出沉闷的启动声并开始振动,风扇也开始转动,那么恭喜你,最贵的部件是好的,改造价值极大。如果压缩机毫无反应或有异常噪音,可能意味着压缩机线圈烧毁或卡缸,修复难度和成本会急剧上升,此时可能需要重新评估。
最后,检查湿度传感器。老式除湿机多用机械式湿度开关(类似温控器),高端一点的会用模块化的电子传感器。找到它,通常是一个带有塑料格栅探头的小部件。对于机械式的,可以通过旋转旋钮听是否有轻微的“咔哒”声来判断;对于电子式的,可以查阅型号尝试查找其输出信号(通常是模拟电压或数字信号)。如果传感器损坏,在Arduino方案中反而是好事,我们可以直接替换为更精确的数字传感器,如DHT22或SHT31。
2.2 系统架构设计与元件选型
确定了核心部件完好后,就需要设计新的控制系统架构。核心思想是:Arduino Uno作为大脑,负责逻辑判断;强电驱动部分通过继电器隔离控制;传感器提供环境感知。
1. 主控单元:Arduino Uno选择它的原因很简单:普及度高、资料丰富、引脚数量对于这个项目绰绰有余。它需要读取湿度传感器数据,根据设定值控制继电器,同时也可以连接显示屏、按键或Wi-Fi模块进行交互。虽然像ESP8266/ESP32这类带无线功能的板子更流行,但对于初次进行强电控制改造的项目,Uno的稳定性和简单的5V逻辑电平让调试更安心。无线功能可以作为第二阶段升级。
2. 湿度传感单元:DHT22为什么不选更便宜的DHT11?因为除湿机的控制精度要求相对较高。DHT11的湿度测量精度为±5%RH,而DHT22能达到±2%RH。在回差控制中(比如设定湿度50%启动,45%停止),2%的精度能带来更平稳的运行体验,避免压缩机频繁启停。DHT22输出数字信号,仅需一个数据引脚,库函数成熟,是性价比之选。
3. 强电驱动单元:继电器模块这是安全的重中之重。绝对不要直接用Arduino的引脚驱动压缩机和风扇!必须使用继电器进行电气隔离。
- 压缩机控制:压缩机功率大(通常几百瓦),启动电流冲击强。必须选用额定电流16A以上、触点类型为AC250V的优质电磁继电器模块(如HK19F、SRD-05VDC-SL-C等型号的加强版)。模块最好自带光耦隔离和续流二极管,以保护Arduino。
- 风扇控制:风扇电机功率较小,但同样需要交流驱动。可以选用一个额定电流10A的继电器模块。有些除湿机风扇有高/低两档,这就需要两个继电器分别控制。
- 重要提示:务必确认继电器模块的控制电压是5V(与Arduino匹配),驱动线圈的电流在Arduino单个引脚输出能力(约20mA)以内,否则需要增加三极管驱动电路。
4. 人机交互单元(可选但推荐)
- 显示:0.96寸或1.3寸的OLED I2C显示屏,功耗低、显示清晰,用于显示当前湿度、设定值、工作状态。
- 设置:旋转编码器或几个轻触按键,用于调整目标湿度、定时等参数。
- 数据记录:添加一个SD卡模块,可以定期记录温湿度数据,便于分析。
5. 电源单元整个系统需要两种电源:为Arduino和传感器供电的5V直流弱电,以及为继电器触点端提供的220V交流强电。严禁从同一电源直接取电!标准做法是:
- 使用一个220V转5V的隔离电源模块(例如常见的手机充电器板芯或专用AC-DC模块),单独为Arduino系统供电。
- 压缩机和风扇的电源,则从墙电引入,通过继电器的常开触点进行通断控制。 这样确保了弱电控制部分与强电负载部分在电气上完全隔离,极大提高了安全性。
3. 硬件连接与安全规范
3.1 电路连接详解与安全要点
硬件连接是项目中最需要耐心和细心的环节,安全规范必须贯穿始终。我的原则是:弱电先行,强电后接;接线牢固,绝缘到位。
第一步:搭建弱电控制核心(断电操作)
- 将Arduino Uno、DHT22传感器、OLED显示屏、按键等通过面包板或焊接在洞洞板上连接好。
- DHT22:VCC接5V,GND接GND,DATA引脚接Arduino的数字引脚(例如D2)。最好在DATA引脚与5V之间连接一个4.7K-10K的上拉电阻,以确保信号稳定。
- OLED (I2C):VCC接5V,GND接GND,SCL接A5,SDA接A4。
- 继电器模块:以控制压缩机的高功率继电器为例。找到其控制端,通常有3个引脚:DC+、DC-、IN。
- DC+ 连接 Arduino的5V。
- DC- 连接 Arduino的GND。务必确保Arduino与继电器模块共地,这是控制信号回路的基础。
- IN 连接 Arduino的一个数字引脚(例如D7)。当该引脚输出HIGH(5V)时,继电器吸合;输出LOW时,断开。
第二步:部署强电负载线路(极端谨慎,断电操作)这是最危险的步骤。你需要准备电工胶布、线号管、压线帽或接线端子。
- 从除湿机的电源进线(火线L和零线N)开始规划。原机的电源线可能直接进入控制板,现在我们需要将其截断或重新安排。
- 压缩机线路:找到原连接压缩机的两根线(通常是粗线)。将其中一根(通常是火线路径)剪断,串接入继电器模块的常开触点(NO和COM端)。具体接法:电源火线L -> 继电器COM端 -> 继电器NO端 -> 压缩机一端。压缩机的另一端直接接电源零线N。这样,只有当继电器吸合时,电流才能流经压缩机。
- 风扇线路:接法与压缩机类似,使用另一个继电器模块控制其火线通路。
- 重要安全规范:
- 所有220V接线点,必须使用接线端子可靠连接,并用电工胶布严密包裹,或者使用绝缘套管。绝对禁止导线简单拧在一起。
- 强电线路与弱电线缆必须物理分开走线,避免平行紧贴,防止干扰和绝缘破损风险。
- 继电器模块的强电端子部分,在通电后是带电的!必须用绝缘外壳(如塑料盒)将整个控制板封装起来,并留有散热孔。
- 在总电源输入端,必须加装一个漏电保护开关,作为最后的安全防线。
第三步:系统集成与绝缘封装将所有部件固定在除湿机内部合适的空间。原控制板的位置通常是绝佳的安装点。使用尼龙柱或绝缘垫片固定Arduino和继电器模块,避免与金属外壳短路。将所有线缆用扎带整理整齐。最后,合上外壳前,再次目视检查所有接线是否牢固,有无裸露的铜线。
3.2 核心控制程序逻辑剖析
硬件是身体,程序是灵魂。除湿机的控制逻辑并不复杂,但需要考虑稳定性和设备保护。核心是一个基于阈值的回差控制算法。
#include <DHT.h> #include <Wire.h> #include <Adafruit_SSD1306.h> // 假设使用SSD1306驱动的OLED #define DHTPIN 2 #define DHTTYPE DHT22 #define COMPRESSOR_PIN 7 #define FAN_PIN 8 DHT dht(DHTPIN, DHTTYPE); Adafruit_SSD1306 display(128, 64, &Wire, -1); float targetHumidity = 50.0; // 目标湿度 float hysteresis = 5.0; // 回差,例如湿度>50%启动,<45%停止 bool compressorState = false; unsigned long lastCompressorOnTime = 0; const unsigned long MIN_OFF_TIME = 300000; // 压缩机最短停机时间5分钟,保护压缩机 void setup() { Serial.begin(9600); pinMode(COMPRESSOR_PIN, OUTPUT); digitalWrite(COMPRESSOR_PIN, LOW); // 确保启动时继电器断开 pinMode(FAN_PIN, OUTPUT); dht.begin(); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay(); } void loop() { float currentHumidity = dht.readHumidity(); float currentTemp = dht.readTemperature(); if (isnan(currentHumidity) || isnan(currentTemp)) { Serial.println("读取传感器失败!"); return; } unsigned long now = millis(); // 控制逻辑核心 if (!compressorState) { // 当前压缩机停止状态 // 条件1:当前湿度高于目标值 // 条件2:距离上次关机已超过最短停机时间(防止频繁启动损坏压缩机) if (currentHumidity > targetHumidity && (now - lastCompressorOnTime > MIN_OFF_TIME)) { compressorState = true; digitalWrite(COMPRESSOR_PIN, HIGH); digitalWrite(FAN_PIN, HIGH); // 启动压缩机时同时启动风扇 lastCompressorOnTime = now; } } else { // 当前压缩机运行状态 // 当湿度低于(目标值 - 回差)时停止 if (currentHumidity < (targetHumidity - hysteresis)) { compressorState = false; digitalWrite(COMPRESSOR_PIN, LOW); // 风扇可以在压缩机停止后继续运行一段时间,吹干换热器,这里简单设为同时停止 digitalWrite(FAN_PIN, LOW); } } // 显示信息 display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0); display.print("Humidity: "); display.print(currentHumidity); display.print("%"); display.setCursor(0, 16); display.print("Target: "); display.print(targetHumidity); display.print("%"); display.setCursor(0, 32); display.print("Temp: "); display.print(currentTemp); display.print("C"); display.setCursor(0, 48); display.print("Compressor: "); display.print(compressorState ? "ON" : "OFF"); display.display(); delay(2000); // 每2秒读取一次,避免传感器过热和频繁响应 }程序逻辑关键点解析:
- 回差控制 (Hysteresis Control):这是避免压缩机在临界点附近频繁启停的关键。例如设定目标50%,回差5%。系统会在湿度>50%时启动,运行到湿度<45%时停止。如果没有回差,湿度在49%-51%波动时,压缩机可能会每分钟启停数次,极易损坏。
- 压缩机保护延时:
MIN_OFF_TIME变量(例如5分钟)强制规定压缩机停止后必须等待一段时间才能再次启动。这是因为制冷系统需要时间使高低压平衡,立即重启可能导致压缩机负载过大甚至“液击”而损坏。这是原厂控制器都会有的保护功能,我们的程序也必须实现。 - 风扇联动:示例中风扇与压缩机同步启停。更优的方案是,压缩机停止后,让风扇继续运行30-60秒,以吹干蒸发器上的冷凝水,防止滋生霉菌。
4. 调试、优化与功能扩展
4.1 上电调试与问题排查
硬件和软件都准备好后,进入最紧张的调试阶段。请遵循“分级上电,逐步测试”的原则。
第一步:弱电系统单独上电
- 只给Arduino的USB口供电(或通过5V隔离电源供电),此时不要连接任何220V强电。
- 打开串口监视器,检查DHT22传感器数据是否正常读取,温湿度值是否合理。
- 检查OLED显示屏是否正常显示信息。
- 手动修改程序中的
targetHumidity值,模拟湿度变化,观察继电器模块上的指示灯是否按逻辑亮灭(此时继电器触点未接强电,是安全的)。同时可以听到继电器吸合/断开清晰的“咔哒”声。
第二步:模拟负载测试(安全测试)
- 断开除湿机的电源插头。
- 将继电器模块控制的压缩机、风扇输出端,暂时不接真正的压缩机和风扇,而是分别接上一个220V的灯泡(如40W白炽灯)作为假负载。
- 接通220V总电源。此时,如果控制逻辑正确,灯泡应该能随着湿度条件(或你手动修改的程序逻辑)亮起和熄灭。
- 这个步骤至关重要,它能在完全安全(灯泡不会损坏)的情况下,验证你的强电接线和控制逻辑百分百正确。观察灯泡工作是否稳定,有无闪烁、继电器声音是否异常。
第三步:带真实负载试运行
- 确认模拟测试完全正常后,断电,将灯泡替换回真正的压缩机和风扇。
- 再次通电。首次启动时,人不要离开,仔细听压缩机启动声音是否顺畅平稳,风扇转动是否正常,有无异常噪音或气味。
- 运行一段时间,观察除湿效果。可以在出风口用手感觉是否有冷风/热风排出,以及冷凝水是否正常产生。
常见问题速查表:
| 现象 | 可能原因 | 排查步骤 |
|---|---|---|
| 继电器指示灯亮但压缩机不转 | 1. 继电器触点损坏或电流不匹配 2. 压缩机线路接线错误或松动 3. 压缩机自身故障(已排除) | 1. 用万用表通断档测继电器触点吸合时是否导通 2. 检查压缩机接线端子是否紧固 3. 复查电源是否送到压缩机端子 |
| 压缩机频繁启停(几分钟一次) | 1. 回差设置过小 2. 传感器读数不准或波动大 3. 压缩机最短停机时间设置太短 | 1. 增大程序中的hysteresis值,如从3%调到5%2. 检查DHT22安装位置是否通风且远离出风口,尝试更换传感器 3. 增加 MIN_OFF_TIME至10分钟 |
| OLED显示屏不亮或乱码 | 1. I2C地址错误 2. 接线松动 3. 库文件不兼容 | 1. 使用I2C扫描程序确认OLED地址 2. 检查SCL/SDA接线 3. 尝试更新或更换显示库 |
| DHT22读数为NaN | 1. 接线错误 2. 传感器损坏 3. 缺少上拉电阻 | 1. 检查VCC, GND, DATA线序 2. 更换传感器测试 3. 在DATA引脚和5V间添加4.7K上拉电阻 |
4.2 高级功能扩展思路
基础功能稳定后,你可以考虑添加更多智能化功能,让这台“复活”的除湿机变得更强大。
1. 增加Wi-Fi远程控制与监控这是最实用的升级。将Arduino Uno替换为NodeMCU (ESP8266)或ESP32开发板。它们兼容Arduino IDE,且自带Wi-Fi功能。
- 你可以编写程序让设备连接家庭Wi-Fi,并创建一个简单的Web服务器。这样在手机浏览器输入设备的IP地址,就能看到实时温湿度、控制开关、修改目标值。
- 更进一步,可以集成MQTT协议,将数据发布到本地或云端的MQTT服务器(如Home Assistant, EMQX),实现与智能家居系统的全面联动。例如,当室内湿度超过60%时自动启动除湿机,同时小爱同学语音提醒。
2. 实现冷凝水满水自动关机原装除湿机都有水箱满水检测功能。我们可以用一个浮球开关或光电液位传感器来模拟。
- 将传感器安装在水箱上限位置,信号线接入Arduino的数字输入引脚。
- 在控制逻辑中增加判断:当检测到水箱满(引脚为HIGH)时,无论当前湿度如何,立即关闭压缩机和风扇,并在OLED上显示“水箱已满”警报,直到水箱被清空复位。
3. 添加定时与模式功能在程序中加入RTC(实时时钟)模块,如DS3231,可以实现定时开关机。你还可以设计不同的工作模式:
- 连续模式:无视湿度,持续运行(用于快速除湿)。
- 干衣模式:压缩机与风扇持续高速运行,并适当提高停止湿度阈值。
- 睡眠模式:在夜间,提高目标湿度(如55%),并关闭所有指示灯和蜂鸣器,仅以最低风速运行。
4. 数据记录与分析添加一个微型SD卡模块,让除湿机每隔一段时间(如10分钟)将时间、温湿度、工作状态记录到CSV文件中。定期取出SD卡,用电脑导入数据,你可以分析房间的湿度变化规律,从而优化除湿机的启停参数,甚至评估房屋的防潮性能。
5. 安全规范与维护建议
5.1 必须遵守的安全准则
这个项目涉及220V市电,安全永远是第一位的,任何疏忽都可能造成严重事故。以下是我从多次项目中总结出的铁律:
警告:强电危险!如果你对交流电布线不熟悉、缺乏必要的电工工具(如验电笔、万用表)和安全知识,请务必寻求专业人士的帮助,或者仅进行到弱电控制部分,强电部分交由电工完成。
- 断电操作:任何涉及接线、改线、调整内部元件的行为,必须拔掉设备电源插头。不要相信开关,要直接断开物理连接。
- 一人操作,一人监护:在进行最终上电测试时,最好有他人在场,并知晓总电源开关位置,以防万一。
- 绝缘与隔离:所有220V接线点必须使用接线端子或焊接后套热缩管,再用电工胶布包裹。整个控制板必须安装在绝缘外壳内。强电与弱电线缆分开捆扎,避免交叉。
- 接地检查:确保除湿机的金属外壳有良好的接地线连接。这是防止漏电触电的最后屏障。
- 功率匹配:确保选用的继电器、导线、电源插座的额定电流和功率都大于压缩机和风扇的最大工作电流。压缩机的启动电流通常是额定电流的3-5倍,继电器触点容量必须留足余量(建议2倍以上)。
- 防火措施:设备工作时,尤其是首次长时间运行,不要放置在易燃物附近,人不要长时间远离。可以在附近准备一个小型灭火器。
5.2 长期运行维护与优化
改造完成的除湿机,其长期稳定运行依赖于良好的维护。
定期清洁:这是影响效率和寿命的关键。每两周检查并清洗一次进风口和出风口的滤网。每季度(尤其在潮湿季节结束后)打开外壳,用软毛刷和吸尘器清理蒸发器(冷端)和冷凝器(热端)翅片上的灰尘。灰尘会严重影响热交换效率,导致除湿效果下降,压缩机负荷加重。
检查冷凝水排水:如果你使用了水泵或排水管进行连续排水,定期检查管路是否畅通,水泵是否正常工作。
监听异常声响:正常运行时有规律的风声和压缩机嗡嗡声。如果出现尖锐的金属摩擦声、剧烈的振动声或规律的“咔哒”声(非继电器声音),应立即断电检查。可能是风扇叶片碰壳、压缩机固定螺栓松动或继电器触点打火。
软件维护:定期(如每年)检查一下Arduino程序的运行情况。可以考虑为程序增加一个“看门狗”功能,防止程序跑飞导致设备常开或常关。如果使用了SD卡记录,记得定期备份和清空数据,防止卡满。
季节性存放:在干燥季节长期不用时,应清空水箱,运行“送风模式”(如果实现了该功能)数小时以吹干内部,然后拔掉电源,清洁后套上防尘罩存放。
完成这样一个项目,收获的不仅仅是一台重新运转的除湿机,更是一次对家电工作原理的深度理解,以及将创意付诸实践的成就感。它教会你系统性地思考问题——从故障诊断、方案设计、安全施工到软件调试。当你听到压缩机在你自己编写的程序控制下平稳启动,湿度曲线按照你的设定完美下滑时,那种满足感是无可替代的。最重要的是,这个过程让你明白,许多看似复杂的电子产品,其核心控制逻辑往往可以化繁为简,用我们触手可及的工具去理解和重塑。