基于 STM32 + LU-ASR01 的智能台灯:从语音控制到自动感光的完整设计
一、写在前面:为什么做这个系统
智能台灯的"智能"两字,最容易做歪------要么只能手机控制、要么只能语音、要么只会按环境光开关一台灯。真正的智能台灯应该把语音、APP、自动感光、人体感应、手动开关五个维度串到一起:说一句"开灯"就能亮、走到桌前自动开、离开自动关、光线够强自动关、APP 还能远程看一下状态。
本文给出基于 STM32F103C8T6 的智能台灯完整方案:LU-ASR01 离线语音识别模块负责本地口令解析、TCRT5000 红外人体感应判断"是否有人坐下"、GL5528 光敏电阻判断"光线够不够亮"、OLED12864 显示当前状态、ESP8266 把状态推到手机 APP。整套系统围绕"语音+自动+远程"三条主线展开,覆盖桌面学习场景的完整交互需求。
二、系统功能总览
| 功能模块 | 实现方式 | 用途 |
|---|---|---|
| 语音控制 | LU-ASR01 离线识别 | "开灯/关灯/调亮/调暗"等口令 |
| 人体感应 | TCRT5000 红外反射 | 检测座位上是否有人 |
| 光感检测 | GL5528 光敏电阻 + ADC | 检测环境光强度 |
| 自动模式 | 有人+光暗 → 自动开 | 离开或光足自动关 |
| 手动模式 | 语音/APP 覆盖 | 任意时刻强制开/关 |
| 本地显示 | OLED12864(I2C) | 状态、亮度、模式显示 |
| 远程通信 | ESP8266 + MQTT | APP 端查看/控制 |
| LED 驱动 | PWM 调光 | 无级亮度调节 |
三、关键器件选型
3.1 主控芯片:STM32F103C8T6
主频 72MHz,64KB Flash、20KB SRAM,多个 USART、I2C、SPI、定时器资源,与 LU-ASR01、OLED、ESP8266 通信的同时还能输出 PWM 调光,性价比首选。
3.2 语音识别模块:LU-ASR01
支持离线本地识别,最多可录入 100 条语音指令,识别准确率高达 95%,识别距离 3-5 米,无需联网即可响应口令;通过 UART 与 STM32 通信,把识别结果以数据帧形式发给主控。
3.3 人体感应:TCRT5000
红外发射+接收一体模块,遇到桌面/人体表面会反射红外光,输出电平随反射强度翻转;安装于台灯底部向下照射,检测"是否有人坐在桌前"。
3.4 光敏电阻:GL5528
硫化镉光敏元件,电阻随光照强度变化,配合固定电阻做分压电路,输出电压送入 STM32 ADC,量化环境光强度。
3.5 显示模块:OLED12864
128×64 分辨率,I2C 接口,SSD1306 控制器,自发光、广视角、低功耗,强光下也能清晰读出当前亮度和模式。
3.6 通信模块:ESP8266
经典 Wi-Fi 模组,内置 TCP/IP 协议栈,通过 AT 指令连接云端 MQTT broker,把台灯状态实时推给手机。
3.7 LED 灯板
暖白/冷白 LED 灯珠,串联合适限流电阻,PWM 信号通过 MOSFET 调光,实现无级亮度调节。
四、系统硬件接线总表
| 模块 | 引脚 | STM32 端 | 备注 |
|---|---|---|---|
| LU-ASR01 | VCC/GND/TXD/RXD | 3.3V/GND/PA2/PA3 | UART2 |
| TCRT5000 | VCC/GND/OUT | 3.3V/GND/PA4 | 数字输入 |
| GL5528 | 分压输出 | PA5(ADC1_IN5) | 模拟输入 |
| OLED12864 | VCC/GND/SCL/SDA | 3.3V/GND/PB8/PB9 | I2C1 |
| ESP8266 | VCC/GND/TXD/RXD | 3.3V/GND/PA9/PA10 | UART1 |
| LED 驱动 | PWM | PB0 | TIM3_CH3 |
| 蜂鸣器 | I/O | PB1 | NPN 驱动 |
| 按键 | I/O | PB10/PB11 | 模式切换/手动开关 |
五、软件设计
5.1 主程序流程
int main(void)
{
SystemInit();
GPIO_Init();
ADC1_Init();
PWM_Init(1000); // 1kHz PWM 调光
UART1_Init(115200); // ESP8266
UART2_Init(9600); // LU-ASR01
OLED_Init();
Key_Init();
Beep_Init();
Load_State_From_Flash();
ESP8266_Connect_Wifi();
ESP8266_Connect_MQTT();
while (1)
{
// 1. 读取传感器
light_adc = ADC_Read_Average(ADC_Channel_5, 10);
presence = TCRT5000_Read(); // 0=有人, 1=无人
voice_cmd = LU_ASR01_GetCommand(); // 阻塞接收
// 2. 语音指令优先级最高
if (voice_cmd != CMD_NONE)
{
Handle_Voice_Cmd(voice_cmd);
}
// 3. 自动模式逻辑
if (work_mode == AUTO)
{
if (presence == 0 && light_adc < LIGHT_DARK_THRESHOLD)
{
LED_SetBrightness(80);
led_state = ON;
}
else if (presence == 1) // 离开
{
LED_SetBrightness(0);
led_state = OFF;
}
else if (light_adc > LIGHT_BRIGHT_THRESHOLD)
{
LED_SetBrightness(0);
led_state = OFF;
}
}
// 4. OLED 显示
OLED_ShowStatus(work_mode, led_state, brightness);
// 5. ESP8266 周期上报
if (Report_Timer_Is_Up())
{
MQTT_Publish_Status(work_mode, led_state, brightness);
}
Delay_Ms(100);
}
}
5.2 语音指令解析
typedef enum {
CMD_NONE,
CMD_LIGHT_ON,
CMD_LIGHT_OFF,
CMD_BRIGHT_UP,
CMD_BRIGHT_DOWN,
CMD_AUTO_MODE,
CMD_MANUAL_MODE
} VoiceCmd;
void Handle_Voice_Cmd(VoiceCmd cmd)
{
switch (cmd)
{
case CMD_LIGHT_ON:
work_mode = MANUAL; led_state = ON;
LED_SetBrightness(80);
break;
case CMD_LIGHT_OFF:
work_mode = MANUAL; led_state = OFF;
LED_SetBrightness(0);
break;
case CMD_BRIGHT_UP:
brightness += 20;
if (brightness > 100) brightness = 100;
LED_SetBrightness(brightness);
break;
case CMD_BRIGHT_DOWN:
brightness -= 20;
if (brightness < 0) brightness = 0;
LED_SetBrightness(brightness);
break;
case CMD_AUTO_MODE:
work_mode = AUTO;
break;
case CMD_MANUAL_MODE:
work_mode = MANUAL;
break;
}
Beep_On(); Delay_Ms(80); Beep_Off(); // 提示音
}
5.3 PWM 调光
void LED_SetBrightness(uint8_t percent)
{
if (percent > 100) percent = 100;
uint16_t pulse = (uint16_t)(percent * 10); // ARR=1000
TIM_SetCompare3(TIM3, pulse);
}
5.4 ESP8266 上报
void MQTT_Publish_Status(uint8_t mode, uint8_t state, uint8_t brt)
{
char json[128];
sprintf(json,
"{\"mode\":%u,\"state\":%u,\"brt\":%u}",
mode, state, brt);
UART1_SendString("AT+MQTTPUB=0,\"lamp/state\",1,\"");
UART1_SendString(json);
UART1_SendString("\",0,0\r\n");
Delay_Ms(200);
}
六、系统测试
6.1 语音识别测试
在 3 米安静环境下,对 LU-ASR01 说"开灯/关灯/调亮/调暗/自动模式/手动模式"六条口令,每条重复 20 次,识别准确率 ≥95%。在播放背景音乐 60dB 环境下测试,准确率仍保持在 90% 以上。
6.2 人体感应测试
坐下/离开座位切换,TCRT5000 输出电平翻转稳定,无误触发。1m 距离桌面反射强度足以触发感应,0.5m 内仍稳定工作。
6.3 光感联动测试
用可调光源模拟白天→傍晚→夜晚三档亮度:白天强光下灯不会自动开启,傍晚暗光下坐下时灯自动开启,夜晚坐稳后维持当前亮度,离开 5s 自动关闭。
6.4 PWM 调光测试
PWM 占空比 0%、20%、50%、80%、100% 五档,分别用照度计测量台灯出光面亮度。占空比与亮度呈良好线性,调光过程无频闪(1kHz 远超人眼可感知范围)。
6.5 APP 通信测试
手机 APP 与 ESP8266 模块连接同一 MQTT broker,APP 端实时显示台灯状态,发送"开/关/调亮/调暗"指令,1s 内台灯响应。连续 24h 推送无掉线。
6.6 整机联动测试
模拟真实学习场景:白天进书房坐下台灯亮,APP 推送"台灯已自动开启";说"调暗一点",台灯亮度降一档;离开 5s 后台灯自动关闭,APP 推送"台灯已关闭"。
八、总结
本文基于 STM32F103C8T6 主控,结合 LU-ASR01 离线语音、TCRT5000 人体感应、GL5528 光敏电阻、OLED 显示和 ESP8266 通信模块,给出了一套覆盖"语音+自动+远程"三种控制方式的智能台灯完整方案。系统支持"开灯/关灯/调亮/调暗"等本地语音口令、有人+光暗的自动感应逻辑、APP 端远程查看与控制,三条主线相互补充,既满足了用户即时交互的需求,也兼顾了无人值守场景下的自动节能。整套设计在硬件选型上注重低功耗与高性价比,在软件结构上保持模块化和可扩展,适合桌面学习、阅读办公、儿童房等场景落地。后续可在现有基础上接入语音合成(离线 TTS)、触摸按键、久坐提醒等功能,进一步提升产品的智能化与场景贴合度。