2026寒假练 - 用Seeed XIAO ESP32S3 Sense实现智能门禁与报警系统
该项目使用了Seeed XIAO ESP32S3 Sense,实现了智能门禁与报警系统的设计,它的主要功能为:检测有人靠近后自动唤醒系统,进入身份验证流程;人脸识别通过时,显示“验证通过”;开门时的氛围灯效果;使用网页,用于开门记录查询、阈值设置与远程布防,与识别失败日志。
标签
嵌入式系统
Flying费
更新2026-03-24
424

用Seeed XIAO ESP32S3 Sense实现智能门禁与报警系统项目报告

一、 项目介绍

本项目基于电子森林2026年第6届“寒假在家一起练”活动的要求,选择并完成了“智能门禁系统”的开发任务。任务的核心目标是利用微控制器与边缘 AI 平台,构建一个具备离线人脸识别能力的智能门禁原型。 具体任务要求如下:

  1. 基础 AI 识别:训练支持人脸比对的轻量化模型,至少存储 3 个用户数据。
  2. 低功耗休眠:默认处于休眠状态,关闭人脸识别、LED 与 OLED 屏幕。
  3. 雷达唤醒与补光:超声波检测有人靠近自动唤醒,三色 LED 亮起黄灯,OLED 显示“正在采集”并启动摄像头。
  4. 验证开门与自动落锁:识别通过后,LED 变绿,驱动伺服电机开锁,OLED 显示“验证通过”并提供天气信息和问候语;检测无人后 10 秒内关门并休眠。
  5. 超时拦截机制:1分钟内(可自定义)未通过验证,则退出识别,LED 变红,屏幕显示“识别失败”,随后休眠。
  6. 附加要求 1(已完成):设计开门时的氛围灯效果。
  7. 附加要求 2(已完成):使用网页进行远程布防、日志查询与状态监控等功能。
  8. 附加要求 3(已完成):自行设计 3D 打印门禁面板外壳结构,并完成装配。


屏幕截图 2026-03-11 232918.png

【智能门禁系统实物成品图】


二、 项目介绍

本项目是一款深度融合了边缘计算(Edge AI)、物联网(IoT)云端协同以及 3D 打印工业设计的智能门禁系统原型。项目以 XIAO ESP32-S3 Sense 为主控核心,结合 Edge Impulse 平台训练的轻量化人脸识别模型,成功在受限的微控制器资源上实现了快速反应的离线身份验证。

系统的核心亮点在于“端-边-云”的高效协同:

  • 在设备端:图像捕获与人脸识别推理在 ESP32-S3 本地离线运行,保障了弱网环境下的基本可用性与数据隐私。为了解决多任务同时运行导致的内存碎片问题,程序在底层调整了 DMA 内存的分配顺序。
  • 在云端交互:通过 MQTT 协议将开门日志、设备状态与 Web 控制台进行同步。同时,系统接入了和风天气(QWeather)API,在单片机上实现了 GZIP 数据的解压,用于获取实时的天气情况和灾害预警。
  • 在交互与结构上:设计了适配 86 型底盒的 3D 打印外壳。在 0.96 寸的单色 OLED 屏幕上,通过优化 I2C 的刷新逻辑,实现了 200ms 间隔的预警画面闪烁提示(包括红色预警的黑白反转和橙色预警的底边闪烁)。


三、 硬件介绍

本项目秉承精简高效的硬件选型原则,主要涉及以下模块:

  1. XIAO ESP32-S3 Sense(核心主控与视觉输入):搭载双核 Xtensa LX7 处理器,具备强大的 AI 向量加速指令集。自带 OV3660 摄像头模块(负责 QVGA 图像采集)及数字麦克风,支持 WiFi 联网,是本项目的运算与网络中枢。
  2. HC-SR04 超声波传感器(低功耗探针):利用声波反射原理进行距离测算(精度达毫米级)。在本项目中负责实时监测 50cm 范围内的动态,实现近距离无感唤醒。
  3. SG90 伺服电机(机械执行器):接收 50Hz 的 PWM 信号,可精准控制转动角度。本项目中用于模拟真实门禁锁舌的伸缩(设定 65° 为闭锁,125° 为开锁)。
  4. SSD1306 OLED 显示屏(信息交互界面):0.96 寸 I2C 接口单色屏幕,功耗极低,负责向用户反馈系统当前状态(如“正在采集”、“欢迎xxx”、“拒绝访问”及倒计时数字)。
  5. WS2812B RGB 软灯带(光效与补光):内置控制 IC 的高亮全彩灯珠,单线(DATA 引脚)即可串行控制。项目中提供面部暖色补光、验证状态指示(红/白)以及开门时的自定义呼吸流光氛围。

