2026寒假练 - 基于人工智能硬件实验套件平台实现智能门禁与报警系统
本项目是一款融合了物联网(IoT)与边缘人工智能(Edge AI)的综合性安防终端。系统以 XIAO ESP32-S3 Sense 为主控核心,打破了传统门禁依赖云端服务器比对的延迟与隐私泄露痛点。
标签
嵌入式系统
2026寒假练
XIAO ESP32S3 SENSE
Xu Dachui
更新2026-03-24
53

一、 所选任务介绍

任务名称

智能门禁与报警系统


任务推荐使用模块:

- ESP32‑S3 Sense、SG90 360 度伺服电机、超声波传感器、OLED、RGB 灯带、蜂鸣器、三色 LED 模块。  

 

任务要求:  

1. 训练一个支持人脸比对的轻量化模型,至少应该存储3个用户的数据。人脸图像识别可使用Edge Impulse或其他平台训练相关模型。

2. 默认处于休眠状态,不启动人脸识别,LED与OLED屏幕全熄灭。

3. 超声波传感器检测有人靠近后自动唤醒系统,进入身份验证流程,此时设备现象至少应当出现,三色LED从全熄灭转为黄灯亮起,OLED屏幕显示“正在采集”,启动摄像头采集。

4. 当人脸识别通过时,三色LED变为绿色,驱动伺服电机旋转一定角度代表开锁,并在 OLED 显示“验证通过”;在超声波传感器检测到无人后,10秒内关门,系统进入休眠状态。

5. 若超声波传感器检测1分钟内均有人靠近,且在1分钟未通过一次验证,退出识别模式,三色 LED 变红,屏幕显示“识别失败”,经过一段时间后进入休眠模式。

6. 可选加分:设计开门时的氛围灯效果。

7. 可选加分:使用微信小程序或网页,用于用户管理、开门记录查询、阈值设置与远程布防,与识别失败日志。

8. 可选加分:可自行设计门禁面板或外壳结构(例如门框模型),需提交结构文件与装配说明。  

注:每完成一项加分项,在评审时会多加5分。


二、 项目介绍

本项目是一款融合了物联网(IoT)与边缘人工智能(Edge AI)的综合性安防终端。系统以 XIAO ESP32-S3 Sense 为主控核心,打破了传统门禁依赖云端服务器比对的延迟与隐私泄露痛点。通过在 Edge Impulse 平台上训练定制化的 MobileNet V2 神经网络,本项目成功将复杂的图像分类算法压缩部署至微型单片机本地运行。
同时,项目深度挖掘了 ESP32-S3 的双核异构算力与 FreeRTOS 实时操作系统潜力,将高负荷的“AI 推理运算”与低延迟的“硬件外设响应+Web服务器”分核处理,打造出了一个具备极速响应、高安全性且极具科技感的智能家居安防产品。


三、 硬件介绍

本项目围绕 Seeed Studio 的微型开发板构建,使用到的核心硬件包括:

  • XIAO ESP32-S3 Sense:项目主控。集成 2.4GHz WiFi,搭载 8MB PSRAM 满足神经网络显存需求,并板载 OV2640 摄像头模块。
  • HC-SR04 超声波传感器:作为系统第一道“视觉”,用于极低功耗下检测物体测距,触发系统唤醒。
  • SG90 360度伺服电机(舵机):作为门锁的物理执行机构,通过不同宽度的 PWM 脉冲控制开门与关门动作。
  • WS2812B 幻彩灯带:包含 10 颗全彩灯珠,作为加分项提供开锁成功的绚丽氛围视觉反馈。
  • 0.96寸 OLED 屏幕 (SSD1306):通过 I2C 协议连接,作为本地 UI 交互窗口,实时显示状态文本。
  • 离散三色 LED 与有源蜂鸣器:利用红色、绿色、黄色 LED 提供直观的安防状态指示,蜂鸣器提供报警音。
  • SD卡:用于数据(图片)采集。

