人脸识别红外测温项目演示
275.1人脸识别红外测温项目演示
本节展示成品效果、器件选购和通信协议,只打开了作为项目说明使用的
项目功能介绍.c,没有展示或编写 C 业务代码。该文件的内容是功能与协议清单,并非可编译源码;后续课程才开始逐项实现,因此本节不在标题下提前补入完整工程代码。下文只用课程归档源码核对演示原理和协议边界。
一、人脸识别红外测温门禁项目
1.1 功能演示
演示系统组合了 K210 人脸识别、STM32 主控、SU-03T 语音播报、GY-906 红外测温、OLED 显示、蜂鸣器和舵机门禁。演示流程如下:
- 人脸录入:按下复位键旁边的功能按键,STM32 向 K210 发送“开始录入”命令;摄像头检测到人脸后,K210 提取并保存特征,再回报录入成功。这里是“按复位键旁边的按键”,不是先按复位键。
- 人脸识别:再次把已录入的人脸置于摄像头视野内,K210 比对成功后把人脸编号发给 STM32,语音模块播报“人脸识别成功”。
- 门禁控制:归档源码并不是只要识别人脸就无条件开门,而是还要求当前温度低于 37 ℃。满足条件后,STM32 改变舵机 PWM 脉宽开门,并在约 7 秒后恢复原脉宽关门。
- 红外测温与显示:GY-906 测得的目标温度持续显示在 OLED 上。视频中把手放在传感器上方约 1 cm 时,读数约为 36 ℃。
- 高温报警:课程程序在温度大于 37 ℃时使蜂鸣器鸣响;温度回落后关闭蜂鸣器。
- 语音播报:视频中的提示音由 SU-03T 所接扬声器播放。该模块本身具备离线语音识别能力,但在本项目中主要被 STM32 当作“串口控制的语音提示模块”使用。
视频把手直接按住传感器来制造高读数,这只能作为报警功能演示,不能视为正确测温方法。MLX90614 测量的是视场内所有目标辐射形成的平均温度;目标过近、没有填满正确视场、外壳被手直接加热、目标发射率不同或传感器尚未达到热平衡,都会改变读数。普通 GY-906 模块也不应在未经标定和整机验证的情况下作为医疗体温计。
课程源码中的温度判断边界还需要注意:
| 温度条件 | 蜂鸣器 | 人脸识别后开门 |
|---|---|---|
temp > 37 | 开 | 不开 |
temp < 37 | 关 | 可以开 |
temp == 37 | 关 | 不开 |
这是因为程序分别使用了严格大于和严格小于,没有覆盖恰好等于 37 ℃的开门条件。实际产品通常还需要滞回、连续多次采样、异常值过滤和传感器故障判断,避免读数在阈值附近抖动时反复切换。
当前 K210 脚本把录入的人脸特征保存在 record_ftrs 运行内存列表中,没有写入 Flash 或文件。K210 复位、掉电或脚本重启后,已录入特征会丢失,需要重新录入;本演示不能等同于具有持久化用户库和安全防护的正式门禁产品。
1.2 器件购买
视频中的店铺、商品选项和价格只对应录课时页面。购买链接和套餐会变化,应以课程器件清单、实物图片、官方规格书及接口定义为准,不应只按搜索结果排名或历史价格下单。
1.2.1 K210
视频中的品牌名称应为 Sipeed,不是原稿转写的“speed speed”。课程使用的是带 K210 的 Sipeed M1 系列核心模块。M1 与 M1W 的主要区别如下:
| 型号 | K210 | Flash | 片上 SRAM | Wi-Fi |
|---|---|---|---|---|
| M1 | 有 | 16 MiB | 8 MiB | 无 |
| M1W | 有 | 16 MiB | 8 MiB | 有,集成 ESP8285 |
视频中讲师不确定 Wi-Fi 芯片是 ESP32 还是 ESP8266;Sipeed 官方资料明确给出的是 ESP8285。本项目的人脸识别与 STM32 串口通信不依赖 Wi-Fi,因此课程购买的是 M1;选择 M1W 也可以运行 K210 侧功能,但多出的无线资源并不是本项目必需项。
选购时应核对:
- 是单独核心模块、带底板的开发套件,还是包含摄像头、屏幕和线材的套装;
- 模块和底板版本是否与课程图片一致,摄像头接口及方向是否兼容;
- 是否已经焊好排针。核心模块周围器件密集,焊接时间过长、焊锡桥连或机械受力都可能损坏焊盘和附近元件;
- 是否需要 Type-C 数据线。视频所说的“选择 Type-C”是当时商品套餐中的配件选项,不代表 M1 核心模块本体带有 Type-C 插座;
- K210 固件、MaixPy IDE 和课程模型是否适配所购开发板及 Flash 布局。
若焊接经验不足,优先选择商家已焊接并测试好的模块/底板组合。不能只看“已焊排针”四个字,还要确认排针方向、间距和底板接口完全一致。
1.2.2 其他模块
舵机、GY-906 红外温度传感器和 OLED 已在前面的单元课程中使用,本节主要补充 SU-03T 语音模块及其配件的选购。仍应核对舵机供电能力、OLED I²C 地址、GY-906 供电与上拉电压,并确保所有通信模块与 STM32 共地。
1.2.2.1 语音模块
课程使用 机芯智能 SU-03T 离线语音模块。套装可能包含模块、驻极体咪头、扬声器、电源线以及已焊接的转接板或排针。项目至少需要模块、扬声器和可靠的 5 V 电源;若只使用串口触发固定播报而不使用语音唤醒/识别,咪头不是播报链路的必需器件,但保留咪头便于后续测试模块的离线识别功能。
根据 SU-03T 官方规格:
- 模块一般使用 5 V 供电;带 4 Ω 扬声器并以最大音量工作时,电源能力应达到 500 mA 以上;
- 串口信号电平为 3.3 V,不能把“5 V 供电”误解为“UART 可直接接 5 V TTL”;
- B6 可复用为 UART1_RXD,B7 可复用为 UART1_TXD;本项目把 STM32 PB10/USART3_TX 接到 B6,只使用单向控制;
- 扬声器的两根线分别接
SPK+、SPK-,不要把其中一端误接到 GND;驻极体咪头接MIC+、MIC-,并按极性连接; - 官方资料列出了调试器、串口和脱机烧录等不同方式,它们使用的接口并不完全相同,不能把烧录口与项目运行时的业务串口混为一谈。
购买前应确认套餐里的扬声器阻抗/功率、咪头类型、电源线接口和是否已烧录课程固件。店铺名称、套餐价格及附件组合会变动,不能机械照搬视频中的“21 元”“27.5 元”等历史价格。
1.2.2.2 模块实物、焊接与配件
原稿把这一段识别成了“摄像头”,但视频实际上仍在展示 SU-03T 实物及其焊接、扬声器和咪头配件。
SU-03T 裸模块不是可直接插入普通 2.54 mm 面包板的标准排针模块。视频讲师没有确认焊盘的准确间距,只说明普通 2.54 mm 排针无法直接使用;因此不能根据口述在 1.27 mm 与 2.0 mm 之间猜测,必须查看所购版本的官方机械尺寸图或转接板图纸。
若自行引线焊接,应注意:
- 使用与焊盘尺寸匹配的细导线或专用转接板,先固定模块和导线再焊接。
- 控制烙铁温度和接触时间,避免焊盘脱落、连锡或热损伤。
- 焊后用万用表检查相邻焊盘是否短路,再上电测试。
- 确认功能正常后,才可用热熔胶等方式做应力释放;胶体不要覆盖咪头声孔、散热部位、测试点或插接件。
- 不要把胶固定当成电气绝缘和焊点可靠性的替代品。
若不熟悉细间距焊接,购买已焊好转接板、扬声器、咪头和电源线的完整套装通常更稳妥,但仍需逐项核对线序,不能只凭插头能够插入就直接通电。
1.3 功能实现原理
1.3.1 项目功能介绍
课程把系统的三路串口概括为:
| STM32 串口 | 本工程引脚 | 对端/用途 | 数据方向 |
|---|---|---|---|
| UART1 | PA9/PA10 | 系统控制台与日志 | 调试输出为主 |
| UART2 | PA2/PA3 | K210 人脸识别模块 | 双向:发送录入/删除命令,接收结果 |
| UART3 | PB10/PB11 | SU-03T 语音模块 | 当前业务只使用 PB10 向模块发送播报命令 |
完整数据流不是“三个窗口”,而是三路硬件串口承担不同职责。串口调试软件里的窗口只是查看或发送数据的工具界面,不属于 MCU 的硬件结构。
K210 与 STM32 的逻辑接线为:
| K210 端 | STM32 端 | 说明 |
|---|---|---|
| IO9,映射为 UART2_TX | PA3,USART2_RX | K210 把识别结果发给 STM32 |
| IO10,映射为 UART2_RX | PA2,USART2_TX | STM32 把录入/删除命令发给 K210 |
| GND | GND | 两端必须共地 |
视频采用“USB 某侧第几个针”的方式描述实物位置,但不同底板、安装方向和硬件版本可能不同,而且口述中第五/第六针的方向容易混淆。应优先按课程 face.py 中的 IO9/IO10 映射、开发板丝印和对应版本原理图接线,再遵守 TX 接对端 RX、RX 接对端 TX 的交叉规则。
课程协议没有采用可读字符串,而是使用固定长度的十六进制字节帧。
K210 → STM32:识别结果帧(4 字节)
| 事件 | 完整帧 | 字段解释 |
|---|---|---|
| 人脸录入成功 | AF 05 00 FA | 帧头 AF,命令 05,参数 00,帧尾 FA |
| 人脸识别成功 | AF 02 NN FA | NN 为匹配到的人脸索引 |
| 清除人脸成功 | AF 01 00 FA | 命令 01 表示清除完成 |
原稿中的 A5 05 00 0F A 是 OCR 和断句错误,正确数据是 AF 05 00 FA。
STM32 → K210:控制命令(4 字节)
| 操作 | 完整帧 | K210 动作 |
|---|---|---|
| 清除人脸 | A1 01 02 1A | 清空运行内存中的全部已录入特征,再回发删除成功帧 |
| 开始录入 | A1 02 00 1A | 将录入标志置位,在检测到下一张有效人脸后保存特征 |
视频口述“删除一个人脸数据”,但配套 K210 函数实际调用 record_ftrs.clear(),会清空当前运行中的全部人脸特征,不是按编号删除单个人脸。
STM32 → SU-03T:语音命令(5 字节)
| 播报内容 | 完整帧 | 当前 STM32 业务代码 |
|---|---|---|
| 人脸录入成功 | AA 55 01 55 AA | 已发送 |
| 人脸识别成功 | AA 55 02 55 AA | 已发送 |
| 人脸删除成功 | AA 55 03 55 AA | 已发送 |
| 温度异常 | AA 55 04 55 AA | 项目说明中列出,但归档 main.c 未发送 |
因此,“温度异常语音播报”属于协议清单中的规划项,当前归档实现只有温度大于 37 ℃时的蜂鸣器报警,不能把规划帧写成已经完成的演示功能。
三条主要业务链如下:
- 录入链:按下录入键 → STM32 发送
A1 02 00 1A→ K210 在检测到人脸后保存特征 → 回发AF 05 00 FA→ STM32 发送录入成功语音帧。 - 删除链:按下删除键 → STM32 发送
A1 01 02 1A→ K210 清空全部运行时特征 → 回发AF 01 00 FA→ STM32 发送删除成功语音帧。 - 识别开门链:K210 匹配成功 → 回发
AF 02 NN FA→ STM32 播报识别成功并设置识别标志 → 当前温度低于 37 ℃时驱动舵机开门 → 约 7 秒后复位舵机。
K210 会在摄像头连续帧中重复识别同一张脸。STM32 源码用 5 秒的 tick 间隔限制重复播报和重复触发;舵机关闭则使用 7 秒间隔。本工程 RT_TICK_PER_SECOND 为 1000,所以 5 * 1000 和 7 * 1000 分别对应约 5 秒和 7 秒。若以后修改系统 tick 频率,直接写死 1000 的时间换算也必须同步检查。
当前实现还有一个状态边界:识别成功后,face_check_flag 只有在温度低于 37 ℃并开门时才被清零。如果识别时温度过高,标志会保留;之后温度降到 37 ℃以下,程序可能在没有再次识别人脸的情况下开门。学习时应把它理解为归档代码的实际行为,而不是完整门禁应有的安全策略。
从硬件角度看,除三路串口外,项目还使用 PB1/TIM3_CH4 输出舵机 PWM、PB6/PB7 连接 GY-906 与 OLED 的两线总线、PB8 驱动蜂鸣器。舵机和语音功放具有明显的瞬态电流,供电不足可能导致 STM32 或 K210 复位;整机调试时应保证电源有余量、舵机宜单独供电且所有模块共地。