以下是模块引脚与使用情况表:

硬件模块

引脚分配

功能描述

ESP32-S3 Sense

核心板

负责模型推理、无线网络连接、状态机逻辑调度。

OV3660 摄像头

内置 FPC

负责采集 QVGA 分辨率的图像数据。

HC-SR04 超声波

TRIG: D2, ECHO: D3

进行距离测算,实现近距离感应唤醒功能。

SG90 伺服电机

PWM: D1

接收不同占空比的 PWM 信号,控制锁舌转动角度。

SSD1306 OLED

I2C (SDA: D4, SCL: D5)

提供基础的可视化信息反馈。

WS2812B RGB带

DATA: D0

共10颗灯珠,提供辅助照明与不同状态下的灯光提示。


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

项目设计思路概括为:“本地计算核验结合云端数据同步”:

  1. 休眠与唤醒策略(省电设计):为控制能耗,系统默认状态处于 STATE_SLEEP 模式,切断屏幕与灯光。利用超声波传感器进行低频轮询,当探测到人员靠近时瞬间唤醒设备,并开启暖色灯光(RGB: 255, 200, 120)进行面部补光,辅助摄像头在暗光下获取清晰特征。
  2. 云边协同处理(架构设计):为避免网络延迟导致的门禁卡顿,人脸比对运算必须在本地完成。通过 Edge Impulse 将模型转换为 C++ 库固化在 Flash 中。验证成功或失败后,系统将结果(含用户名、置信度等)打包为 JSON,通过巴法云(Bemfa)异步推送到 Web 面板。
  3. 天气预警与屏幕刷新设计:门禁系统加入了天气与灾害预警的提示功能。通过解析天气 API 返回的数据,系统会过滤掉同类型的重复预警,最多保留 5 个最高级别的预警进行轮播(第一个预警显示 3 秒,后续每个显示 2 秒)。为了配合预警的闪烁效果,程序采用了 200ms 的独立屏幕刷新周期。
  4. 结构外壳设计(工业设计):为了避免器件与线束外露,自主设计了适配标准 86 型墙壁开关尺寸的三件套面板外壳,巧妙利用透明导光环柔化 WS2812 光线,将各传感器模块进行了极简的工业化集成。

mermaid-diagram-2026-03-11-162149.png

【系统方案框图】


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

1. 调试软件与编程语言

  • 下位机(ESP32-S3):使用 Arduino IDE 进行底层固件开发,编程语言为 C++。依赖库包括 esp_cameraPubSubClientESP32Servo 等。
  • AI 模型训练:使用 Edge Impulse Studio 云端平台,完成图像裁剪、灰度转换、特征提取及 TFLite 神经网络构建。
  • 上位机(云端看板):基于现代前端技术栈,使用 HTML5 / JavaScript / Vue 3 / Tailwind CSS 开发免部署的 Web 监控端。

2. 软件流程图(状态机逻辑)

系统底层逻辑采用严格的五阶有限状态机进行调度,确保程序非阻塞运行:

image.png

【系统逻辑流程状态机图】


3. 关键代码介绍

关键代码一:摄像头旧帧清除 在间歇性采集中,ESP32底层 DMA 常会吐出缓存中的旧照片,导致 AI 识别错乱。通过“Dummy Read”机制解决:

