1. 项目概述
这个基于STM32的智能台灯系统设计项目,是我最近完成的一个嵌入式开发实践。作为一个经常熬夜工作的开发者,我深刻体会到传统台灯的不足:要么太亮刺眼,要么太暗看不清,还得手动调节,非常不方便。于是决定自己动手做一个能自动调节亮度、带人体感应和远程控制的智能台灯。
系统采用STM32F103C8T6作为主控芯片,这是ST公司Cortex-M3内核的经典款,72MHz主频完全够用,价格也亲民。整个系统包含六大功能模块:照明控制、环境监测、信息显示、远程控制、人机交互和定时功能。最让我满意的是它的自动调节功能,能根据环境光线自动调整亮度,还能检测人体存在自动开关灯,再也不用担心忘记关灯了。
2. 硬件设计详解
2.1 核心控制模块选型
选择STM32F103C8T6主要基于三点考虑:
- 性能足够:72MHz主频,64KB Flash,20KB RAM,处理传感器数据和PWM控制绰绰有余
- 外设丰富:自带ADC、PWM、I2C、USART等接口,正好匹配各个功能模块
- 成本优势:相比其他ARM芯片,价格只要十几块钱,适合DIY项目
实际使用中发现,这款芯片的GPIO驱动能力确实不错,直接驱动OLED和蓝牙模块都没问题。唯一需要注意的是,ADC参考电压要稳定,我专门加了0.1uF的滤波电容。
2.2 照明控制电路设计
LED驱动部分我采用了最经典的NPN三极管方案:
- LED灯珠:12V/5W的5730贴片LED,亮度足够且发热小
- 驱动三极管:S8050,便宜又好用
- PWM频率:设置为100Hz,既避免频闪,又不会让三极管发热严重
亮度调节采用5级PWM控制:
c复制// PWM占空比设置
void SetBrightness(uint8_t level) {
switch(level) {
case 1: TIM1->CCR1 = 20; break; // 20%
case 2: TIM1->CCR1 = 40; break; // 40%
case 3: TIM1->CCR1 = 60; break; // 60%
case 4: TIM1->CCR1 = 80; break; // 80%
case 5: TIM1->CCR1 = 100; break; //100%
}
}
2.3 传感器模块设计
环境监测用了三个传感器:
-
光敏电阻:5516型号,价格不到1块钱
- 接法:与10K电阻分压后接入PA0(ADC1)
- 注意:要加0.1uF滤波电容,否则读数会跳变
-
人体红外:HC-SR501
- 调节技巧:灵敏度电位器调到中间,延时调到5秒
- 实际测试发现,安装角度很重要,最好倾斜30度向下
-
超声波:HC-SR04
- 测距算法:
c复制distance = (echo_time * 340) / 20000; // 单位cm - 注意:Trig信号至少要10us,我实际用了20us更可靠
- 测距算法:
3. 软件架构设计
3.1 主程序流程
系统采用前后台架构,主循环处理主要逻辑,中断处理紧急事件:
c复制int main(void) {
Hardware_Init(); // 硬件初始化
OLED_ShowWelcome(); // 显示欢迎界面
while(1) {
EnvData_Update(); // 更新环境数据
Key_Process(); // 处理按键
Bluetooth_Process(); // 处理蓝牙
AutoMode_Process(); // 自动模式处理
Timer_Process(); // 定时处理
OLED_Refresh(); // 刷新显示
Delay_ms(50); // 50ms周期
}
}
3.2 自动亮度算法
这是项目的核心算法,根据环境光照自动调节亮度:
c复制void AutoBrightness_Adjust(uint16_t lux) {
if(lux < 200) SetBrightness(5);
else if(lux < 400) SetBrightness(4);
else if(lux < 600) SetBrightness(3);
else if(lux < 800) SetBrightness(2);
else SetBrightness(1);
}
实际调试中发现,不同环境的光照基准值差异很大,所以我在OLED设置里增加了亮度阈值校准功能。
3.3 蓝牙通信协议
为了简化开发,我设计了一套简单的文本协议:
| 指令 | 功能 | 示例 |
|---|---|---|
| K1 | 开灯 | K1 |
| K0 | 关灯 | K0 |
| L1-L5 | 亮度 | L3 |
| M0 | 手动 | M0 |
| M1 | 自动 | M1 |
| T1-T60 | 定时 | T30 |
手机端用MIT App Inventor做了个简单APP,实测响应速度在100ms以内。
4. 制作过程与调试心得
4.1 PCB设计注意事项
-
电源布局:
- 12V和3.3V电源走线要足够宽
- 每个芯片的VCC附近都要加0.1uF去耦电容
- 地线采用星型连接,避免共地干扰
-
信号线处理:
- 超声波模块的Echo信号线要短
- I2C线上拉电阻用4.7K
- PWM输出线远离模拟信号线
4.2 常见问题排查
-
问题:LED亮度不稳定
- 检查:PWM频率是否合适(100Hz最佳)
- 解决:在LED正极串接220Ω限流电阻
-
问题:人体感应误触发
- 检查:模块供电是否稳定
- 解决:在VCC加100uF电解电容
-
问题:蓝牙连接不稳定
- 检查:天线是否远离金属物体
- 解决:将蓝牙模块置于外壳顶部
5. 项目优化方向
-
功耗优化:
- 增加光敏电阻的采样间隔
- 无人时关闭OLED背光
- 使用STM32的睡眠模式
-
功能扩展:
- 增加温湿度传感器
- 支持WiFi连接
- 添加语音控制功能
-
外观设计:
- 3D打印定制外壳
- 增加触摸按键
- 优化LED导光结构
这个项目从构思到完成用了大约一个月时间,最耗时的部分是传感器校准和蓝牙调试。最终成品的效果超出预期,特别是自动亮度调节非常实用,现在已经成为我工作台上的主力照明工具。整个项目的材料成本控制在150元以内,性价比相当高。
