1. 项目概述:当台灯遇上单片机
十年前我刚入行电子设计时,做过最实用的项目就是智能台灯。如今市面上的智能灯具琳琅满目,但自己动手用单片机打造一台多功能台灯,依然是电子爱好者入门嵌入式开发的最佳练手项目。这个设计最吸引人的地方在于:用几十元的成本就能实现市面千元级产品的核心功能。
传统台灯升级为智能版本需要解决三个核心问题:如何感知环境(光敏/人体感应)、如何智能控制(PWM调光/定时功能)、如何实现人机交互(触摸/APP控制)。我这次设计的版本采用STM32F103C8T6作为主控,集成光敏电阻、红外感应、触摸按键和蓝牙模块,支持自动调光、人体感应开关、触摸控制和手机APP远程操控四种模式。
关键提示:选择STM32F103C8T6(俗称"蓝色药丸")是因为其72MHz主频足够处理多任务,且价格仅10元左右,远比Arduino性价比高。
2. 硬件设计详解
2.1 核心器件选型
主控芯片选型对比表:
| 型号 | 价格 | 主频 | GPIO | ADC通道 | 优势 |
|---|---|---|---|---|---|
| STM32F103C8T6 | 10元 | 72MHz | 37 | 10 | 性价比最高 |
| Arduino UNO | 30元 | 16MHz | 14 | 6 | 生态好但性能不足 |
| ESP8266 | 12元 | 80MHz | 17 | 1 | 自带WiFi但ADC精度低 |
传感器配置方案:
- 光敏电阻:GL5528(检测范围10-20Lux)
- 人体红外:HC-SR501(探测角度120°)
- 触摸按键:TTP223(替代机械按键)
- 蓝牙模块:HC-05(兼容主流手机)
2.2 电路设计要点
PWM调光电路是核心难点。LED驱动采用MOSFET(IRLZ44N)而非三极管,因为:
- 导通电阻仅0.022Ω,几乎不发热
- 栅极驱动电压3.3V兼容STM32
- 开关频率可达100kHz以上
实测教训:最初使用S8050三极管,当PWM频率超过1kHz时发热严重,导致亮度不稳定。
光敏检测电路需要特别注意:
c复制// ADC采样代码示例
void ADC_Init() {
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;
ADC1->SMPR2 |= ADC_SMPR2_SMP0_2; // 239.5周期采样
ADC1->SQR3 |= 0; // 通道0
ADC1->CR2 |= ADC_CR2_ADON;
}
3. 软件架构设计
3.1 多任务调度方案
采用时间片轮询而非RTOS,因为:
- 资源占用少(RAM<1KB)
- 响应速度满足需求(最慢任务100ms周期)
- 避免RTOS的学习成本
任务优先级分配:
- 触摸检测(10ms)
- 环境光采样(100ms)
- 人体红外检测(50ms)
- 蓝牙通信(200ms)
- PWM输出(1ms)
3.2 关键算法实现
自动调光采用PID控制:
c复制float PID_Control(float setpoint, float actual) {
static float integral = 0, last_err = 0;
float Kp=0.5, Ki=0.01, Kd=0.1;
float err = setpoint - actual;
integral += err;
if(integral > 100) integral = 100;
if(integral < -100) integral = -100;
float output = Kp*err + Ki*integral + Kd*(err-last_err);
last_err = err;
return output > 100 ? 100 : (output < 0 ? 0 : output);
}
蓝牙协议设计要点:
- 使用AT指令模式
- 自定义简协议:头(0xAA)+命令(1B)+数据(2B)+校验(1B)
- 手机端用MIT App Inventor快速开发控制界面
4. 制作与调试实录
4.1 PCB布局技巧
我的三层布局方案:
- 顶层:主控+传感器(信号线路优先)
- 底层:电源+MOSFET(大电流路径)
- 中间层:铺地平面(降低干扰)
实测干扰问题解决案例:
- 现象:ADC采样值跳动±20
- 排查:光敏电阻与PWM线路平行走线
- 解决:改为垂直走线+添加0.1μF去耦电容
- 结果:跳动范围降至±3
4.2 结构设计创新
用3D打印灯罩时发现的秘诀:
- 透光率测试:PLA材料2mm厚度透光约60%
- 最佳方案:上部密纹(防眩光)+下部疏纹(均匀发光)
- 支撑结构:隐藏螺丝柱设计(外观更简洁)
成本控制清单:
- 主控:10元
- 传感器:15元(光敏1+红外8+触摸3+蓝牙3)
- LED:5元(2835灯珠20颗)
- 其他:5元(PCB+结构件)
- 总成本:35元(不含电源)
5. 进阶功能拓展
5.1 学习模式实现
通过光强+时间组合实现:
c复制void Study_Mode() {
static uint32_t last_move = 0;
if(Human_Detected()) last_move = HAL_GetTick();
if(HAL_GetTick() - last_move > 30*60*1000) { // 30分钟无动作
PWM_Set(30); // 自动调至护眼模式
Buzzer_Alert(); // 提醒休息
}
}
5.2 能耗优化技巧
实测数据对比:
- 常规模式:5W(全亮)
- 优化方案:
- 动态调光:平均2.8W
- 人体感应:夜间待机0.5W
- 自动关机:0W(超过2小时无人)
电源选型建议:
- 优先选用恒流驱动(如PT4115)
- 避免直接电阻限流(效率<60%)
- USB供电时注意5V转3.3V的效率(选用SY8088等同步整流芯片)
6. 常见问题排查指南
问题现象表:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 触摸不灵敏 | 面板太厚(>3mm) | 改用更薄面板或增大触摸面积 |
| 人体误触发 | 灵敏度太高 | 调节HC-SR501上的电位器 |
| 蓝牙连接不稳定 | 天线靠近金属 | 重新布局或外接天线 |
| PWM频闪 | 频率低于100Hz | 提高至1kHz以上 |
| ADC采样噪声大 | 电源纹波大 | 增加LC滤波电路 |
7. 项目升级方向
下一步我准备尝试:
- 加入语音识别(LD3320模块)
- 实现RGB氛围灯效果(WS2812B)
- 增加光强记忆功能(EEPROM存储)
- 开发Windows客户端(Qt跨平台方案)
这个项目的最大收获是理解了嵌入式系统软硬件协同设计的精髓。当看到自己亲手制作的台灯能根据环境光线自动调节亮度时,那种成就感是买成品永远无法比拟的。建议初学者一定要亲手走完从电路设计到编程调试的完整流程,这比看十本理论书都管用。