image.png

四、 方案框图和项目设计思路介绍

1. 项目整体设计思路

本项目的架构设计遵循了“漏斗式能效管理”、“软硬资源极限压榨”与“全链路闭环安全”三大核心思路,确保系统在资源受限的微型单片机上不仅能跑起来,还能跑得稳定、安全。

  • 漏斗式多模态唤醒机制 (能效设计)
    考虑到门禁系统的 99% 时间处于待机状态,如果一直开启摄像头和跑 AI 算法,设备将严重发热并耗尽电源。因此系统采用“漏斗过滤”思想:
    • 最外层(广撒网,低功耗):只有超声波传感器和 Core 1 以极低的频率运行,消耗极小。
    • 中间层(聚焦,唤醒视觉):当超声波感知到距离缩小(<50cm),系统被“惊醒”,这才供电给 OLED 亮起屏幕,并在逻辑上释放信号量。
    • 最内层(全力输出,高功耗):处于沉睡状态的 Core 0 接到信号,瞬间拉满算力开启摄像头和 AI 模型,完成复杂的人脸特征比对,比对完成后立即关闭,回归最外层。
  • 双核异构下的时序切分 (性能设计)
    单片机上如果按顺序跑“测距->网页响应->抓图->算AI->开门”,系统会卡顿到无法使用。项目设计了一套基于 FreeRTOS 的“前后台双核并行机制”。Core 1 扮演“前台客服”,永远不被阻塞,只负责接听网页 HTTP 请求、亮灯和超声波心跳;Core 0 扮演“后台技工”,专门闷头跑沉重的图像推断。两者仅通过几个极其轻量的 volatile 状态变量“隔空喊话”。
  • 双重滤渣机制 (安防设计)
    为了防止“传感器偏见(Sensor Bias)”导致陌生人靠脸部模糊特征蒙混过关,模型训练端强制注入了大量名为 UNKNOWN(如手臂、空景、路人)的负样本。在鉴权输出端,不仅要求置信度分数跨越 70% 的高门槛,还执行一票否决制:即使模型对某画面的判断把握达到 99%,只要被归类为 UNKNOWN,系统将立即拒绝并报警,同时留痕于 Web 后台。



2. 软件架构框图说明

  • Core 1 (主控核):执行 loop() 循环。负责监听 Web 请求、检测超声波距离、刷新 OLED 显示、控制外设动作,并在符合条件时向 Core 0 发送 AI 推理指令。
  • Core 0 (算力核):运行基于 FreeRTOS 的 aiInferenceTask。接收到指令后,调用底层摄像机捕获图片、进行像素裁切缩放、喂入 TensorFlow Lite 解释器运算,并得出结果变量回调给主核。
    image.png

3. 状态机流转框图

本项目的所有业务逻辑高度浓缩在四个由超声波和 AI 推断共同驱动的状态机中。状态转移流向如下:

Mermaid Chart - Create complex, visual diagrams with text.-2026-03-07-033950.png

五、 调试软件及使用的编程语言、软件流程图及关键代码

  • 开发环境:Arduino IDE (基于 ESP32 v2.x 核心库)。
  • 编程语言:C / C++,网页前端使用 HTML + CSS + JavaScript。
  • 主要支持库U8g2 (OLED 中文驱动), FastLED & Adafruit_NeoPixel (灯带控制), ESP32Servo (硬件PWM舵机), Edge Impulse SDK (AI 模型运算)。

软件流程简述:

  1. 初始化阶段:启动双核、初始化 PSRAM 强制覆盖 AI 内存、解决摄像机与舵机定时器冲突、配置 WiFi 与 HTTP 路由。
  2. 状态机轮询
    • SLEEP:清空屏幕、关闭灯光,按 200ms 频率测距。
    • WAKING:抓取摄像头缓存 -> 模型推理 -> 置信度判断。若 > 70% 授权进入 UNLOCK;若超时 1 分钟进入 FAIL。
    • UNLOCK:执行极限引脚复用逻辑驱动开门与氛围灯,检测距离恢复 > 150cm 后倒计时 10s 复位。
    • FAIL:警报拦截,记录非法访问日志。

