1. 项目背景与核心功能
最近在整理换季衣物时,发现羊毛衫居然发霉了。检查衣柜才发现,梅雨季节的潮湿环境让柜内湿度长期超过70%。这个意外让我意识到传统衣柜在环境监测方面的不足,于是决定用STM32开发一套能自动调节温湿度的智能衣柜系统。
这套系统主要解决三个痛点:
- 实时监测柜内温湿度,防止衣物霉变
- 检测潜在火灾风险,避免贵重衣物损失
- 远程查看衣柜状态,出差时也能掌握家中情况
核心功能模块包括:
- 环境监测:DHT22传感器采集温湿度数据
- 安全防护:MQ-2烟雾传感器检测可燃气体
- 智能调控:继电器控制除湿机和加热片
- 远程交互:ESP8266实现Wi-Fi联网
- 本地显示:OLED屏幕展示实时数据
2. 硬件系统设计
2.1 主控芯片选型
对比STM32F103C8T6和STM32F407VET6后,最终选择"蓝色药丸"(STM32F103C8T6开发板)。虽然F407性能更强,但考虑到:
- 衣柜系统不需要复杂运算
- F103的72MHz主频足够处理传感器数据
- 价格便宜近40%(F103约25元,F407约65元)
- 更低的功耗(运行模式约36mA)
提示:购买时注意区分正版(ST-Link调试)和山寨版(CH340串口),建议选择正版便于后期调试。
2.2 传感器模块配置
温湿度检测方案
测试了三种传感器后选定DHT22:
| 传感器 | 精度 | 响应时间 | 价格 | 适用性 |
|---|---|---|---|---|
| DHT11 | ±5%RH | 2s | 8元 | 淘汰(精度不足) |
| DHT22 | ±2%RH | 0.5s | 15元 | 选用 |
| SHT30 | ±1.5%RH | 0.2s | 45元 | 超预算 |
DHT22通过单总线协议与STM32通信,接线时注意:
- 数据线需要4.7K上拉电阻
- 采样间隔建议≥2秒(官方要求最小2秒)
- 避免将传感器安装在柜门附近(开关门影响测量)
烟雾检测实现
选用MQ-2半导体气敏传感器,特点:
- 检测范围:300-10000ppm(液化气/天然气/烟雾)
- 预热时间:约5分钟(刚上电读数不稳定)
- 模拟量输出:需接STM32的ADC通道
校准技巧:在洁净空气中记录ADC基准值,当读数超过基准值30%时触发报警。
2.3 执行机构设计
温湿度调控采用双模方案:
- 除湿模式:当湿度>60%RH时,继电器启动除湿机(需外接)
- 加热模式:当温度<5℃时,PWM控制加热片(50W硅胶加热片)
继电器选型要点:
- 必须选用固态继电器(SSR)
- 额定电流要留余量(加热片电流=50W/220V≈0.23A,选5A规格)
- 加装散热片(长时间工作温度可达60℃)
3. 软件系统实现
3.1 开发环境搭建
使用STM32CubeMX + Keil MDK开发:
- 时钟配置:HSE 8MHz→PLL→72MHz系统时钟
- 外设初始化:
- USART1(调试输出,115200bps)
- USART2(连接ESP8266)
- ADC1(MQ-2模拟量采集)
- TIM3(PWM输出,控制加热片)
- 生成代码后添加业务逻辑
关键驱动代码片段(DHT22读取):
c复制#define DHT22_PIN GPIO_PIN_0
#define DHT22_PORT GPIOA
void DHT22_Start(void) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = DHT22_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(DHT22_PORT, &GPIO_InitStruct);
HAL_GPIO_WritePin(DHT22_PORT, DHT22_PIN, GPIO_PIN_RESET);
HAL_Delay(1); // 主机拉低≥1ms
HAL_GPIO_WritePin(DHT22_PORT, DHT22_PIN, GPIO_PIN_SET);
__HAL_GPIO_EXTI_CLEAR_IT(DHT22_PIN);
}
uint8_t DHT22_ReadByte(void) {
uint8_t data = 0;
for(int i=0; i<8; i++) {
while(!HAL_GPIO_ReadPin(DHT22_PORT, DHT22_PIN)); // 等待高电平
uint32_t start = HAL_GetTick();
while(HAL_GPIO_ReadPin(DHT22_PORT, DHT22_PIN)); // 测量高电平持续时间
if(HAL_GetTick()-start > 40) data |= (1<<(7-i)); // >40us为1
}
return data;
}
3.2 通信协议设计
本地显示协议
OLED采用I2C接口,使用u8g2库驱动:
c复制U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0);
void Display_Update(float temp, float humi, int smoke) {
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_ncenB08_tr);
u8g2.drawStr(0,12,"Smart Wardrobe");
char buf[32];
sprintf(buf, "Temp: %.1fC", temp);
u8g2.drawStr(0,30,buf);
sprintf(buf, "Humi: %.1f%%", humi);
u8g2.drawStr(0,45,buf);
u8g2.drawStr(0,60, smoke>300?"Warning!":"Normal");
u8g2.sendBuffer();
}
远程通信方案
ESP8266通过AT指令与STM32交互,数据格式:
code复制[温度,湿度,烟雾值,继电器状态]\r\n
示例:[25.3,58.2,120,01]\r\n
MQTT主题设计:
- 发布主题:/wardrobe/status
- 订阅主题:/wardrobe/control
3.3 控制逻辑实现
温湿度调控状态机:
c复制typedef enum {
IDLE,
DEHUMIDIFYING,
HEATING
} ControlState;
void Control_Update(float temp, float humi) {
static ControlState state = IDLE;
switch(state) {
case IDLE:
if(humi > 60.0) {
Relay_On(DEHUMIDIFIER);
state = DEHUMIDIFYING;
} else if(temp < 5.0) {
PWM_SetDuty(HEATER, 70); // 70%功率
state = HEATING;
}
break;
case DEHUMIDIFYING:
if(humi < 55.0) {
Relay_Off(DEHUMIDIFIER);
state = IDLE;
}
break;
case HEATING:
if(temp > 8.0) {
PWM_SetDuty(HEATER, 0);
state = IDLE;
}
break;
}
}
4. 系统调试与优化
4.1 传感器校准
发现DHT22在密闭空间出现冷凝问题:
- 问题现象:高湿度环境下读数漂移
- 解决方案:
- 在传感器周围加装透气海绵
- 软件端增加滑动平均滤波
c复制#define FILTER_SIZE 5 float temp_history[FILTER_SIZE]; float Filter_AddValue(float new_val) { static int index = 0; temp_history[index] = new_val; index = (index+1) % FILTER_SIZE; float sum = 0; for(int i=0; i<FILTER_SIZE; i++) { sum += temp_history[i]; } return sum/FILTER_SIZE; }
4.2 功耗优化
实测发现待机功耗达45mA(仅STM32+ESP8266):
- 优化措施:
- 启用STM32的Stop模式(降低到约2mA)
- 修改ESP8266工作模式:
at复制AT+CIPMODE=1 // 透传模式 AT+CIPMUX=0 // 单连接 AT+SLEEP=2 // Modem-sleep模式
- 效果:整体功耗降至约15mA(18650电池可续航约1周)
4.3 安全防护增强
烟雾报警误触发问题处理:
- 现象:喷洒香水时触发误报
- 改进方案:
- 增加延时确认(持续3秒超阈值才报警)
- 添加蜂鸣器本地报警
- 微信推送双重提醒
5. 项目成果与扩展
最终实现功能指标:
- 温湿度测量范围:0-50℃/20-90%RH
- 控制精度:±1℃/±3%RH
- 烟雾响应时间:<5秒
- 远程控制延迟:<2秒(局域网)
成本核算表:
| 部件 | 型号 | 单价 | 数量 | 小计 |
|---|---|---|---|---|
| STM32 | F103C8T6 | 25元 | 1 | 25元 |
| DHT22 | AM2302 | 15元 | 1 | 15元 |
| MQ-2 | 半导体式 | 8元 | 1 | 8元 |
| ESP8266 | ESP-01S | 12元 | 1 | 12元 |
| OLED | SSD1306 | 18元 | 1 | 18元 |
| 继电器 | SSR-5A | 9元 | 2 | 18元 |
| 合计 | - | - | - | 96元 |
后续升级方向:
- 增加衣物RFID识别(记录衣物存放位置)
- 接入天气预报API(提前调节柜内环境)
- 开发自适应控制算法(学习用户使用习惯)
这个项目最让我意外的是除湿机的冷凝水问题——最初没设计排水方案,结果一周后发现柜底积水。后来在除湿机下方加了托盘才解决。建议大家在设计智能家居系统时,不仅要考虑电子部分,更要重视机械结构的配套设计。