bool ei_camera_capture(uint32_t img_width, uint32_t img_height, uint8_t *out_buf) {
// 【关键】:先抓取一次旧帧并立即释放,清洗底层缓存
camera_fb_t *fb = esp_camera_fb_get();
if (fb) { esp_camera_fb_return(fb); }

// 再次抓取,确保获取到毫秒级的最新实时画面
fb = esp_camera_fb_get();
if (!fb) return false;
// ... 后续进行 RGB 转换与原位缩放
}

关键代码二:MQTT 日志上报与远程控制 设备在成功识别后,通过 PubSubClient 将信息构建为 JSON 格式并推送到巴法云,供 Web 端解析:

if(mqtt.connected()) {
// 动态拼接包含用户姓名和置信度的 JSON 字符串
String jsonLog = "{\"status\":\"passed\", \"user\":\"" + detectedUser + "\", \"confidence\":" + String(maxConfidence, 2) + "}";
mqtt.publish(MQTT_TOPIC, jsonLog.c_str());
}

关键代码三:防重名的天气定位与 GZIP 数据解压 和风天气 API 返回的数据是 GZIP 压缩格式,且国内部分区县存在重名现象。我们在 Web 控制台的 XML 数据字典中实现了“省-市-区”的三级联动,将具体的区县名和上级城市名一起下发给设备以防重名。设备端使用 ArduinoUZlib 库对 HTTP 返回的数据进行解压缩:

// 1. 拼接 URL 并加入 adm 参数防止重名
String geoUrl = "https://" + String(QWEATHER_HOST) + "/geo/v2/city/lookup?location=" + urlEncode(WEATHER_LOCATION);
if (WEATHER_ADM.length() > 0) {
geoUrl += "&adm=" + urlEncode(WEATHER_ADM); // 加上父级行政区划,如“沈阳”
}

// 2. GZIP 数据解压处理
String getDecompressedPayload(HTTPClient &http) {
String rawPayload = http.getString();
// 判断是否为 GZIP 格式 (1F 8B)
if (rawPayload.length() > 2 && (uint8_t)rawPayload[0] == 0x1F && (uint8_t)rawPayload[1] == 0x8B) {
uint8_t *outbuf = NULL; uint32_t outsize = 0;
ArduinoUZlib::decompress((uint8_t*)rawPayload.c_str(), rawPayload.length(), outbuf, outsize);
String decodedStr = ""; decodedStr.reserve(outsize);
for(uint32_t i = 0; i < outsize; i++) decodedStr += (char)outbuf[i];
free(outbuf); // 释放内存
return decodedStr;
}
return rawPayload;
}

关键代码四:天气预警去重与屏幕刷新逻辑 为了避免倒计时逻辑影响屏幕闪烁频率,程序使用了一个独立的 200ms 定时器来刷新屏幕。在解析天气预警时,程序最多获取 15 个预警,如果发现同类型的灾害预警,则只保留级别最高的一个,并根据危险等级进行排序,确保严重的预警优先显示:

// 1. 同类预警去重逻辑
for (int i = 0; i < activeWarningCount; i++) {
if (activeWarnings[i].name == newName) {
isDuplicate = true;
// 如果遇到同名预警,保留级别较高的那个
if (lvl > activeWarnings[i].level) {
activeWarnings[i].level = lvl;
}
break;
}
}

// 2. 独立的 200ms 屏幕刷新控制
if (currentMillis - lastUIRefresh >= 200) {
lastUIRefresh = currentMillis;
// 红色(4级)每 200ms 闪烁反转;橙色(3级)的底线每 400ms 闪烁
bool currentBlinkState = true;
if (currentWarningLevel == 3) currentBlinkState = (currentMillis % 800) < 400;
else if (currentWarningLevel == 4) currentBlinkState = (currentMillis % 400) < 200;

// OLED 渲染执行代码...
}

关键代码五:非阻塞倒计时 在开门状态下,为了保持流水灯效,引入了 lastCountdown 过滤机制:

unsigned long elapsed = currentMillis - doorOpenStartTime;
int countdown = 10 - (elapsed / 1000);

// 【核心机制】:仅当“秒数”发生实际变化时才刷新屏幕
if (countdown != lastCountdown) {
lastCountdown = countdown;
display.clear();
display.drawString(0, 5, "Welcome!");
display.drawString(0, 25, lastRecognizedUser); // 动态显示当前用户
display.drawString(0, 48, "Auto Close in: " + String(countdown) + "s");
display.display();
}


