1. 项目背景与核心需求
作为一名嵌入式开发工程师,我最近完成了一个很有意思的智能家居项目——基于STM32的智慧衣橱环境监测系统。这个项目的灵感来源于我自己的亲身经历:去年梅雨季节,我发现衣柜里的好几件心爱的衬衫都出现了霉斑,这让我开始思考如何用技术手段解决这个问题。
传统衣橱管理存在几个痛点:
- 温湿度不可控导致衣物发霉
- 缺乏光照管理可能造成衣物褪色
- 密闭空间容易积累异味和有害气体
- 用户无法实时了解衣橱环境状态
这个系统正是为了解决这些问题而设计的。它通过多种传感器实时监测衣橱环境,并可以自动或手动调节环境参数,为衣物提供最佳存储条件。下面我就详细分享一下这个项目的设计思路和实现过程。
2. 硬件系统设计
2.1 主控芯片选型
经过多方比较,我最终选择了STM32F103C8T6作为主控芯片,主要基于以下几点考虑:
- 性能足够:72MHz主频,20KB RAM,64KB Flash,完全能满足我们的需求
- 丰富的外设接口:具有多个UART、I2C、SPI和ADC接口,方便连接各种传感器
- 低功耗特性:支持多种低功耗模式,这对长期运行的设备很重要
- 开发资源丰富:STM32生态完善,有大量现成的库和示例代码
提示:STM32F103系列有多个型号,C8T6是性价比很高的选择,如果项目需要更多IO口或存储空间,可以考虑CBT6或RCT6。
2.2 传感器模块设计
2.2.1 温湿度传感器
我对比了几种常见的温湿度传感器:
| 传感器型号 | 温度精度 | 湿度精度 | 接口类型 | 价格 |
|---|---|---|---|---|
| DHT11 | ±2°C | ±5%RH | 单总线 | 低 |
| DHT22 | ±0.5°C | ±2%RH | 单总线 | 中 |
| SHT30 | ±0.2°C | ±2%RH | I2C | 高 |
最终选择了SHT30,虽然价格稍高,但精度更好,而且I2C接口更稳定可靠。实际测试中,SHT30的响应速度也更快,适合实时监测。
2.2.2 光照传感器
BH1750是数字环境光传感器,具有以下优势:
- 直接输出数字信号,无需额外ADC
- 测量范围广(1-65535 lux)
- 支持高分辨率模式
- I2C接口,布线简单
在实际安装时,建议将传感器朝向衣橱内部,避免外部光源干扰。
2.2.3 空气质量传感器
MQ-135是一款对氨气、硫化物、苯系蒸汽等敏感的传感器。它的工作原理是通过检测电导率变化来反映空气质量。使用时需要注意:
- 需要预热时间(约24小时稳定)
- 需要定期校准
- 输出是模拟信号,需要ADC转换
2.3 执行机构设计
2.3.1 通风系统
采用5V微型风扇,通过MOSFET管控制。设计要点:
- 选择PWM调速风扇,可以灵活控制风量
- MOSFET选型要注意导通电阻和最大电流
- 添加续流二极管保护电路
2.3.2 除湿系统
使用半导体制冷片(TEC1-12706)实现局部降温除湿,配套设计:
- 大功率散热片和风扇
- 温度监测防止过热
- H桥驱动电路实现正反向控制
2.3.3 用户界面
128x64 OLED显示屏(SSD1306)用于本地显示,优势:
- 低功耗
- 高对比度
- 支持多种显示内容
3. 软件系统设计
3.1 系统架构
采用FreeRTOS实时操作系统,任务划分如下:
- 传感器数据采集任务(优先级3)
- 环境控制任务(优先级2)
- 用户界面刷新任务(优先级1)
- 网络通信任务(优先级2)
3.2 关键算法实现
3.2.1 数据滤波算法
传感器数据容易受到干扰,采用复合滤波策略:
- 硬件滤波:每个传感器信号添加100nF电容
- 软件滤波:滑动平均+中值滤波
c复制#define FILTER_SIZE 5
float median_filter(float new_value) {
static float buffer[FILTER_SIZE] = {0};
static uint8_t index = 0;
buffer[index] = new_value;
index = (index + 1) % FILTER_SIZE;
// 排序取中值
float temp[FILTER_SIZE];
memcpy(temp, buffer, sizeof(temp));
bubble_sort(temp, FILTER_SIZE);
return temp[FILTER_SIZE/2];
}
3.2.2 控制逻辑实现
采用模糊控制算法,根据温湿度偏差和变化率调整执行机构:
c复制void env_control_task(void *params) {
while(1) {
float temp = get_temperature();
float humi = get_humidity();
// 温度控制
if(temp > TEMP_HIGH_THRESHOLD) {
set_fan_speed(calculate_fan_speed(temp));
}
// 湿度控制
if(humi > HUMI_HIGH_THRESHOLD) {
enable_dehumidifier(humi);
}
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
3.3 通信协议设计
使用MQTT协议与云平台通信,消息格式设计:
json复制{
"device_id": "Wardrobe_001",
"timestamp": 1625097600,
"data": {
"temperature": 25.3,
"humidity": 58.2,
"light": 1200,
"air_quality": 45
}
}
4. 系统实现与调试
4.1 PCB设计要点
-
电源部分:
- 采用AMS1117-3.3V稳压芯片
- 输入输出端添加100μF+0.1μF电容滤波
- 预留测试点方便调试
-
信号走线:
- 传感器信号线尽量短
- I2C信号线添加上拉电阻(4.7kΩ)
- 模拟信号远离数字信号
-
布局考虑:
- 发热元件(如TEC)远离敏感器件
- 通风口位置合理设计
4.2 常见问题与解决方案
4.2.1 WiFi连接不稳定
可能原因:
- 天线位置不佳
- 电源噪声干扰
- 固件配置问题
解决方案:
- 调整天线方向
- 添加电源滤波电容
- 优化AT指令发送时序
4.2.2 传感器数据异常
排查步骤:
- 检查电源电压是否稳定
- 测量信号线是否有干扰
- 验证通信协议是否正确
- 测试传感器单独工作情况
4.2.3 系统功耗过高
优化措施:
- 合理设置传感器采样间隔
- 使用STM32低功耗模式
- 优化任务调度策略
- 选择高效率电源方案
5. 项目扩展与优化
5.1 功能扩展方向
- 增加RFID衣物识别功能
- 实现基于季节的智能衣物推荐
- 添加紫外线消毒功能
- 支持语音控制交互
5.2 性能优化建议
- 改用STM32L系列进一步降低功耗
- 实现OTA远程固件升级
- 增加本地数据存储功能
- 优化控制算法响应速度
5.3 产品化考虑
如果要量产这个设计,还需要:
- 通过相关认证(如CE、FCC)
- 优化PCB降低成本
- 开发配套移动应用
- 建立完善的生产测试流程
在实际开发过程中,我发现几个特别值得注意的地方:
- 传感器校准非常重要,特别是MQ-135需要定期校准
- 衣橱内部环境变化较慢,控制算法要有适当的滞后设计
- 用户界面要简洁明了,避免信息过载
- 系统可靠性是关键,需要充分的异常处理机制
这个项目从构思到完成大约用了两个月时间,期间遇到了不少挑战,但最终效果令人满意。系统运行稳定,确实有效防止了衣物发霉问题。如果你也打算开发类似项目,希望我的经验对你有帮助。