1. 项目背景与核心价值
去年帮电子系的学弟改毕业设计时,在硬盘角落里翻出个尘封已久的STM32智能窗帘晾衣架方案。这个2018年的课程设计最妙的地方在于:虽然原作者根本没做出实物,但电路图、代码、物料清单甚至3D打印文件都完整保留着。对于现在芯片短缺又急着攒项目经验的学生党来说,这种"纸上谈兵"但资料齐全的DIY方案简直是救命稻草。
这个方案本质上是通过STM32F103C8T6主控,配合光敏电阻和DHT11温湿度传感器,实现根据环境光线和温湿度自动控制窗帘开合与晾衣架升降。整套系统成本可以控制在200元以内,所有模块都能在某宝买到现成的开发板,连电烙铁都不用碰就能搭出完整功能。
关键优势:整套资料包含Altium Designer格式的PCB工程、Keil MDK完整工程代码、SolidWorks模型文件,甚至还有微信小程序的控制端源码。这种"开箱即用"的完整性在学生项目中极为罕见。
2. 硬件架构解析
2.1 核心控制器选型
采用STM32F103C8T6(蓝桥杯比赛常用型号)作为主控,主要考虑三点:
- 价格优势:某宝核心板仅12-15元
- 生态完善:标准库和HAL库资料丰富
- 外设够用:自带2个硬件SPI、3个USART、2个I2C,正好满足:
- SPI1驱动OLED显示屏
- I2C1连接温湿度传感器
- USART1与ESP8266 WiFi模块通信
2.2 传感器模块配置
- 光强检测:传统方案会用BH1750数字光强传感器,但这个项目巧妙使用了更便宜的GL5528光敏电阻+ADC采样。实测发现:
- 需要并联10kΩ电阻分压
- 采样值要做滑动平均滤波(代码中已实现)
- 温湿度检测:DHT11虽然精度一般(湿度±5%,温度±2℃),但胜在:
- 3.3V直接供电
- 单总线协议节省IO口
- 某宝模块带电平转换仅5元
2.3 执行机构设计
- 窗帘电机:选用常见的28BYJ-48步进电机(ULN2003驱动板)
- 注意要修改驱动板的跳线帽选择5V供电模式
- 项目代码已实现加减速曲线控制
- 晾衣架升降:用MG995舵机模拟(实际应用建议换N20减速电机)
- PWM周期设置为20ms
- 0.5ms-2.5ms脉宽对应0-180度
3. 软件实现关键点
3.1 环境参数采集优化
原始代码中的传感器读取存在两个典型问题:
c复制// 错误示例:直接连续读取DHT11
void Read_DHT11(void) {
DHT11_Start();
if(DHT11_Check()) {
RH_byte1 = DHT11_Read_Byte(); // 湿度整数
/*...*/
}
}
改进方案:
- 增加读取间隔保护(DHT11两次读取需>1s)
- 添加CRC校验判断数据有效性
- 光敏电阻采样改用DMA+定时器触发
3.2 电机控制算法
窗帘步进电机的控制有三个技术细节:
- 半步驱动模式:比全步模式更平滑
c复制const uint8_t phase_seq[8] = {0x09,0x01,0x03,0x02,0x06,0x04,0x0C,0x08}; - S型速度曲线:避免启动时失步
c复制void Calc_SpeedCurve(uint16_t total_steps) { for(int i=0; i<total_steps/2; i++){ delay_us(5000 - i*20); // 加速度逐渐减小 } } - 堵转检测:通过电流反馈判断窗帘是否卡住
3.3 微信小程序控制端
项目配套的小程序源码包含三个关键功能页:
- 设备配网:基于ESP8266的SmartConfig一键配网
- 状态监控:WebSocket实时推送传感器数据
- 手动控制:可单独操作窗帘/晾衣架
实测发现:ESP8266的AT固件版本必须v1.6.2以上,否则频繁断连。建议烧录安信可提供的定制固件。
4. 低成本实现方案
4.1 硬件替代方案
| 原方案器件 | 替代方案 | 成本对比 |
|---|---|---|
| STM32F103C8T6 | STC8H1K08 | 价格减半 |
| DHT11 | AHT10 | 精度提升 |
| 28BYJ-48电机 | JGA25-370减速电机 | 扭矩更大 |
4.2 无实物调试技巧
- 传感器模拟:
- 用电位器模拟光敏电阻分压
- 串口发送伪造的温湿度数据
- 电机动作验证:
- 用LED闪烁代替实际转动
- 通过串口打印步进脉冲计数
- 3D结构验证:
- 在SolidWorks中做运动仿真
- 导出STL用Cura切片预览
5. 常见问题解决方案
5.1 编译报错处理
-
Keil提示缺少头文件:
- 检查工程Options→C/C++→Include Paths
- 确认是否添加了STM32F10x_StdPeriph_Lib库路径
-
undefined symbol SystemInit:
需在启动文件startup_stm32f10x_md.s中取消注释:assembly复制; Reset handler Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT __main IMPORT SystemInit LDR R0, =SystemInit BLX R0 LDR R0, =__main BX R0 ENDP
5.2 硬件调试技巧
-
步进电机抖动:
- 检查驱动板供电是否≥5V
- 在电机电源端并联1000μF电容
- 降低初始速度(建议从200rpm开始)
-
WiFi频繁掉线:
- 在ESP8266的VCC与GND间加0.1μF去耦电容
- 修改AT指令为:
arduino复制AT+CIPRECONNCFG=1,1,10,30
6. 项目升级方向
6.1 功能扩展建议
- 增加雨水检测:
- 使用FC-37雨滴传感器
- 紧急收回晾衣架功能
- 语音控制:
- 接入科大讯飞离线语音模块
- 自定义唤醒词"小优小优"
- 能耗统计:
- INA219电流传感器
- 小程序端显示用电报表
6.2 结构优化方案
- 窗帘轨道改造:
- 用2020铝型材替代PVC轨道
- 增加红外对射限位开关
- 晾衣架防摆设计:
- 两侧添加尼龙引导绳
- 电机端安装磁编码器
这个项目的精髓在于它展示了如何用最小成本搭建完整的智能家居demo。我后来用这套方案帮三个学弟通过了毕设答辩,最妙的是他们都在此基础上做了个性化修改——有人加了天猫精灵控制,有人实现了光伏充电功能。这种"白盒"项目最大的价值,就是给后来者留足了发挥空间。
