1. 项目背景与核心需求
潮湿的北方冬季和干燥的空调房里,一台靠谱的加湿器简直是救命神器。但市面上大多数加湿器要么傻大粗只会机械开关,要么价格虚高功能过剩。这次我决定用单片机自己撸一个智能加湿器,核心目标就三点:湿度精准控制、手机远程操控、成本控制在百元内。
这个项目的技术本质,是通过传感器采集环境数据,经由单片机处理后控制执行机构。听起来简单?但真动手时会遇到传感器精度漂移、PWM调压不稳定、手机端通信延迟等一系列坑。我前后迭代了三个版本,烧坏了两块开发板,最终成品能稳定将湿度控制在±3%误差范围内,手机端操作响应时间不超过1.5秒。
2. 硬件架构设计
2.1 核心器件选型
主控芯片选了ESP32-C3,这货自带Wi-Fi/蓝牙双模,价格才12块钱,比传统STM32+ESP8266组合便宜一半。实测发现其ADC精度确实一般,但通过软件校准完全够用。
湿度传感器对比了DHT22和SHT30:
- DHT22便宜但响应慢(2秒/次)
- SHT30贵三倍但精度±2%RH
最终选择SHT30,因为加湿器需要快速反馈,实测发现DHT22的延迟会导致湿度震荡。
雾化片驱动是个大坑!普通MOS管(如IRF540)驱动24V雾化片容易烧管,改用成品雾化片驱动模块(带过流保护)才稳定。这里血泪教训:别省这8块钱。
2.2 电路设计要点
电源部分采用三级设计:
- 220V转24V开关电源(驱动雾化片)
- 24V转5V DC-DC(给开发板供电)
- 5V转3.3V LDO(供传感器)
特别提醒:雾化片工作时会产生高频震荡,一定要在电源输入端加π型滤波(100μF电解电容+0.1μF陶瓷电容),否则单片机容易死机。我在第二版就栽在这,半夜加湿器突然发疯似的一直喷雾...
3. 软件实现细节
3.1 湿度控制算法
采用增量式PID控制,比位置式更适合实时系统。核心参数经过Ziegler-Nichols整定法调试:
c复制// PID参数
float Kp = 2.8;
float Ki = 0.05;
float Kd = 1.2;
// 控制周期1秒
void pid_control() {
error = target_humidity - current_humidity;
integral += error;
derivative = error - last_error;
output = Kp*error + Ki*integral + Kd*derivative;
output = constrain(output, 0, 100); // 限制在0-100%
analogWrite(FAN_PIN, output);
}
实测发现两个优化点:
- 加入死区控制:当误差<±3%时停止调节,避免频繁启停
- 积分分离:误差>10%时才启用积分项,防止初始阶段积分饱和
3.2 手机端通信方案
没有用常规的MQTT协议,而是直接基于ESP32的HTTP Server实现RESTful接口。优点是不依赖第三方服务器,手机连本地Wi-Fi就能控制。关键API设计:
code复制GET /status -> 返回当前温湿度
POST /config -> 设置目标湿度
GET /log -> 获取历史数据
前端用5行代码搞定:
html复制<input type="range" id="humidity" min="30" max="80">
<button onclick="fetch('/config?target='+humidity.value)">设置</button>
4. 装配与调试实录
4.1 结构设计避坑指南
用3D打印外壳时务必注意:
- 雾化片上方留至少15cm空间,否则水雾会凝结回落
- 进气口开在底部并加海绵过滤,我的第一版就因为灰尘堵住传感器导致读数异常
- 水箱一定要有防干烧设计!我在测试时烧坏过一个雾化片
4.2 校准流程
传感器出厂有误差,必须做两点校准:
- 干燥环境校准:将传感器和标准湿度计放入密封袋,加入硅胶干燥剂,记录两者差值
- 高湿环境校准:改用饱和盐水溶液(约75%RH)
校准数据存入EEPROM,上电自动加载。这里有个骚操作:长按按键5秒进入校准模式,此时LED快闪提示状态。
5. 成品效果与优化空间
最终实现功能:
- 湿度控制精度±3%RH
- 手机端实时监控
- 缺水自动断电
- 耗电量实测约15W
待改进点:
- 目前只能连本地Wi-Fi,下一步打算配网功能
- 雾化片寿命约3000小时,考虑改用超声波方案
- 历史数据存储仅支持24小时,可外接SD卡扩展
这个项目最让我惊喜的是ESP32-C3的表现——作为一款RISC-V芯片,其功耗比ESP8266低40%,而性能足够流畅运行LVGL图形界面。后续准备给它加个触摸屏,毕竟谁不喜欢看着湿度曲线慢慢变化呢?