基于 STM32 + LU-ASR01 的智能台灯

基于 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)、触摸按键、久坐提醒等功能,进一步提升产品的智能化与场景贴合度。

九、资料内容完整工程资料(原理图、PCB、代码、元件清单)

十、资料获取方式

相关推荐
en.en..1 小时前
Keil 文件管理避坑(基于 STM32F4 HAL 通用模板讲解)
单片机·嵌入式硬件
沐梯子1 小时前
MOSS-Transcribe-Diarize 和豆包语音识别哪个好?多人会议录音转写的准确率与说话人归属对比
人工智能·语音识别·xcode
女神下凡4 小时前
芯参谋(87):Linux 系统(SPI NOR)驱动开发指南
linux·运维·arm开发·驱动开发·嵌入式硬件·设计规范
起个网名真难~14 小时前
STM32F103_Bootloader_从零到UART升级成功_博客原稿
stm32·单片机·嵌入式硬件
二本咕咕-机械转码15 小时前
FreeRTOS深入解析(一)_链表与并发保护——哨兵循环链表、排序键游标、临界区与关调度
单片机·算法·链表
Zwawa16 小时前
串口命令如何从字符串长成协议:帧头、长度、校验和与状态机
c语言·单片机·嵌入式
小李不想当小白16 小时前
BKP备份寄存器与RTC实时时钟(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
Zw-awa18 小时前
串口命令如何从字符串长成协议:帧头、长度、校验和与状态机
stm32
La Pulga19 小时前
【FreeRTOS源码学习笔记】链表的实现
数据结构·笔记·stm32·mcu·链表·嵌入式·freertos