一、项目描述
随着物联网技术的飞速发展,智能家居设备逐渐融入人们的日常生活,语音交互作为一种自然、便捷的人机交互方式,在智能照明领域得到了广泛应用。 M-design 创意设计竞赛包含五大方向,其中方向一智能家居中包含有智能照明类别,本项目是基于ESP32S3语音识别的智能控制照明系统,使用者通过解放双手,仅需通过简单的语音指令即可实现对LED灯的开关控制功能,另外系统配有光敏传感器,通过感知环境光的强度来实现智能照明,极大地提升了用户体验。
二、设计思路
系统使用的微处理器ESP32S3,搭载双核32位Xtensa LX7处理器,主频达240MHz,集成Wi-Fi/蓝牙双模模块,其最大优势在于内置8MB PSRAM和8MB Flash,可满足复杂语音处理任务的内存需求。音频输入推荐使用I2S接口外接MEMS麦克风阵列(如INMP441),采样率建议设置为16kHz以平衡精度与计算负载。

光敏传感器也是该项目重要元件之一,它是一种对外界光信号或光辐射具有响应或转换功能的敏感装置,属于传感器中的光敏元件类别。内部原理是感光元件:CdS 硫化镉光敏电阻 LDR,光照越强→阻值越小;无光→阻值 MΩ 级。分压电路:光敏电阻 + 固定电阻分压AO输出分压电压。

引脚 | 全称 | 作用 | 接线 |
|---|---|---|---|
VCC | 电源 | 3.3V/5V 供电 | 开发板 3.3V/5V |
GND | 地 | 电源负极 | 开发板 GND |
AO | 模拟输出 | 电压随光照连续变化,强光电压低、暗光电压高,接 ADC 测亮度数值 | MCU 模拟口 (A0) |
DO | 数字输出 | 高低电平开关,光线低于阈值 = 高电平,高于阈值 = 低电平,只判断亮 / 暗 | MCU 普通 GPIO |
另外系统使用硬件还包括光敏传感器、数字麦克风、功放模块及喇叭、LED灯,另外配有面包板及若干跳线。软件使用乐鑫的IDF进行设计开发及调试,使用乐鑫的esp-sr进行语音识别,根据配置的命令词来完成LED灯的开关控制,同时更加环境光的强弱,也能自动的进行灯的开和关。
下面是整个系统的连接示意图,包含管脚数字

三、软件部分
下面是项目的软件流程图。系统初始化后,监测麦克风,如果有识别到对应命令词,则执行对应的开关灯动作。同时光敏传感器也可以控制灯的开关操作。

下面列举部分重要的代码进行简单介绍。首先是初始化I2S端口,然后进行语音模型的读取及命令词的设置,这里设置了三个命令,分别对应开灯、关灯、拜拜。
// 如果成功加载了multinet模型,添加自定义唤醒词
if (model_data)
{
// 初始化命令系统
esp_mn_commands_alloc(multinet, model_data);
// 清除现有命令并添加自定义唤醒词(使用拼音+空格的方式)
esp_mn_commands_clear();
esp_mn_commands_add(1, "kai deng");
esp_mn_commands_add(2, "guan deng");
esp_mn_commands_add(3, "bai bai");
esp_mn_commands_update();
// 打印添加的唤醒词
esp_mn_active_commands_print();
}
以下是语音控制逻辑,用户通过语音控制LED灯的开关,当用户说开灯后,自动控制打开LED,反之当用户说关灯后,系统自动完成关灯动作。
esp_mn_results_t *mn_result = multinet->get_results(model_data);
if (mn_result != NULL && mn_result->num > 0)
{
int command_id = mn_result->phrase_id[0];
printf("检测到拼音唤醒词 ID: %d\n", command_id);
if (command_id == 0)
{
printf("执行命令: 0\n");
led_turn_on();
size_t bytes_written = 0;
i2s_write(I2S_OUT_PORT, (uint8_t*)dao, dao_len, &bytes_written, portMAX_DELAY);
}
else if (command_id == 1)
{
printf("执行命令:1\n");
led_turn_off();
size_t bytes_written = 0;
i2s_write(I2S_OUT_PORT, (uint8_t*)dao, dao_len, &bytes_written, portMAX_DELAY);
// 在这里添加您的处理逻辑 15010815122
}
else if (command_id == 2)
{
printf("执行命令:2\n");
// 在这里添加您的处理逻辑
}
}
下面是光敏传感器执行部分代码,通过接收到的光的强弱来控制灯光的打开和关闭。
gpio_config_t config = {
.pin_bit_mask = 1ULL << LIGHT_SENSOR_PIN,
.mode = GPIO_MODE_INPUT,
.pull_up_en = GPIO_PULLUP_DISABLE,
.pull_down_en = GPIO_PULLDOWN_DISABLE,
.intr_type = GPIO_INTR_DISABLE,
};
gpio_config(&config);
while (1)
{
// 直接读取引脚电平:0 或 1
int level = gpio_get_level(LIGHT_SENSOR_PIN);
if (level == 0) {
ESP_LOGI(TAG, "电平:%d → 低电平(无遮挡)", level);
led_turn_off();
} else {
led_turn_on();
ESP_LOGI(TAG, "电平:%d → 高电平(有遮挡)", level);
}
vTaskDelay(5000 / portTICK_PERIOD_MS);
}
四、系统展示
下图为实物展示图。左侧是喇叭接在一个功放模块,左上对应的是数字麦克风,用于接收语音指令,左下部分是一个发光二极管,中间的MCU是整个系统的核心ESP32-S3,最右侧的面包板上面接入的是光敏传感器。当系统接收到开灯的语音指令或者光敏电阻感受到光线较弱的时候,发光二极管会亮起,反之灯灭。

五、心得体会
通过本次活动,加深了对乐鑫IDF的使用,了解了语音的输入和输出的编程,为后期应用到实际项目中积累了宝贵的经验。不足之处就是现在系统的语音控制和传感器控制是相互独立,会相互影响,后续要加强两者的联合控制,似的项目更好的应用于实际生活中。