六、 功能展示图及说明

  1. 【休眠与唤醒抓拍】:超声波检测到人员靠近,外壳内的环形灯带发出暖黄色补光,OLED 提示“Scanning...”。
    image.png
    【设备唤醒时的暖光补光图】
  2. 【验证开门与流水灯效】:识别到预设的 Chris Evans 后,屏幕显示
    ----------------------------
    Good Morning, ☀ 18℃
    Chris Evans
    09:41 AQI:45 Lock: 10s
    ---------------------------
    同时,边缘亮起蓝色呼吸跑马灯效,舵机旋转,屏幕下方开始 10 秒倒计时进度条。
    image.png
    【验证通过并带有蓝色氛围灯的实物图】
  3. 【OLED 天气与预警看板】:屏幕右上角显示当前气温、AQI 指数和天气图标。当收到恶劣天气预警时,屏幕左上角会显示对应的提示动画:橙色预警会在文字下方显示闪烁的线条,红色预警则会使文字和底色每 200ms 反转一次。多个预警同时存在时会自动轮播显示。(详见实物展示视频)
  4. 【Web 控制看板与参数设置】:Web 页面使用纯前端代码编写,将 XML 行政区划数据直接嵌入到了 HTML 文件中,方便本地打开。页面提供了省市区三级联动的下拉菜单,用于设置设备的具体位置,右侧区域则实时显示设备的验证日志和下发的指令记录。
    image.png
    【Web 端截图】
  5. 【3D打印面板总成】:设计的 86 型三件套外壳(主面板、导光环、集成底座)。摄像头与超声波完美对位。
    image.png
    【3D结构件分解图】


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

