FastBond4挑战部分-集成语音与图像识别的智能AI台灯
该项目使用了ESP32S3,实现了AI智能台灯的设计,它的主要功能为:高显色照明、语音控制、人在检测、AI智能助手(智能问答、作业检查、知识点讲解)。
标签
ESP32S3
智能照明
大模型
语音问答
小小洋洋
更新2026-06-10
24
KiCad文件
全屏

一、项目主题与目标

所选主题:人工智能在嵌入式系统中的应用(图像识别、计算机视觉、自定义感知等)。
项目目标
本项目致力于开发一个基于ESP32S3平台的AI智能台灯助手。该台灯的核心功能包括高质量照明、无线开关、亮度与色温调节、语音识别与自动化控制,能够根据用户需求动态调整灯光及环境。通过集成语音识别、人体存在检测和云端图像识别技术,智能台灯不仅能提供适宜的学习与办公照明,还能智能化地检查作业、回答问题,实现全闭环控制。

核心功能:

  • 高质量、可调亮度与色温的台灯
  • 无线开关、自动感应亮灯
  • 语音控制:通过语音指令控制灯光和作业检查
  • 人体存在检测:自动开关灯,节省电力
  • 云端大模型支持:图像识别与问题解答
  • 无缝集成:麦克风、摄像头、喇叭与ESP32S3进行智能交互


二、硬件组成与介绍

image.png

核心模块:

  1. SEEED XIAO ESP32S3
    • 高性能低功耗模块,集成WiFi、蓝牙、摄像头接口和双路IIS音频支持。
    • 提供稳定的计算能力与无线通信能力,支持多任务调度。
  2. OV2640摄像头
    • 提供清晰的拍照功能,适用于桌面拍摄与图像识别。
    • 兼具低光环境下的图像质量优化。
  3. 数字麦克风与MAX98357
    • 高质量麦克风,用于语音输入和处理。
    • 配备MAX98357音频解码芯片,确保高质量的语音输出。
  4. 人体存在传感器(HLK LD2402)
    • 通过检测人体存在与否,自动开启或关闭台灯,提升用户体验并节能。
  5. 双路PWM灯光驱动
    • 支持精确调节台灯亮度和色温,满足不同使用场景需求。
  6. 服务端中继
    • 用于连接ESP32S3与腾讯云的TTS、ASR、大模型服务,处理语音识别、图像识别并返回结果。
    • 使用局域网中的开发板(如树莓派)作为中继,减少ESP32S3的处理负担。

其他硬件配置:

  • 无线控制端通过ESPNOW连接ESP32S3,可通过旋钮、按键进行控制(开关灯、调节色温、启用语音输入等)。
  • 实体按键与触摸按键实现基础控制,增强用户交互体验。


三、方案框图与设计思路

设计思路:
本系统通过ESP32S3与局域网内的服务端中继实现信息交互,整个系统架构包括:

  1. ESP32S3模块: 配置麦克风、摄像头、灯条、人体传感器、WiFi模块,通过无线控制与服务端通信。
  2. 服务端中继: 通过WebSocket连接,接收来自ESP32S3的语音与图像数据,处理后通过云端大模型实现语音识别与图像分析,返回文字结果。
  3. 无线控制端: 使用ESPNOW协议,通过旋钮、按键等物理控制方式,直接调节台灯的功能。
  4. 云端大模型: 利用腾讯云的TTS、ASR和AI大模型进行图像识别与问题解答。

技术框架:

  • 数据传输:WebSocket
  • 图像识别与语音分析:腾讯云TTS、ASR、大模型API
  • 系统控制:ESP32S3、服务端中继、ESP-NOW无线通信

image.png



四、原理图与PCB设计

  1. 原理图:只需要一个20-24V的输入,使用DC5525的接口接入。输入电源直接驱动灯带;用DC-DC稳压生成5V提供给ESP32、喇叭等。


image.png

  1. PCB设计:正面为ESP32的摄像头、稳压电路和LED驱动电路;背面为电源接口、LED灯带接线柱、人体传感器模块。注意:实际焊接中,需要在ESP32的5V和GND上,补充一个100uF以上的电解电容,防止喇叭高功率影响ESP32正常工作。


image.png

image.png

image.png

  1. PCB焊接:

image.png



五、软件设计与流程

开发环境:

  • 平台: 使用PlatformIO与Arduino框架进行开发
  • 编程语言: C/C++

软件流程图:

