1. 项目概述
这个智能窗帘控制系统是我去年为一个老旧小区改造项目设计的低成本解决方案。当时业主们既想要现代化智能家居体验,又受限于老建筑的布线条件,最终选择了基于STC89C52的方案。这个8位单片机虽然看起来古老,但在这种简单控制场景中完全够用,而且成本可以控制在30元以内。
系统核心功能很简单:通过光照传感器自动开合窗帘,同时保留手动按键控制和手机蓝牙控制三种操作模式。最让我自豪的是,整套系统在保证可靠性的前提下,硬件成本仅76元(不含窗帘本体),软件代码量不到800行,非常适合个人DIY或小批量改造项目。
2. 硬件设计详解
2.1 主控芯片选型
STC89C52RC这颗芯片我用了十几年,它的优势很明显:
- 5V工作电压,直接兼容大多数传感器模块
- 8K Flash存储足够存放控制逻辑代码
- 32个IO口轻松满足外设连接需求
- 支持串口烧录,开发门槛极低
注意:买芯片时一定要认准"STC89C52RC"后缀,老版本的STC89C52只有4K Flash,容易遇到存储空间不足的问题。
2.2 电机驱动方案
经过多次实测,我最终选择了ULN2003驱动板+28BYJ-48步进电机的组合:
- 整套驱动成本仅12元
- 步进电机自带减速箱,扭矩足够拉动2米宽的布艺窗帘
- 驱动板直接兼容5V电平,无需额外电平转换
电机参数配置要点:
c复制#define STEPS_PER_REV 2048 // 28BYJ-48电机参数
#define CURTAIN_LENGTH 1.5 // 窗帘行程(米)
#define PULLEY_DIAMETER 0.04 // 滑轮直径(米)
// 计算所需步进数
int target_steps = (CURTAIN_LENGTH / (3.14*PULLEY_DIAMETER)) * STEPS_PER_REV;
2.3 传感器模块选型
光照检测用了常规的BH1750数字光强传感器,相比光敏电阻有以下优势:
- 直接输出lux值,无需AD转换
- 0-65535lx量程覆盖室内外各种场景
- I2C接口节省IO资源
人体感应模块选用了HC-SR501,实际安装时要注意:
- 探测角度需调整至水平方向
- 延时旋钮建议调到最小(约3秒)
- 灵敏度调到中间档位避免误触发
3. 软件设计实现
3.1 主控制逻辑流程
系统采用状态机设计模式,这是我调试过最稳定的架构:
c复制void main() {
while(1) {
switch(sys_state) {
case AUTO_MODE:
light_val = BH1750_Read();
if(light_val > OPEN_THRESHOLD && curtain_pos < 100) {
motor_run(OPEN);
}
// 其他条件判断...
break;
case MANUAL_MODE:
if(btn_open_pressed) {
motor_run(OPEN);
}
// 其他按钮处理...
break;
}
check_bluetooth(); // 蓝牙指令处理
}
}
3.2 关键算法实现
窗帘开合控制采用梯形加减速算法,实测比单纯延时更平稳:
c复制void motor_run(int dir) {
int accel_steps = STEPS_PER_REV / 4; // 加速段步数
int decel_start = target_steps - accel_steps;
for(int i=0; i<target_steps; i++) {
if(i < accel_steps) {
delay_ms(20 - (i*15/accel_steps)); // 加速阶段
}
else if(i > decel_start) {
delay_ms(5 + ((i-decel_start)*15/accel_steps)); // 减速阶段
}
else {
delay_ms(5); // 匀速阶段
}
step_motor(dir);
}
}
3.3 蓝牙通信协议
使用HC-05模块实现手机控制,自定义了简单协议:
| 指令字节 | 功能说明 | 参数范围 |
|---|---|---|
| 0xA1 | 设置开合百分比 | 0-100 |
| 0xA2 | 设置自动模式阈值 | 0-65535 |
| 0xA3 | 立即停止 | 无 |
调试心得:蓝牙模块的KEY引脚要接高电平进入AT指令模式,波特率建议用9600,太高会导致STC89C52串口不稳定。
4. 安装调试要点
4.1 机械结构设计
窗帘导轨改造要注意:
- 滑轮间距不超过50cm,防止窗帘中部下垂
- 电机安装位置要预留检修空间
- 传动绳选用尼龙包芯绳,寿命比普通棉绳长5倍
4.2 电气安装规范
我的接线"三防"原则:
- 电源线套蛇皮管防磨损
- 信号线加磁环防干扰
- 所有接头点热缩管防水汽
典型问题排查表:
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 电机抖动不转 | 相序接错 | 调换任意两相线序 |
| 光强读数波动大 | 未加软件滤波 | 改用滑动平均滤波算法 |
| 蓝牙频繁断开 | 模块供电不足 | 单独接5V电源,不走开发板供电 |
5. 系统优化方向
这套系统我后续又做了几个实用改进:
- 增加太阳能供电模块,阴天可自动切换市电
- 加入窗帘位置记忆功能,断电后无需重新校准
- 通过433MHz射频扩展遥控距离
最实用的其实是加入了一个物理开关切换自动/手动模式,比纯蓝牙控制可靠得多。有次业主家路由器故障,蓝牙连不上,这个物理开关就成了救命设计。