去年装修老房子时,发现楼梯间的照明是个让人头疼的问题。传统声控灯反应迟钝,常亮灯又浪费电,于是萌生了用STM32做个智能楼梯灯系统的想法。这个系统能根据人体移动自动点亮对应区域的LED灯带,实现"人走到哪灯亮到哪"的效果,兼顾节能与便利性。
整套系统硬件成本不到200元,但实现了商业级楼梯灯80%的功能。最让我满意的是光照补偿算法,能根据环境光自动调节亮度,白天进楼梯间不会突然亮瞎眼,晚上又能提供充足照明。下面就把这个项目的完整实现过程分享给大家,特别适合有STM32基础想进阶物联网开发的爱好者。
最终选择STM32F103C8T6最小系统板作为主控,考虑因素包括:
对比ESP8266等WiFi方案,STM32在实时性和GPIO数量上更有优势。实际测试中,从传感器触发到灯光响应延迟<50ms,完全满足使用需求。
采用"红外+雷达"双模检测方案:
安装时每级台阶配置一对传感器,呈45°角交叉检测。实测这种布局能准确识别上下楼方向,误触发率<1%。
注意:传感器安装高度建议1.2-1.5米,避免宠物触发。雷达模块需用3D打印支架固定,确保波束指向正确。
LED灯带选型要点:
驱动电路设计:
c复制// MOSFET驱动电路示例
void LED_Control(uint8_t level, uint8_t brightness) {
GPIO_WriteBit(GPIOB, level_Pins[level], brightness > 0 ? Bit_SET : Bit_RESET);
PWM_SetDuty(brightness); // 使用TIM3通道1输出PWM
}
通过传感器触发序列判断移动方向:
c复制#define UP_DIR 0x01 // 二进制0001
#define DOWN_DIR 0x02 // 二进制0010
uint8_t Detect_Direction(void) {
static uint8_t prev_state = 0;
uint8_t current_state = Read_Sensors();
uint8_t dir = (prev_state << 2) | current_state;
prev_state = current_state;
if((dir & 0x0F) == 0b0001) return UP_DIR;
if((dir & 0x0F) == 0b0010) return DOWN_DIR;
return 0;
}
根据环境光传感器(BH1750)数据动态调整亮度:
c复制uint8_t Auto_Brightness(void) {
float lux = BH1750_Read();
uint8_t brightness;
if(lux > 200) brightness = 0; // 白天不点亮
else if(lux > 50) brightness = 30; // 阴天低亮度
else brightness = 100; // 夜晚全亮
return brightness * (1 + motion_speed/10); // 根据移动速度微调
}
待机功耗优化措施:
c复制void Enter_LowPower(void) {
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
__WFI(); // 等待中断唤醒
}
实测待机电流从25mA降至3.8mA。
plaintext复制初始化硬件
↓
配置中断(传感器/定时器)
↓
主循环:
读取环境光强度
检测人体移动
计算目标亮度
更新LED状态
检查低功耗条件
c复制typedef struct {
uint8_t sensor_map; // 传感器状态位图
uint8_t led_level; // 当前点亮级数
uint8_t brightness; // 当前亮度(0-100)
uint8_t direction; // 移动方向
} System_State;
c复制void EXTI9_5_IRQHandler(void) {
if(EXTI_GetITStatus(EXTI_Line5) != RESET) {
System_State.sensor_map |= 0x01;
EXTI_ClearITPendingBit(EXTI_Line5);
}
// 其他中断线处理...
}
楼梯灯布置原则:
传感器安装技巧:
常用调试手段:
c复制void Test_Mode(void) {
for(int i=0; i<STEPS_NUM; i++) {
LED_Control(i, 50);
Delay_ms(200);
LED_Control(i, 0);
}
}
光照校准:
传感器灵敏度调节:
可能原因及对策:
优化方案:
c复制if(sensor_active && (HAL_GetTick()-last_trigger)>200) {
// 确认真实触发
}
当使用无线扩展模块时:
通过蓝牙模块添加功能:
试验性加入:
使用TensorFlow Lite实现:
这个项目最让我惊喜的是雷达传感器的表现,原本担心会误检窗帘晃动,实际测试中只要安装角度正确,检测准确率能达到95%以上。建议初次尝试可以先用纯红外方案,等核心功能调通后再升级为双模检测。