基础配置:

Arduino设置如下,这样能够确保内存足够大,且摄像头功能开启:

image.png
image.png

关键代码:

// ================= 主循环 (Core 1) =================
void loop() {
if (WiFi.status() == WL_CONNECTED) server.handleClient();


float dist = measureDistance();


// ================= 自动感应门模式 =================
if (!systemArmed) {
liveAiLog = "AI待机中 (已免密)";

if (dist > 0 && dist < distanceThreshold) {
if (!isDoorOpen) {
setDiscreteRGB(false, true, false);
showOLED("欢迎光临");

openDoor(); // 先开门
changeRGB(); // 开门时顺带播炫彩灯
}
personLeftTime = 0;
} else {
if (isDoorOpen) {
if (personLeftTime == 0) personLeftTime = millis();
if (millis() - personLeftTime > 5000) {
closeDoor();
setDiscreteRGB(false, false, false);
u8g2.clearBuffer(); u8g2.sendBuffer();
personLeftTime = 0;
}
}
}
delay(100);
return;
}


// ================= 安防验证模式 =================
switch (currentState) {
case STATE_SLEEP:
setDiscreteRGB(false, false, false); u8g2.clearBuffer(); u8g2.sendBuffer();
liveAiLog = "超声波雷达监控中...";

if (dist > 0 && dist < distanceThreshold) {
currentState = STATE_WAKING;
stateStartTime = millis();
setDiscreteRGB(false, false, true);
showOLED("正在核验");
ai_result_ready = false;
if (millis() > model_init_backoff_until) ai_task_busy = false;
}
delay(200);
break;


case STATE_WAKING:
if (millis() - stateStartTime > 60000) {
currentState = STATE_FAIL;
stateStartTime = millis();

addFailLog("报警: 陌生人驻留超1分钟!");
liveAiLog = "严重警告: 验证超时!";
setDiscreteRGB(true, false, false);
showOLED("识别超时");
alarmSound();
} else {
if (!ai_task_busy && !ai_result_ready && millis() > model_init_backoff_until) {
ai_task_busy = true;
}


if (ai_result_ready) {
liveAiLog = "画面解析: " + ai_best_label + " [" + String(ai_best_score * 100, 0) + "%]";


// 判断逻辑(加固大小写判断防止字符串问题)
if (ai_best_score > 0.70) {
if (ai_best_label != "UNKNOWN" && ai_best_label != "Unknown") {
currentState = STATE_UNLOCK;
addAccessLog(ai_best_label, ai_best_score);
setDiscreteRGB(false, true, false);
showOLED("验证通过");

openDoor(); // 转动舵机开门
changeRGB(); // ✨亮起炫彩流水灯,迎接用户

personLeftTime = 0;
} else {
addFailLog("拦截: 检测到未授权(UNKNOWN)");
}
}
ai_result_ready = false;
}
}
break;


case STATE_UNLOCK:
liveAiLog = "门锁已释放,准许通行...";
if (dist > distanceThreshold || dist > 150.0) {
if (personLeftTime == 0) personLeftTime = millis();
if (millis() - personLeftTime > 10000) {
closeDoor();
personLeftTime = 0;
currentState = STATE_SLEEP;
}
} else {
if (personLeftTime != 0) personLeftTime = 0;
}
break;


case STATE_FAIL:
if (millis() - stateStartTime > 5000) {
currentState = STATE_SLEEP;
}
break;
}
}

数据集获取:

参考资料:https://wiki.seeedstudio.com/cn/tinyml_course_Image_classification_project/
可直接用人脸图片或通过摄像头采集,摄像头采集代码在“附件->take_photos_command”中,采集如下:
image.png

