# 远程开门禁 **Repository Path**: wangwangliqaq/remote-door-opening-prohibited ## Basic Information - **Project Name**: 远程开门禁 - **Description**: No description available - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-14 - **Last Updated**: 2026-06-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ESP32 中文语音门禁控制系统 基于 ESP32-S3 + INMP441 麦克风的离线中文语音门禁控制系统。说唤醒词 **"Hi ESP"** 唤醒后,说出 **"打开门"** / **"关闭门"** 即可控制门禁;同时支持 WiFi 信号跳变、门信号脉冲模式两种外部触发方式。 完全离线运行(WakeNet + MultiNet 本地推理),无需联网,响应迅速,适合门禁、智能家居等场景。 > 本项目从 Espressif 官方 [esp-skainet](https://github.com/espressif/esp-skainet) 的 `cn_speech_commands_recognition` 例程独立化而来,并新增了 INMP441 麦克风板级支持、门禁控制与 RGB 状态指示。 --- ## ✨ 功能特性 - 🎙️ **离线中文语音识别**:WakeNet9 唤醒词("Hi ESP")+ MultiNet7 中文命令词 - 🚪 **语音控制门禁**:"打开门" 触发光耦脉冲开门,"关闭门" 断开光耦 - 📡 **多触发源开门**: - 语音命令(GPIO 输出光耦脉冲) - WiFi 信号跳变(GPIO20 双边沿中断) - 门信号模式识别(GPIO47,"两短一长"脉冲序列) - 💡 **RGB LED 状态指示**:唤醒时亮绿色,识别完成/超时熄灭 - 🔧 **可定制**:命令词、GPIO 引脚、脉冲时长均可通过修改源码调整 --- ## 🧠 工作原理 ``` ┌─────────────────────────────────────────────┐ │ ESP32-S3 (本项目) │ INMP441 麦克风 ──┤ I2S(13/12/14) │ │ │ │ │ ▼ │ │ AFE (VAD + AEC) ──► WakeNet "Hi ESP" │ │ │ 唤醒 │ │ ▼ │ │ MultiNet 命令词识别 │ │ "da kai men" / "guan bi men" │ │ │ │ WS2812 LED ◄───┤ GPIO48 (状态指示) │ │ 光耦/门禁 ◄────┤ GPIO1 (开门脉冲) ◄──────┘ │ WiFi 信号 ────►┤ GPIO20 (跳变触发开门) │ 门信号线 ────►┤ GPIO47 (两短一长模式触发开门) │ └─────────────────────────────────────────────┘ ``` **语音流程**:上电 → 持续监听唤醒词 → 识别到 "Hi ESP" 后 LED 变绿 → 进入命令识别窗口 → 听到 "打开门"/"关闭门" → 执行动作 → LED 熄灭 → 回到监听。 --- ## 🧰 硬件清单 | 模块 | 说明 | 备注 | |------|------|------| | ESP32-S3 开发板 | 带 **八线 PSRAM**,推荐 N16R8(16MB Flash + 8MB PSRAM) | ⚠️ 必须八线 PSRAM,四线板会启动失败 | | INMP441 | I2S 数字 MEMS 麦克风模块 | 3.3V 供电 | | WS2812 RGB LED | 状态指示 | 可用板载 LED | | 光耦 + 驱动电路 | 例如 PC817 / EL817,隔离控制门禁/电磁锁 | 接 GPIO1 | | (可选)信号源 | WiFi 模块输出的电平信号、门禁反馈信号线 | 接 GPIO20 / GPIO47 | ### 📌 GPIO 引脚分配 | GPIO | 功能 | 方向 | 连接 | |:----:|------|:----:|------| | 13 | I2S_SCLK | 输入 | INMP441 SCK | | 12 | I2S_LRCK (WS) | 输入 | INMP441 WS | | 14 | I2S_SDIN | 输入 | INMP441 SD | | 48 | WS2812 数据 | 输出 | RGB LED DIN | | 1 | 门控光耦输出 | 输出 | 光耦 LED 正极(经限流电阻) | | 20 | WiFi 信号输入 | 输入 | 外部 WiFi 模块信号 | | 47 | 门信号模式输入 | 输入 | 门禁/按键信号线 | > 引脚定义集中在以下文件,如需改引脚直接修改: > - 麦克风:`components/hardware_driver/boards/include/esp32_s3_inmp441_board.h` > - 门控/信号:`main/include/door_control.h` > - RGB LED:`main/rgb_led.h` ### 🔌 INMP441 接线 ``` INMP441 ESP32-S3 ───────── ───────── VDD → 3.3V GND → GND SCK → GPIO13 WS → GPIO12 SD → GPIO14 L/R → GND(选右声道)或 3.3V(选左声道) ``` --- ## 🚀 快速开始 ### 1. 环境准备 需要 **ESP-IDF v5.0 或更高版本**(开发基于 v5.3.1)。安装参考 [ESP-IDF Getting Started](https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/get-started/)。 激活 ESP-IDF 环境后确认: ```bash idf.py --version ``` ### 2. 克隆并进入工程 ```bash git clone <你的仓库地址> esp32-voice-door-control cd esp32-voice-door-control ``` ### 3. 设置目标芯片 ```bash idf.py set-target esp32s3 ``` > 该命令会读取 `sdkconfig.defaults.esp32s3`,自动选中 INMP441 板级、HiESP 唤醒词、MultiNet7 中文命令词模型,并下载 `esp-sr`、`led_strip` 等依赖组件到 `managed_components/`。 ### 4. 编译与烧录 ```bash # 编译 idf.py build # 烧录并打开串口监视(替换 COMx 为你的串口) idf.py -p COMx flash monitor ``` 退出监视器:`Ctrl + ]` ### 5. 试试看 1. 上电后串口会打印门控状态(每秒一次) 2. 对着麦克风说 **"Hi ESP"**,LED 变绿表示唤醒成功 3. 紧接着说 **"打开门"**,GPIO1 输出 300ms 高电平脉冲(开门),然后 LED 熄灭 4. 唤醒后若 6 秒内未识别到命令,自动回到唤醒监听 --- ## 🗣️ 唤醒词与命令词 | 类型 | 内容 | 配置 | |------|------|------| | 唤醒词 | "Hi ESP" | `sdkconfig.defaults.esp32s3` → `CONFIG_SR_WN_WN9_HIESP=y` | | 命令词 1 | "打开门"(`da kai men`) | `main/main.c` 中 `esp_mn_commands_add(1, "da kai men")` | | 命令词 2 | "关闭门"(`guan bi men`) | `main/main.c` 中 `esp_mn_commands_add(2, "guan bi men")` | ### 修改命令词 命令词在 `main/main.c` 的 `detect_Task()` 中定义(使用拼音): ```c esp_mn_commands_clear(); esp_mn_commands_add(1, "da kai men"); // "打开门" esp_mn_commands_add(2, "guan bi men"); // "关闭门" // 可继续添加,例如: // esp_mn_commands_add(3, "kai deng"); // "开灯" esp_mn_commands_update(); ``` 命令识别后的动作在 `detect_Task()` 的 `ESP_MN_STATE_DETECTED` 分支中处理,根据 `command_id` 调用 `door_control_*()` 等函数。更详细的命令词语法(多音节、声调标注)参考 [ESP-SR 命令词识别文档](https://docs.espressif.com/projects/esp-sr/zh_CN/latest/esp32s3/speech_command_recognition/README.html)。 --- ## 📂 目录结构 ``` esp32-voice-door-control/ ├── CMakeLists.txt # 顶层工程配置 ├── partitions.csv # 分区表(factory 2MB + model 5MB) ├── sdkconfig.defaults.esp32s3 # ESP32-S3 默认配置(板级/模型/PSRAM) ├── dependencies.lock # 组件版本锁定(自动生成) │ ├── main/ # 业务代码 │ ├── main.c # 主程序:唤醒+命令识别流程 │ ├── door_control.c / .h # 门禁控制(光耦/信号/模式识别) │ ├── rgb_led.c / .h # WS2812 状态指示 │ ├── speech_commands_action.c / .h # 提示音播放(可选) │ ├── idf_component.yml # main 组件依赖(esp-sr, led_strip) │ └── include/ # 命令词提示音数据(m_*.h 等) │ └── components/ └── hardware_driver/ # 硬件抽象层 ├── esp_board_init.c / .h # 板级 API 封装 ├── idf_component.yml # 依赖 esp_codec_dev ├── CMakeLists.txt ├── Kconfig.projbuild # INMP441 板级选项 ├── include/ │ └── esp_board_init.h └── boards/ ├── esp32s3-inmp441/ │ └── bsp_board.c # INMP441 I2S 驱动实现 └── include/ ├── bsp_board.h └── esp32_s3_inmp441_board.h # INMP441 引脚定义 ★ ``` --- ## ⚙️ 常用配置 ### 修改 INMP441 麦克风引脚 编辑 `components/hardware_driver/boards/include/esp32_s3_inmp441_board.h`: ```c #define GPIO_I2S_LRCK (GPIO_NUM_12) // WS #define GPIO_I2S_SCLK (GPIO_NUM_13) // SCK #define GPIO_I2S_SDIN (GPIO_NUM_14) // SD ``` ### 修改门控引脚与脉冲参数 编辑 `main/include/door_control.h`: ```c #define DOOR_CONTROL_GPIO 1 // 光耦输出引脚 #define DOOR_SIGNAL_INPUT_GPIO 47 // 门信号模式识别输入 #define WIFI_SIGNAL_INPUT_GPIO 20 // WiFi 信号输入 #define DOOR_PULSE_DURATION_MS 300 // 开门脉冲时长(ms) #define SHORT_PULSE_MAX_MS 300 // 短脉冲上限(ms) #define LONG_PULSE_MIN_MS 600 // 长脉冲下限(ms) #define PATTERN_TIMEOUT_MS 2000 // 模式识别整体超时(ms) ``` ### 切换语音模型 在 `sdkconfig.defaults.esp32s3` 修改后执行 `idf.py reconfigure`: ```bash # 唤醒词模型(任选其一) CONFIG_SR_WN_WN9_HIESP=y # "Hi ESP"(默认) # CONFIG_SR_WN_WN9_ALEXAY=y # "Alexa, play music" # CONFIG_SR_WN_WN7_NIHAOXIAOZHI=y # "你好小智" # 命令词模型 CONFIG_SR_MN_CN_MULTINET7_QUANT=y # 中文 MultiNet7(默认) ``` 更多模型选项见 ESP-IDF menuconfig → `ESP Speech Recognition`。 --- ## 🔧 故障排除 | 现象 | 可能原因与解决 | |------|---------------| | 启动后反复重启 / PSRAM 报错 | 开发板不是**八线 PSRAM**。确认模组型号(如 N16R8),或改 `CONFIG_SPIRAM_MODE_QUAD` | | 编译报 `esp-sr` 找不到 | 执行 `idf.py reconfigure` 重新下载 managed components;检查网络 | | 唤醒不灵敏 | 检查 INMP441 接线(尤其 L/R 引脚);调近麦克风;环境噪声过大 | | 识别到唤醒但命令无反应 | 命令窗口约 6 秒,需在唤醒后尽快说命令;拼音命令需清晰 | | `CONFIG_ESP_DEFAULT_CPU_FREQ_MHS_240` 类警告 | Kconfig 符号拼写问题,改 `MHZ`(本仓库已修正) | | GPIO 冲突 | 确认 GPIO1/20/47 未被板载外设占用;GPIO47 在部分 S3 模组是安全引脚 | 清理重建: ```bash idf.py fullclean idf.py reconfigure idf.py build ``` --- ## 📄 许可证 本项目基于 [Apache License 2.0](./LICENSE) 开源。 - 上游代码(`hardware_driver`、`speech_commands_action` 等)版权归 Espressif Systems (Shanghai) Co. Ltd. 所有 - 新增的 INMP441 板级支持、门禁控制(`door_control`)、RGB LED(`rgb_led`)代码同样以 Apache-2.0 发布,可在协议允许范围内自由使用与修改 ## 🙏 致谢 - [Espressif esp-skainet](https://github.com/espressif/esp-skainet) —— 提供 ESP-SR 语音识别框架与 `cn_speech_commands_recognition` 参考例程 - [ESP-SR 文档](https://docs.espressif.com/projects/esp-sr/zh_CN/latest/esp32s3/index.html) —— WakeNet / MultiNet 技术细节