image.png
系统的主要流程从初始化开始,经过多个阶段,最终实现智能台灯的语音交互与环境感知功能。

  1. 系统初始化:
    在系统启动时,首先初始化各个硬件组件,包括台灯的灯光、按键、WiFi连接、WPM风扇、人体存在传感器、麦克风、MAX98357音频解码器、ESPNOW通信模块。
    在此阶段,系统将进行WiFi连接及服务器连接,用户可以选择跳过这些过程,直接进入普通的台灯功能。如果WiFi连接失败或成功,系统会通过屏幕或语音提供相应的提示。
  2. 多任务创建:
    初始化完成后,系统创建多个任务进行并行处理:
    • 温度控制: 通过读取ESP32的温度,控制WPM风扇的PWM信号进行降温。
    • 灯光控制: 根据需求,通过两路PWM信号调节台灯的亮度与色温,确保用户获得舒适的照明体验。
    • 传感器数据读取: 系统定期读取人体传感器、按键数据以及通过ESPNOW接收到的无线遥控器信号,并根据这些数据生成指令,触发相应的任务。
  3. 语音识别触发:
    • 语音激活: 用户可以通过按键、触摸或无线遥控器来启动语音输入功能。
    • 语音输入与处理: 麦克风监听用户的语音指令,声响增大时,系统启动语音识别功能,调用ASR模块将语音转换为文字。
    • 指令判断与处理: 系统根据识别出的文字判断是否为简单指令(如开关灯、调节亮度等)。对于更复杂的指令(如作业检查、图像识别等),系统将启动图像采集模块,拍摄用户指定的图像并上传至云端。
  4. 云端大模型处理:
    • 图像处理与问题解答: 云端大模型接收到图像数据后,进行图像识别,并处理可能存在的问题。云端返回文字描述,并通过TTS模块生成语音反馈给用户。
    • TTS播放: 语音反馈通过喇叭播放,完成一次完整的语音交互。
  5. 中继服务处理:
    部分语音识别与图像处理任务会在中继服务器中进行,用户可以修改中继服务器的参数,如选择不同的服务商、调整音色、语速和大模型的提示词,以实现不同的效果。

通过这些流程,系统能够完成从初始化到语音反馈的完整闭环,确保台灯不仅提供高质量的照明,还能够根据用户需求进行智能控制。


代码工程:

image.png


关键代码:

  1. main.cpp系统初始化与任务调度入口,包括外设初始化、Wi‑Fi/ WebSocket/ ESP‑NOW 启动、音频播放队列与主 AI 任务。
// 初始化espnow的命令队列
espnowCommandQueue = xQueueCreate(8, sizeof(uint8_t));
// 获取当前WiFi通道并初始化ESPNOW
uint8_t wifi_channel = skip_full_init ? 1 : WiFi.channel();
Serial.printf("[System] Using channel: %d\n", wifi_channel);
Serial.println("[System] Init ESPNOW");
// espnow_remote_init(wifi_channel);
espnow_remote_init(0); // ESP-NOW使用固定信道0,实际发送时会切换到当前WiFi信道进行发送
  1. camera_ov2640相机初始化、帧获取与图像缩放逻辑(RGB565 -> RGB 转换示例)。
void camera_init()
{
    camera_config_init();
    if (esp_camera_init(&config) != ESP_OK) { /* retry loop omitted */ }
    frameQueue = xQueueCreate(1, sizeof(camera_fb_t *));
    camera_sensor_config_init();
}


void resize_image(camera_fb_t *fb, rgb_t *output_image)
{
    uint16_t *input_buffer = (uint16_t *)fb->buf; // RGB565
    float x_ratio = (float)(CAMERA_WIDTH) / RESIZED_WIDTH;
    float y_ratio = (float)(CAMERA_WIDTH) / RESIZED_HEIGHT;
    // ... 转换并填充 output_image ...
}
  1. microphone_IIS_PDM使用 PDM/I2S 与定时器 ISR 实现 16kHz 音频采集、声音触发检测与缓冲管理。
void ARDUINO_ISR_ATTR microphone_isr_on_timer()
{
    portENTER_CRITICAL_ISR(&microphone_timer_mux);
    if (microphone_is_capturing)
    {
        microphone_pcm_buffer[microphone_pcm_index++] = i2s_read_pdm();
        if (microphone_pcm_index >= microphone_pcm_max_samples) {
            microphone_is_capturing = false;
            complete_recording = true;
        }
    }
    portEXIT_CRITICAL_ISR(&microphone_timer_mux);
}


int8_t microphoneCaptureTask()
{
    // 检测环境噪声并启动采集
    while (capture_timeout--) {
        sample = i2s_read_pdm()-SOUND_CENTER;
        if (abs(sample) > SOUND_THRESHOLD) { microphone_start_capture(); break; }
        vTaskDelay(pdMS_TO_TICKS(10));
    }
}
  1. audio_max98357使用 I2S 与定时器驱动 PCM 播放,维护播放状态机与缓冲索引。
void ARDUINO_ISR_ATTR on_audio_timer()
{
    portENTER_CRITICAL_ISR(&audio_timer_mux);
    if (audio_ctx.state == AUDIO_PLAYING && audio_ctx.data != NULL)
    {
        if (audio_ctx.current_pos >= audio_ctx.length) { audio_ctx.state = AUDIO_IDLE; timerStop(audio_timer); }
        else { int16_t sample = audio_ctx.data[audio_ctx.current_pos]; I2S_Audio.write((uint16_t)sample%256); I2S_Audio.write((uint16_t)sample/256); audio_ctx.current_pos++; }
    }
    portEXIT_CRITICAL_ISR(&audio_timer_mux);
}


