1. 项目概述:当传统衣柜遇上物联网
去年帮朋友改造儿童房时,发现他家的衣柜简直是个"黑洞"——永远找不到想穿的衣服,换季时又总把不合适的衣物堆在最外面。这让我萌生了用STM32做个智能衣柜系统的想法。本质上,这是个集成了衣物管理、环境监测、智能提醒的物联网终端,通过传感器+执行器+云平台的组合拳,让传统衣柜拥有"数字大脑"。
这个完整项目包含硬件层(STM32F103C8T6最小系统、传感器阵列)、嵌入式层(FreeRTOS实时系统)、通信层(ESP8266 WiFi模块)以及应用层(微信小程序控制端)。实测下来,系统能自动记录衣物存取、监测温湿度防止霉变、根据天气推荐穿搭,甚至能通过重量传感器发现你太久没穿某件衣服时发出"断舍离"提醒。
2. 核心功能设计解析
2.1 硬件架构设计
主控选用STM32F103C8T6(蓝色pill开发板),这颗Cortex-M3内核的MCU性价比极高,72MHz主频足够处理多传感器数据。关键外设包括:
- RFID模块(RC522):每个衣架嵌入13.56MHz无源标签,成本不到0.5元/个
- 温湿度传感器(SHT30):比DHT22精度更高,I²C接口节省IO口
- 重量传感器(HX711+悬臂梁):每个挂衣杆下方安装,量程5kg精度±10g
- ESP-01S WiFi模块:通过AT指令与STM32串口通信,负责数据上传
硬件选型心得:最初试过用STM32的硬件I²C驱动SHT30,结果频繁卡死。后来改用软件模拟I²C,虽然速度慢些但稳定性大幅提升。建议在CubeMX里直接禁用硬件I²C外设。
2.2 软件架构设计
采用分层架构+事件驱动模型,在Keil MDK中配置FreeRTOS实现多任务管理:
c复制void StartDefaultTask(void *argument) {
/* 初始化所有硬件 */
BSP_Init();
/* 创建RTOS任务 */
xTaskCreate(vRFIDTask, "RFID", 128, NULL, 3, NULL);
xTaskCreate(vEnvMonitorTask, "ENV", 128, NULL, 2, NULL);
xTaskCreate(vCommTask, "WIFI", 256, NULL, 4, NULL);
while(1) {
vTaskDelay(1000); // 主任务仅维持心跳
}
}
关键任务优先级设置原则:通信任务>用户交互任务>环境监测任务。实测发现当WiFi信号差时,如果通信任务优先级不足,会导致TCP重传失败。
3. 关键技术实现细节
3.1 衣物识别系统
采用RFID而非图像识别方案,主要考虑衣柜内光线差且衣物堆叠。每个衣架开槽嵌入NTAG213标签,在衣柜横杆安装RC522读卡器阵列(间隔15cm)。当检测到标签ID变化时,通过查找预设数据库匹配衣物信息。
标签读取算法优化:
c复制uint8_t RFID_Scan(void) {
static uint32_t last_id = 0;
if (PCD_ReadCardSerial() == MI_OK) {
uint32_t current_id = *(uint32_t*)serNum;
if(current_id != last_id) { // 防抖处理
last_id = current_id;
return current_id;
}
}
return 0;
}
3.2 环境监控子系统
SHT30每5分钟采集一次数据,异常时(湿度>70%)启动衣柜内置的PTC加热器。加热功率通过PID算法动态调节:
c复制float PID_Control(float setpoint, float input) {
static float errSum = 0, lastErr = 0;
float error = setpoint - input;
errSum += error * sampleTime;
float dErr = (error - lastErr) / sampleTime;
lastErr = error;
return Kp*error + Ki*errSum + Kd*dErr;
}
实测参数:Kp=2.5, Ki=0.1, Kd=1.0时,能在10分钟内将湿度降至60%以下。
4. 通信协议设计
4.1 数据上传格式
通过ESP8266连接自建MQTT服务器,报文采用JSON格式压缩传输:
json复制{
"devID":"Wardrobe_01",
"timestamp":1698765432,
"clothes":[
{"tag":"E2A856C1","weight":325},
{"tag":"F1B934D2","weight":280}
],
"env":{
"temp":24.5,
"humi":68,
"heat":30
}
}
为节省流量,采用增量上报策略——仅当数据变化超过阈值(温度±1℃、重量±20g)时才上传。
4.2 微信小程序交互
小程序通过WebSocket与服务器通信,主要指令包括:
- 获取当前状态:
{"cmd":"status"} - 设置加热功率:
{"cmd":"set_heat","val":50} - 查询历史记录:
{"cmd":"history","type":"week"}
通信避坑:早期版本直接用HTTP轮询,导致ESP8266频繁断连。改用MQTT+QoS1后稳定性提升90%。
5. 实际部署问题与优化
5.1 电源管理难题
最初采用5V/2A电源适配器供电,发现以下问题:
- 多个RC522同时工作时电流峰值达1.8A
- 加热器启动时产生电压跌落
改进方案:
- 增加4700μF电解电容缓冲
- 采用分时供电策略(RFID阵列轮询工作)
- 加热器采用软启动(PWM斜率控制)
5.2 传感器抗干扰
在金属衣柜内部署时遇到:
- RFID读取距离从5cm降至不足2cm
- 重量传感器受衣柜共振影响
解决方案:
- 在RC522天线外围加装3mm亚克力隔离层
- 重量传感器改用四线制接法,并添加数字滤波:
c复制#define FILTER_N 10
uint32_t Weight_Filter(void) {
static uint32_t buf[FILTER_N];
static uint8_t cnt = 0;
buf[cnt++] = HX711_Read();
if(cnt >= FILTER_N) cnt = 0;
uint32_t sum = 0;
for(uint8_t i=0; i<FILTER_N; i++)
sum += buf[i];
return sum/FILTER_N;
}
6. 项目扩展方向
当前系统已稳定运行半年,后续计划:
- 增加UV杀菌模块(需解决臭氧安全问题)
- 引入机器学习算法分析穿衣偏好
- 与智能家居平台联动(如开衣柜自动亮灯)
这个项目最让我意外的收获是:原来硬件开发中最耗时的不是写代码,而是处理各种电磁兼容问题。比如发现手机放在衣柜旁时,RFID误读率会上升20%,最后通过给读卡器加装铜箔屏蔽层才解决。