在实际开发与软硬联调过程中,我们遇到了诸多意想不到的底层工程难题,最终通过严谨的排查一一攻克:

  1. AI 置信度“死机”与内存溢出问题
    • 现象:在初期的异步多线程方案中,识别置信度完全不变,似乎在反复识别同一张照片。
    • 解决:排查发现多线程导致了内存指针冲突,系统在循环读取同一块内存的陈旧特征。最终彻底舍弃多线程,回归 V28 版的纯线性单线程架构(拍照->缩放->推理->释放),彻底解决了死图和内存泄漏问题。
  2. Web 看板 MQTT 无法连接(校园网拦截)
    • 现象:前端网页一直报 connack timeout 或 WebSocket 连接失败。
    • 解决:通过查阅抓包与巴法云官方文档,发现 9503 端口极易被校园网/企业网的防火墙通过深度包检测(DPI)拦截。我们将测试网络切换为手机热点,同时将前端协议由严格的加密 wss 降级并替换为巴法云专属的 8083 ws 端口 (ws://wspro.bemfa.com:8083/),并强制指定 protocolVersion: 4 (MQTT 3.1.1),最终实现了网页的不掉线。
  3. MQTT 上传后 OLED 屏幕假死
    • 现象:在网络上报完成后的 10 秒倒计时期间,屏幕经常卡在 10s 不动,但后台仍在运行。
    • 解决:这是由于主循环中 OLED 刷新频率过高(原设 200ms),与刚完成 TCP 通信的底层硬件总线产生严重拥堵。改进方案是引入了秒级差异对比刷新算法(仅当倒计时秒数变化时才调用 display.clear()),倒计时画面恢复了顺滑。
  4. 摄像头内存分配失败问题
    • 现象:在增加了天气 API 请求功能后,ESP32-S3 频繁提示 Camera config failed,导致摄像头无法正常初始化。
    • 解决:检查发现,Arduino IDE直接复制项目文件后,不会同步“工具”选项卡里的版设置。需要手动重新启用PSRAM。
  5. 预警文字显示不全与重复提示问题
    • 现象:气象接口有时会对同一种灾害(如大风)发布不同级别的多个预警,导致屏幕频繁轮播重复信息。另外,屏幕左上角的预警文字上半部分会被切掉。
    • 解决:针对重复问题,在解析预警数据时增加了判断逻辑,如果存在同名的灾害类型,则只保留等级最高的一个,丢弃较低级别的预警。针对显示问题,排查后发现是 OLED 渲染时的 Y 轴坐标设置为了 -1,超出了显示区域。将其修改为 0 后显示恢复正常。同时,将橙色预警的提示方式由外侧画框改为了底部线条闪烁,使得界面排版更清晰。


八、 AI 模型训练与其他部分实现情况

1. 视觉 AI 模型(人脸识别)

1. 训练目标

构建一个能够精准区分授权用户(多分类)与非授权目标(陌生人/背景)的图像分类模型。能够在低光照、不同角度下实现极速推理,并作为门禁系统的“第一道锁”。

2. 素材收集与数据工程

  • 分类设计:系统设定了多个独立标签,包括授权用户(如 Rebecca, Chris, Zhang, Peng)以及极具关键性的负样本标签 Unknown
  • 收集方法
    • 正样本:首先收集了每个用户的几张真实生活照作为基础,然后使用 Nano banana 图像大模型进行不同表情、姿势、着装的扩展生成,随后再进行复杂环境的背景合成,从而获取高质量、多样化的目标人物头像。
    • 负样本 (Unknown):为了防止模型产生“幻觉”(将墙壁或陌生人强行识别为授权用户),我们大量采集了空背景、手掌遮挡、无关物品及未授权人员的照片。负样本数量占比达到总数据集的显著比例,极大提升了模型的安全性。

3. 脉冲设计与特征提取 (Impulse Design)

  • 分辨率压缩:为了适应 ESP32-S3 的算力,将输入图像统一 Resize 为 96 x 96(Fit shortest 模式)。
  • 色彩降维:在 Image 预处理模块中,强制将图像转为 Grayscale。灰度图的数据量仅为 RGB 的三分之一,不仅将推理速度提升了 3 倍,而且对于提取人脸轮廓特征而言已经完全足够。

4. 模型选择与训练策略

  • 模型架构:选择了轻量级的 MobileNetV1 96x96 0.25(Transfer Learning)。相较于目标检测,图像分类网络在极低分辨率下区分“具体是谁”的能力更强,且 0.25 版本的参数量极小,非常适合微控制器。
  • 训练参数:Epoch 设定为 120,Learning Rate 为 0.0005。
  • 数据增强 :强制开启。系统在训练时自动对图像进行随机缩放、旋转和裁切,使得几十张原始素材发挥了成百上千张的训练效果。
  • 量化与导出:最终模型采用 Int8 量化导出为 Arduino 库,大幅降低了 Flash 和 RAM 占用,并在最终的硬件上实现了稳定、高置信度(>80%)的推理。

image.png

【混淆矩阵数据图】


2.听觉 AI 模型(语音口令)

1. 训练目标

训练一个关键词唤醒模型,能够在一片嘈杂的背景音中,精准捕捉特定指令(如“Open”、“Close”),作为原定门禁系统的“第二道锁”。

2. 数据合成与硬件在环采集

在语音数据的采集中,采用了非常前沿的工业级做法:

  • 顶尖大模型合成:摒弃了传统的真人重复录音,采用了阿里云通义实验室开源的顶级语音模型 Qwen3-TTS (Voice Design 模式)。通过编写 Python 脚本,输入自然语言 Prompt(如“一个充满激情的男声”、“一个温柔的女声”),批量合成了包含不同性别、不同方言、不同情感的口令音频。
  • 语速数据增强:利用 pydub 库对合成音频进行了从 -21% 到 +21% 的 7 档语速/音调变异,极大丰富了样本的多样性。
  • RPA 自动化实录:如果直接上传干净的合成音频,模型在真实环境下会因为“麦克风底噪”而失效。因此,我们编写了基于 pyautogui 的自动化脚本,让电脑自动播放生成的音频,同时通过 ESP32-S3 板载的 I2S 麦克风进行实录。这种方法让训练数据完美包含了真实硬件的频响特征和环境回声。

3. 脉冲设计与特征提取

  • 音频切片:采用 1000ms 窗口和 500ms 滑动步长处理音频流。
  • 特征提取:选用了 Audio (MFE - Mel-filterbank energy)。相比于计算复杂的 MFCC,MFE 在单片机上运行速度更快,且对于简单的口令检测已经能提取出极具区分度的声谱图。

4. 模型选择与极高抗干扰训练

  • 模型架构:选择了专门处理时间序列的一维卷积神经网络(1D Conv / CNN)。
  • 抗干扰训练 (Data Augmentation)
    • 引入了长达数十分钟的日常噪音和无关谈话作为 Unknown / Noise 类别。
    • 在训练选项中,开启了 Add noise (High)Mask time bandsWarp time axis。这迫使神经网络在极度嘈杂、语速畸变的情况下依然能抓住目标词的核心发音特征。

5. 未实装说明

尽管语音模型在云端表现优异,但由于本次赛题的要求发生变更,明确聚焦于“基于人脸比对”以及“通过超声波测距唤醒”,为了避免偏题,同时也为了节省 ESP32 单片机极其宝贵的 Flash 和 RAM 资源,该语音模型最终并未合并到主程序中。

3. 默认休眠与节能设定

STATE_SLEEP 状态下,系统主动清空并关闭 OLED 屏幕显示,并向 WS2812 发送指令关闭所有灯珠。此时摄像头暂停图像获取,仅依赖超声波传感器进行定期的距离检测。

4. 雷达唤醒与补光采集

当超声波传感器检测到 50cm 范围内有物体靠近时,触发系统唤醒:

  • 补光辅助:三色 LED 切换为暖黄色调(RGB: 255, 200, 120),为面部提供柔和的光线补偿。
  • 界面提示:OLED 屏幕亮起,显示“Collecting... Face to Camera”。
  • 图像获取:底层调用接口获取最新的摄像头帧数据,准备送入模型进行特征提取与推理。

5. 识别防抖与自动关门逻辑

  • 防抖判定:程序中设置了 faceDetectionCount 变量,需连续 2 帧识别到同一用户且置信度达到 70% 及以上,才判定为验证通过。
  • 开门执行:验证通过后,OLED 屏幕显示对应的用户名(如 "Welcome Eddie Peng"),同时舵机转动至特定角度模拟解锁过程。
  • 延时关门:开门动作完成后,系统启动 10 秒的非阻塞倒计时。为避免频繁刷新造成 I2C 硬件通信堵塞,屏幕采取每秒刷新一次倒计时数字的策略,倒计时结束后自动控制舵机闭锁。

6. 超时与失败处理

系统在唤醒时记录时间戳 recognizingStartTime。若在 1 分钟(60000ms)内未能识别出符合要求的人脸(可以通过云端自定义时长),状态机将切换至 STATE_FAILED。此时 LED 灯带亮起红色,屏幕提示“Timeout Denied”,维持 3 秒后系统重新进入休眠状态。


九、 附加任务项实现说明

在完成基础验证功能之余,本项目也尝试实现了一些扩展功能:

附加项 1:开门氛围灯效与自定义颜色

在验证通过并保持开门的 10 秒倒计时期间,设计了一组流动呼吸灯效,作为通道开启状态的视觉指示。系统支持通过 Web 控制台的颜色选择器自定义 RGB 颜色参数。用户在网页端配置后,颜色数据会通过 MQTT 协议下发至设备,动态改变硬件上的开门氛围灯颜色。

附加项 2:Web 云端管理页面与气象接口定位

基于巴法云提供的设备接口,利用 Vue.js 和 Tailwind CSS 编写了一个简易的 HTML 静态控制页面。

  • 日志查看:设备会将验证结果(成功/失败原因、置信度等)以 JSON 格式上报云端,Web 页面可定时拉取并以列表形式展示最近的通信记录。
  • 远程操作:在 Web 页面点击“远程开门”按钮,可通过云端向设备下发指令。设备接收解析后,执行相应的舵机开锁与灯光响应。
  • 天气接口配置:页面集成了省、市、区三级联动的地址选择器。用户选择精确位置后,网页会将包含详细层级的地理位置参数(用于防重名)同步给设备,供其调用和风天气 API 获取准确的实时气象与灾害预警信息。

附加项 3:定制 86 型 3D 打印外壳

针对开发板与传感器散落不易展示的问题,设计了尺寸兼容 86 型底盒的 3D 打印结构件:

  1. 主面板:预留了摄像头、屏幕和超声波探头的开孔。
  2. 底座:内部设有用于固定 ESP32-S3 主板和超声波模块的位置,方便理线。
  3. 导光环:采用透明材料打印的环形垫件,放置于 LED 灯带前方,起到一定的柔光和漫反射作用。


十、 结构装配指南

本系统的物理外壳基于标准 86 型开关面板尺寸设计,整体划分为前面板(P-01)、导光环(P-02)及集成底座(P-03)三个主要 3D 打印部件。具体装配流程如下:

1. 前面板与显示组件预组装

  • 屏幕对位:首先将 0.96 寸 OLED 显示屏对准主前面板中央的矩形视窗放入,确认显示区域无遮挡后,使用热熔胶或硅胶在背部四角进行轻微固定。
  • 导光环嵌入:将使用透明或白色材料打印的导光环(P-02)压入前面板内侧预留的 3mm 嵌槽中。
  • 光源布置:裁剪适量长度(包含 3-4 颗灯珠)的 WS2812 柔性灯带,环绕粘贴于导光环正后方,确保发光面朝向前方透明结构,以实现光线的均匀漫反射。

2. 核心控制板与传感器就位

  • 超声波模块:将 HC-SR04 超声波模块的两个探头朝外,平稳推入集成底座(P-03)底部的专用限位挡板中。
  • 主板安装:将 ESP32-S3 Sense 主控板卡入底座内部的固定支架上。特别注意:安装过程中需为摄像头 FPC 排线预留出足够的 U 型弯折空间,避免硬件拉扯损坏。

3. 整机扣合与机电部署

  • 线缆引出:将伺服电机控制线(连接至门框真实机械结构)及外部电源线穿过底座背部的走线孔引出。
  • 内部理线:规整底盒内部的 OLED I2C 线束、灯带数据线与超声波信号线,确保线缆不会干涉摄像头排线及光学镜头。
  • 面板扣合:将组装好的前面板对准底盒,使摄像头镜头与超声波探头精准穿过面板预留的圆孔(摄像头孔位 Ø 7mm,超声波孔位 Ø 16.5mm)。
  • 最终固定:使用两颗标准 M4 螺丝穿过前面板两侧孔位,将整套装置稳固锁紧于墙面的 86 底盒内。系统复位后,即可配合舵机(65° 闭锁态 / 125° 开启态)进行联机测试。

十一、 心得体会

本次智能门禁系统的开发,是一次从底层硬件逻辑到云端全栈开发的完整洗礼。我深刻体会到了以下几点:

  1. 软硬协同的严谨性:在嵌入式系统中,一行错误的多线程代码或过高的 I2C 刷新率,都可能导致系统崩溃或假死。敬畏硬件资源的边界,采用极简的线性状态机往往是保证系统稳定运行的最佳实践。
  2. 工程联调的思维跃升:当遇到网页连不上云端的问题时,通过查看串口返回的错误码 rc=-2 并比对官方微信小程序原生 HTTP 接口的思路,让我学会了跳出代码本身,从“网络拓扑”和“端口防火墙”的角度去定位和解决系统级 Bug。
  3. 技术广度决定产品完成度:一个优秀的作品不应只停留在“能跑通代码”的层面。本次项目将 Edge Impulse 机器学习、ESP32 嵌入式 C++ 开发、Vue 3 前端页面构建以及 3D 打印工业设计结合在一起,让我真切感受到“全栈开发”在实现产品闭环时带来的巨大成就感。这次比赛不仅锻炼了我的技术能力,更塑造了我用工程手段解决实际问题的大局观。
软硬件
工具
附件下载
SmartAccess_V77.ino
C++代码
SmartAccessDashboard.html
云端控制网页代码
86面板.3mf
3D打印面板总成
All_Required_Libraries.zip
全部所需要的库文件
团队介绍
我自己一个人
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号