uint8_t audio_max98357_play(const int16_t *audio_data, uint32_t length)
{
    // 设置 audio_ctx 并启动定时器
}
  1. hlk_ld2402_driver启动后台轮询任务,读取 HLK-LD2402 传感器数据并通过信号量通知使用者。
static void hlk2402_driver_poll_task(void *pvParameters)
{
    while (1)
    {
        hlk_ld2402_report_t report = {0};
        esp_err_t err = hlk_ld2402_read_report(&report, 1500);
        if (err != ESP_OK) { vTaskDelay(pdMS_TO_TICKS(500)); continue; }
        driver_last_state = report.target_state;
        if (driver_semaphore != NULL) xSemaphoreGive(driver_semaphore);
        vTaskDelay(pdMS_TO_TICKS(100));
    }
}


bool hlk_ld2402_driver_start(TaskHandle_t *task_handle)
{
    // 初始化并创建轮询任务
}
  1. websocket管理 WebSocket 连接,并提供发送图片与音频的封装函数;与 `websocketTask` 协同由任务通知触发发送。
void websocket_connect()
{
    webSocket.begin(websocket_host, websocket_port, websocket_path);
    webSocket.onEvent([](WStype_t type, uint8_t *payload, size_t length) { if (type == WStype_TEXT) Serial.printf("📩 Message from server: %s\n", payload); });
    webSocket.setReconnectInterval(5000);
}


uint8_t send_camera_image_with_name(String fileName)
{
    camera_fb_t *fb;
    esp_camera_fb_return(esp_camera_fb_get());
    fb = esp_camera_fb_get();
    if (!fb) return pdFALSE;
    webSocket.sendTXT(WEBSOCKET_PIC_INDEX + fileName);
    webSocket.sendBIN(fb->buf, fb->len);
    esp_camera_fb_return(fb);
    return pdTRUE;
}


六、功能展示

  1. 硬件组装展示:依次将XIAO ESP32S3、喇叭、MAX98257喇叭驱动、人体存在感应模块等连接到对应接口

image.png

  1. 灯条组装:铝型材长度为50cm,将1m长的高显色灯条剪成2条粘贴上去,使用3条导线将两个灯条连接。

image.png

  1. ESP-NOW 无线控制端:控制端使用SEEED XIAO ESP32C3模块,主要使用EC11编码传感器完成控制。

image.pngimage.png

  1. 照明展示:通电之后,会依次进行初始化,并有语音提示。同时开启照明。人走开后,过20s会自动关灯,人来自动开灯。

image.png

  1. 切换色温展示:通过触摸ESP32引出的触摸检测引脚、或无限控制端按下后旋转旋钮、或者语音中包含“切换色温”,即可进行色温切换。

image.pngimage.png

  1. AI功能展示:以低年级小朋友做算术题为示例场景,在高显色台灯下完成作业之后,唤醒AI台灯并说“帮我检查一下作业是否正确?”。AI台灯则依次进行拍照、上传、等待AI回复、语音播报,提示错误地方。提示词可以在云端代码中修改,配置成:家教助手、手工助手、拼豆助手、办公助手、老年人助手等多种模式。【具体效果可以查看视频】


七、设计挑战与解决方案

在项目设计过程中,我们遇到了以下几个挑战:

  1. 播放语音崩溃:
    在初始化和后续回答过程中,播放语音会崩溃重启。测试发现,一方面是喇叭功率高,导致ESP32电压下降,该问题通过在ESP32的5V增加一个100uF的电容可以解决。另外是播放声音依赖16kHz的定时中断,与其他任务一起的时候(尤其在初始化过程中的WiFi等),会导致喂狗失败,该问题可以在初始化播放提示音的时候,使用delay延时一段时间,让提示音播放完毕,再进行后续其他任务初始化。
  2. ESP-NOW频段设置:
    由于使用了WiFi和ESP-NOW,ESP-NOW的工作频段,需要与WiFi一致。初始化的时候,使用参数0,让初始化自动与WiFi频段一样。


八、心得体会与建议

心得体会:
本项目结合了人工智能与嵌入式系统的应用,推动了智能家居产品的创新。在开发过程中,我深刻感受到硬件与软件的紧密配合对于系统稳定性和性能的影响。

未来改进建议:

  • 在语音识别部分,可以优化本地处理能力,减少对云端服务的依赖,进一步提升响应速度。
  • 可以集成更多传感器,例如环境光传感器,根据环境光自动调节台灯亮度。
附件下载
AI-LIGHT-ESP32S3-master.zip
源代码(包含Sever端代码)
AI_LAMP_ESP32S3.zip
KICAD工程
团队介绍
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号