为了提高准确率,最好建立Unknown标签。

具体的训练过程可见参考资料(https://wiki.seeedstudio.com/cn/tinyml_course_Image_classification_project/)和视频。

六、 功能展示图及说明


实物搭建图:图中展示了主板、超声波模块与多重灯光外设的布局,主板采用 D1-D10 进行安全管脚分配,有效避免了 I2C、UART 的通信冲突。

image.png

WechatIMG830.jpg

WechatIMG829.jpg

OLED 中文交互图:通过引入强大的 U8g2 库并内嵌文泉驿字体,一改默认库的英文字符与乱码问题,实现了美观绝对居中的中文人机交互界面。

image.png

双轨制日志 Web 控制台界面图:系统通过局域网提供了直观的管理大屏。截图清晰显示了动态更新的【授权放行日志】以及因误闯触发的【红色的拦截报警记录】,并可通过顶部大按钮一键实现“安防 / 感应门”双模式的远程布防切换。

七、 项目中遇到的难题及解决方法

在整个硬核集成的开发过程中,遭遇了诸多极具挑战性的技术壁垒,以下是主要难点及对策:

  1. 难题:多个硬件抢占底层定时器导致程序无限重启 (Core Dump)
    • 症状:引入 ESP32Servo 库与 esp_camera 库后,开机连接 WiFi 后立刻触发内核崩溃。
    • 排查与解决:通过阅读底层源码发现,摄像头采集初始化默认占用了单片机内置的 LEDC_CHANNEL_0LEDC_TIMER_0,这与舵机库的默认资源发生死锁碰撞。解决方案是在初始化阶段手动修改相机参数结构体:config.ledc_channel = LEDC_CHANNEL_7; config.ledc_timer = LEDC_TIMER_3;,强行将两者时钟分流,解决奔溃。
  2. 难题:前台 IO 阻塞导致网页与超声波严重卡顿
    • 症状:模型推理每次耗时近 1 秒,这段时间内无法响应测距,网页 AJAX 请求也陷入 Pending 死锁。
    • 排查与解决:借助 ESP32-S3 双核架构优势,引入 FreeRTOS 多线程技术。通过 xTaskCreatePinnedToCore 开启一个专门运行在 Core 0 的“死循环”线程进行画面捕获与神经网络计算,通过 volatile bool 作为通信信号量。解放出来的 Core 1 实现毫秒级的传感器与网络异步轮询。

八、 心得体会

在这个“基于边缘 AI 的智能门禁”项目中,我的认知完成了一次从“拼凑代码”向“统筹底层架构”的飞跃。

从硬件方面来看,在非常有限的 IO 引脚上外挂多个外设,让我深刻体会到了引脚复用和底层资源调度(PWM、I2C、RMT 通道)的重要性。比如舵机与 WS2812 在 D9 引脚的激烈争夺战,迫使我通过软件中极其精确的时间差和强制 GPIO 重定义,完成了一场不可思议的物理动作与灯光特效无缝切换的表演。

从软件算法来看,Edge Impulse 为微型设备开启了深度学习的大门。然而,数据的质量决定了模型的天花板。在测试初期遭遇 45% 的极低精度后,我意识到了“传感器偏见 (Sensor Bias)”与负样本的重要性。只有亲自用设备的摄像头采集了足够多的背景、遮挡物作为 UNKNOWN 标签,并在代码里设立强硬的逻辑卡控(必须得分高,且绝对不能是被归入 Unknown),才打造出了一个没有破绽的“数字保安”。

总体而言,将机械动作、射频测距、多核异步 RTOS 系统、现代前后端通信与最新的人工智能边缘推断整合于一块拇指大小的芯片上,极大地拓宽了我的工程视野。这是一次艰难但痛快淋漓的造物之旅。

附件下载
smart_door.zip
团队介绍
Xu Dachui
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号