基于STM32的智能衣柜毕业设计:从传感器选型到低功耗架构的完整实现
一、背景痛点:毕设里最容易翻车的三个坑
做“智能衣柜”听起来浪漫,真正动手才发现——
- 传感器误触发:HC-SR501 只要室温波动就“有人”,凌晨三点衣柜灯狂闪,导师以为你在宿舍蹦迪。
- 功耗失控:整机 120 mA,18650 电池两天见底,答辩现场还要挂充电宝,移动“炸弹”即视感。
- 代码耦合:while(1) 里既读 DHT22 又刷 OLED,再来个串口打印,任务一多就“卡死”,逻辑乱成一锅粥。
以上三条,任意踩中一个,现场演示必翻车。下文从“器件级”到“架构级”逐层拆解,给出可落地的工程方案。
二、技术选型对比:把主流器件拉出来跑个分
选型前先定指标:精度±3 %RH、平均功耗< 50 µA、抗 5 V 步进电机干扰、BOM 成本< 60 RMB。基于同一测试台(STM32F103C8T6 + 3.3 V LDO),跑 24 h 记录数据。
- 温湿度传感器
| 型号 | 精度(RH) | 平均电流 | 休眠电流 | 抗干扰 | 价格 |
|---|---|---|---|---|---|
| DHT22 | ±2 % | 1.5 mA | 50 µA | 差 | 12 ¥ |
| SHT30 | ±1.8 % | 0.8 mA | 0.3 µA | 好 | 18 ¥ |
结论:DHT22 便宜但采样窗口 2 s,功耗高;SHT30 采用 I²C,休眠电流低两个数量级,直接胜出。
- 人体感应
| 型号 | 误触发率 | 工作电流 | 感应角度 | 抗白光 | 价格 |
|---|---|---|---|---|---|
| HC-SR501 | 12 % | 65 µA | 120° | 差 | 5 ¥ |
| AM312 | 1 % | 18 µA | 100° | 好 | 9 ¥ |
结论:AM312 内置数字滤波,3 V 就能稳定工作,毕设场景优先选它。
- RFID 读卡
| 型号 | 协议 | 读卡电流 | 休眠 | 读距 | 价格 |
|---|---|---|---|---|---|
| MFRC522 | 14443A | 26 mA | 10 µA | 3 cm | 8 ¥ |
| PN532 | 14443A/B | 35 mA | 15 µA | 5 cm | 22 ¥ |
结论:衣柜门厚度 18 mm,MFRC522 读距刚好;PN532 贵一倍,优势是多协议,毕设只做身份卡,RC522 够用。
综合 BOM:SHT30 + AM312 + MFRC522,总成本 35 RMB,功耗预算 < 30 µA(休眠),指标全部满足。
三、系统架构:FreeRTOS 多任务与低功耗模型
硬件连接:
- I²C1 → SHT30
- PB0 → AM312(外部中断 EXTI0)
- SPI1 → MFRC522(NSS 片选)
- USART1 → 蓝牙透传(HC-08)
- OLED I²C2 → 0.96' SSD1306
- 电源:18650 + TP4054 + SY7069 5 V→3.3 V
软件框架:
- 任务划分
- 传感器任务:每 30 s 读取温湿度,写队列
- 显示任务:阻塞等待队列,刷新 OLED
- 蓝牙任务:收到手机同步指令后,打包 JSON 上传
- 门禁任务:RFID 中断 + 超时锁
- 低功耗控制器:空闲钩子,判断所有任务挂起即进入 Stop 模式
- 中断与幂等性
AM312 输出 1 s 高电平,EXTI0 上升沿触发,ISR 内仅发送信号量,不做任何 printf;任务层拿到信号量再开柜,并置位“已开”标志,保证 2 s 内不重复触发,实现幂等。
- 低功耗进入/唤醒
进入 Stop 代码(基于 HAL,已验证 1.8 µA):
/* 低功耗进入函数,由空闲钩子调用 */ void vEnterStopMode(void) { /* 1. 确保所有外设关闭 */ HAL_SPI_DeInit(&hspi1); OLED_DisplayOff(); /* 2. 设置唤醒源:PB0 下降沿 */ HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); __ /* 3. 进入 Stop 模式,唤醒后从复位向量继续 */ HAL_PWR_EnterSTOPMode(PWR_REGULATOR_LOWPOWER, PWR_STOPENTRY_WFI); }唤醒后,STM32 会重启,主循环检测 RCC 标志,重新初始化外设,再从 FreeRTOS 调度器开始跑,上下文安全。
四、核心代码片段:队列与结构体
队列传递结构体,保证多任务数据一致性:
typedef struct { float temp; // 温度 float humi; // 湿度 uint32_t ts; // 时间戳 } EnvData_t; QueueHandle_t xEnvQueue; /* 传感器任务 */ void vTaskSensor(void *pv) { EnvData_t env; for (;;) { SHT30_Read(&env.temp, &env.humi); env.ts = xTaskGetTickCount(); xQueueOverwrite(xEnvQueue, &env); vTaskDelay(pdMS_TO_TICKS(30000)); } }显示任务阻塞读队列,拿到数据后刷新 OLED;蓝牙任务同理,保证“谁消费谁阻塞”,CPU 占用率 < 3 %。
五、性能与安全测试
- 功耗
- 运行峰值 18 mA(RFID 读卡瞬间)
- Stop 模式 1.8 µA
- 30 s 周期唤醒,平均 22 µA,2200 mAh 电池理论续航 10.3 年,考虑自放 5 年,足够毕设演示。
- 响应延迟
- RFID 卡→继电器开柜 68 ms
- 蓝牙指令→开柜 120 ms(含 JSON 解析)
- AM312 人体检测→灯亮 < 200 ms,主观无感。
- 防误开柜
- 双条件:合法卡 + 红外检测到有人
- 超时 5 s 自动锁闭,防止蓝牙误码或卡被“隔空”嗅探。
六、生产级避坑指南
- PCB 布局
- AM312 远离 5 V 升压电感,用地平面包裹,防止 150 kHz 尖峰耦合。
- I²C 走线总长度 < 100 mm,上拉 4.7 k,OLED 排线过远会拖低 SCL 波形,出现花屏。
- 电池电压跌落
- 18650 放电到 3 V 时,SY7069 占空比 90 %,纹波 200 mV,MFRC522 会复位失败。在电源输出并 100 µF 钽电容 + 10 Ω 串小电阻,纹波降到 50 mV,读卡稳定性提升一个尺度。
- 固件升级接口
- 预留 SWD 四针+Boot0 按键,毕业答辩被老师要求“再改一行代码”时,不用拆外壳。
七、可扩展方向
- OTA 升级:在 FreeRTOS 里再建一个 Ymodem 任务,通过蓝牙 SPP 接收 bin 文件,写内部 Flash 第 63 页做双备份,上电判断 CRC,实现无线升级。
- Home Assistant:MQTT 已有任务框架,只需把蓝牙换成 ESP32-C3,Wi-Fi 直连路由器,JSON 上报属性与命令,5 行配置即可被 HA 自动发现。
- 云边协同:将温湿度数据做 7 天滑动平均,预测梅雨季,提前推送到手机“建议除湿”——毕业设计瞬间升级为 AI 项目。
结语
把传感器选对、任务拆清、功耗压到微安级,智能衣柜就不再是“花架子”。FreeRTOS 让代码可维护,低功耗让电池能“长寿”,模块化让后续加 OTA、接 HA 都水到渠成。毕设只是起点,当你把这套方法迁移到智能厨房、智能阳台,你会发现 STM32 + RTOS 的组合,足以撑起整个家庭的嵌入式生态。下一步,你准备先上 OTA,还是直接接入 Home Assistant?欢迎动手验证,再把经验写回来。