若该文为原创文章,转载请注明原文出处。

一、项目概述

1.1 项目背景

在智能家居快速发展的今天,传统门锁已难以满足现代家庭对安全性和便捷性的双重需求。单一的密码锁容易被窥探或破解,单一的指纹锁存在指纹残留被复制的风险,而单一的人脸识别也可能被照片或视频攻击。将人脸识别、指纹识别、密码验证三种方式融合,构建多模态生物识别门锁系统,是提升家庭安防水平的有效途径。

同时,随着物联网技术的发展,将门锁接入云端实现远程监控和记录查询,已成为智能门锁的标配功能。

1.2 项目简介

本项目设计并实现了一套基于STM32F103C8T6主控、K210协处理器、ESP-01S WiFi模块的多模态智能门锁系统。系统集成了三种身份验证方式:

验证方式 实现模块 特点
人脸识别 K210 + OV2640摄像头 非接触式,基于YOLO算法检测
指纹识别 ATK-AS608指纹模块 高精度,支持300枚指纹存储
密码验证 4×4矩阵键盘 6位数字密码,支持修改

系统通过ESP-01S接入OneNet云平台,实现开锁记录上报、远程状态查询等功能。本地通过OLED屏幕显示系统状态,SG90舵机模拟开锁动作。

1.3 系统特点

  • 三重验证机制:人脸、指纹、密码三种方式独立验证,任一通过即可开锁

  • 边缘AI计算:K210在本地完成人脸检测与识别,无需依赖云端算力

  • 物联网远程监控:通过ESP-01S接入OneNet,实时上报开锁记录

  • 本地交互友好:OLED显示状态,按键/键盘完成录入与删除操作

  • 模块化设计:各功能模块独立,便于调试与扩展

二、系统总体设计

2.1 系统架构

系统采用主从协同的双MCU架构:

text

+------------------+     UART      +------------------+     GPIO/I2C/PWM      +---------------------------+
|   K210视觉模块    | -----------> |   STM32主控      | -------------------> |  本地执行与交互            |
|  (人脸识别协处理器)|  识别结果     |  (逻辑决策中心)   |                      |   - SG90舵机 (PWM)        |
|  型号: Maixduino  |  用户ID      |  型号: F103C8T6  |                      |   - OLED (I2C)            |
+------------------+              +------------------+                      |   - 蜂鸣器 (GPIO)         |
                                    |     |                                 |   - LED指示灯 (GPIO)      |
                                    |     | UART                           |   - 4×4键盘 (GPIO)        |
                                    |     v                                 +---------------------------+
                                    | +------------------+
                                    | |   ESP-01S        |
                                    | |  (WiFi模块)      |
                                    | +------------------+
                                    |         |
                                    |     MQTT/JSON
                                    v         v
                             +----------------------+
                             |   OneNet云平台        |
                             |   - 开锁记录存储      |
                             |   - 历史记录查询      |
                             |   - 设备状态监控      |
                             +----------------------+

2.2 工作流程

  1. 待机状态:OLED显示“系统待机”,等待用户触发验证

  2. 人脸识别:用户靠近 → 红外感应触发 → K210采集图像 → YOLO检测人脸 → 特征比对 → 返回结果

  3. 指纹识别:用户按压指纹 → AS608采集 → 内部比对 → 返回匹配ID

  4. 密码验证:用户输入6位密码 → STM32读取键值 → 与存储密码比对

  5. 开锁动作:任一验证通过 → STM32驱动舵机旋转90° → OLED显示成功信息 → 蜂鸣器短鸣 → 3秒后自动复位

  6. 数据上报:验证结果(方式、时间、用户ID)通过ESP-01S上报OneNet

三、硬件设计

3.1 硬件清单

模块 型号 数量 接口 作用 参考价格
主控MCU STM32F103C8T6 1 - 系统逻辑核心 ¥25
AI视觉 正点原子K210 + OV2640 1 UART 人脸检测与识别 ¥150
WiFi模块 ESP-01S (ESP8266) 1 UART 连接OneNet云平台 ¥12
指纹模块 ATK-AS608 1 UART 指纹录入与验证 ¥60
矩阵键盘 4×4薄膜键盘 1 GPIO 密码输入与功能设置 ¥8
OLED屏幕 0.96寸 SSD1306 1 I2C 显示系统状态信息 ¥12
舵机 SG90 1 PWM 模拟开锁动作 ¥8
有源蜂鸣器 5V 1 GPIO 操作提示音 ¥3
LED指示灯 红/绿/蓝 3 GPIO 状态指示 ¥2
红外感应 HC-SR501 1 GPIO 人体感应,触发人脸识别 ¥5
电源 5V/2A适配器 1 DC口 系统供电 ¥15
合计 ≈ ¥300

3.2 核心芯片选型说明

芯片 算力 功耗 价格 选型理由
K210 0.8 TOPS (NPU) 0.3W ¥150 内置KPU神经网络处理器,专为AI推理优化,实测YOLOv2-tiny可达30fps
STM32F103 Cortex-M3 @72MHz 0.1W ¥25 外设丰富(5个USART、2个SPI、2个I2C),生态成熟
ESP8266 - 0.1W ¥12 成本极低,AT指令控制简单,支持MQTT

3.3 引脚连接表

STM32引脚 外设 说明
PA9 (USART1_TX) K210 (RX) 发送识别指令
PA10 (USART1_RX) K210 (TX) 接收识别结果
PA2 (USART2_TX) ESP-01S (RX) 发送AT/MQTT数据
PA3 (USART2_RX) ESP-01S (TX) 接收WiFi/MQTT数据
PA9 (USART1_TX) / PA10 (USART1_RX) AS608 指纹模块(注意:与K210共用UART时需分时复用)
PB0 蜂鸣器 高电平驱动
PB1 LED绿 验证成功
PB2 LED红 验证失败
PB3 舵机信号 PWM控制
PB4-PB11 4×4键盘 4行4列扫描
PB8 OLED SCL I2C时钟
PB9 OLED SDA I2C数据
PB12 HC-SR501 人体感应输入

3.4 电源设计注意事项

舵机(SG90)启动瞬间电流可达500mA以上,会导致系统电压跌落1.2V以上。推荐双路供电方案

  • STM32、K210、ESP-01S、OLED、AS608:共用5V → 3.3V LDO稳压

  • 舵机:单独5V供电(直接从5V适配器取电,不经过LDO)

避坑提示:多数门禁项目不稳定的元凶就是舵机与主控共用电源导致电压跌落复位。

四、通信协议设计

4.1 K210 ↔ STM32(UART1,波特率115200)

STM32发送指令:

指令 格式 说明
人脸识别 FACE_RECOG\n 触发K210执行一次识别
录入人脸 FACE_SAVE\n 录入当前检测到的人脸
删除人脸 FACE_DELETE:ID\n 删除指定ID的人脸
清空人脸 FACE_CLEAR\n 删除所有人脸数据

K210返回结果:

响应 格式 说明
识别成功 FACE_OK:ID:SCORE\n 识别通过,返回用户ID和匹配分数
识别失败 FACE_FAIL\n 未匹配到已注册人脸
录入成功 SAVE_OK:ID\n 人脸录入成功,返回分配的ID
录入失败 SAVE_FAIL\n 录入失败(无人脸或质量差)
删除成功 DELETE_OK\n 删除成功
清空成功 CLEAR_OK\n 清空成功

4.2 STM32 ↔ AS608(UART,按模块协议)

按照AS608数据手册的指令格式通信,主要指令:

功能 指令包 说明
录入指纹 0x01 采集3次,生成模板存储
验证指纹 0x02 按压指纹,返回匹配ID
删除指纹 0x04 删除指定ID指纹
清空指纹 0x05 删除所有指纹

注意:AS608支持存储300枚指纹,且断电不丢失。

4.3 STM32 ↔ ESP-01S(UART2,AT指令)

ESP-01S需烧录支持MQTT的AT固件,STM32通过AT指令控制:

text

// 1. 复位模块
AT+RST\r\n
// 2. 设置STA模式
AT+CWMODE=1\r\n
// 3. 连接WiFi
AT+CWJAP="SSID","PASSWORD"\r\n
// 4. 配置MQTT(产品ID、设备ID、鉴权信息)
AT+MQTTUSERCFG=0,1,"设备名称","产品ID","鉴权信息",0,0,""\r\n
// 5. 连接OneNet
AT+MQTTCONN=0,"mqtts.heclouds.com",1883,1\r\n
// 6. 发布数据
AT+MQTTPUB=0,"$sys/产品ID/设备ID/thing/event/property/post","{...}",1,0\r\n

4.4 OneNet数据格式

上报数据采用OneJSON格式:

json

{
  "id": "123",
  "version": "1.0",
  "params": {
    "unlock_method": { "value": "face" },
    "user_id": { "value": 2 },
    "timestamp": { "value": 1691234567 },
    "result": { "value": "success" }
  }
}

五、软件设计

5.1 K210端程序(MaixPy)

K210负责人脸检测与识别,核心流程:

python

# K210人脸识别核心代码
import sensor, image, lcd, time
from maix import KPU
from machine import UART

# 初始化摄像头
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_hmirror(1)
sensor.set_vflip(1)
sensor.run(1)

# 加载模型(从Flash加载示例)
task_fd = kpu.load(0x300000)   # 人脸检测模型[reference:34]
task_fe = kpu.load(0x400000)   # 特征提取模型[reference:35]

# 初始化YOLO
kpu.init_yolo2(task_fd, 0.5, 0.3, 5, anchor)

uart = UART(UART.UART1, 115200, 8, 0, 0)

# 人脸特征数据库(可保存到Flash/SD卡)
features = []

while True:
    if uart.any():
        cmd = uart.read().decode().strip()
        if cmd == "FACE_RECOG":
            img = sensor.snapshot()
            faces = kpu.run_yolo2(task_fd, img)
            if faces:
                # 提取特征并比对
                feature = extract_feature(img, faces[0])
                match_id = compare_feature(feature, features)
                if match_id >= 0:
                    uart.write("FACE_OK:{}:{}\n".format(match_id, score))
                else:
                    uart.write("FACE_FAIL\n")
        elif cmd == "FACE_SAVE":
            # 录入人脸特征
            features.append(feature)
            uart.write("SAVE_OK:{}\n".format(len(features)-1))

5.2 STM32端程序(主控逻辑)

主程序流程图:

text

系统初始化(时钟、GPIO、UART、I2C、PWM)
OLED显示“系统启动”
加载保存的密码(从EEPROM)
ESP-01S初始化(连接WiFi、登录OneNet)
舵机复位(关闭状态)

while (1) {
    // 1. 检测红外感应
    if (HC_SR501检测到人) {
        发送"FACE_RECOG"给K210
        等待识别结果(超时3秒)
        if (识别成功) 执行开锁()
    }
    
    // 2. 检测指纹模块
    if (指纹按压中断) {
        读取指纹验证结果
        if (验证成功) 执行开锁()
    }
    
    // 3. 检测键盘输入
    key = 扫描键盘()
    if (key == ENTER) {
        验证输入的6位密码
        if (密码正确) 执行开锁()
    }
    
    // 4. 处理功能按键(录入/删除/设置)
    处理管理员功能菜单()
    
    // 5. 刷新OLED显示
    更新OLED显示()
    
    // 6. 定时上报心跳(每30秒)
    if (心跳定时器到) {
        上报设备状态到OneNet
    }
}

void 执行开锁() {
    舵机旋转90°(开锁)
    点亮绿色LED
    蜂鸣器短鸣
    OLED显示“开锁成功”
    记录日志(时间、方式、用户ID)
    上报OneNet
    delay(3000)
    舵机复位(关锁)
}

5.3 用户管理功能

功能 操作方式 说明
录入人脸 管理员模式 → 选择“录入人脸” → 对准摄像头 K210提取特征并存储
删除人脸 管理员模式 → 选择“删除人脸” → 输入ID 删除指定ID的人脸
录入指纹 管理员模式 → 选择“录入指纹” → 按压3次 AS608采集并存储
删除指纹 管理员模式 → 选择“删除指纹” → 输入ID 删除指定ID的指纹
修改密码 管理员模式 → 选择“修改密码” → 输入新密码两次 更新系统密码

5.4 人脸数据掉电保存

K210的人脸特征数据可保存在Flash芯片中,实现掉电不丢失。实现方式:

python

# 保存特征到Flash
import ujson
with open('/flash/face_data.json', 'w') as f:
    ujson.dump(features, f)

# 开机加载
try:
    with open('/flash/face_data.json', 'r') as f:
        features = ujson.load(f)
except:
    features = []

六、OneNet平台配置

6.1 平台侧配置步骤

  1. 注册登录:访问OneNet官网注册账号

  2. 创建产品:选择“MQTT”协议,数据格式选“OneJSON”

  3. 添加设备:在产品下注册设备,获取产品ID、设备ID、鉴权信息

  4. 定义数据流:创建 unlock_methoduser_idtimestampresult 等数据流

  5. 配置触发器:设置开锁成功/失败的告警规则

6.2 历史记录查询

OneNet平台自动保存设备上报的历史数据,用户可通过以下方式查询:

  • OneNet控制台:在“设备管理 → 数据流”中按时间范围查询

  • 手机APP:使用OneNet官方APP绑定设备查看

  • API查询:调用OneNet RESTful API获取历史数据

七、功能演示与效果

7.1 本地端效果

场景 系统响应
用户靠近门锁 红外感应触发,K210自动开始人脸识别
人脸识别成功 OLED显示“人脸识别成功!ID:2”,舵机开锁
指纹按压成功 OLED显示“指纹验证成功!ID:1”,舵机开锁
输入正确密码 OLED显示“密码正确!”,舵机开锁
验证失败 OLED显示“验证失败”,红色LED闪烁
连续失败5次 系统锁定60秒,蜂鸣器报警

7.2 云端端效果

  • 实时数据:OneNet控制台展示最新开锁记录

  • 历史曲线:开锁时间、方式分布统计图表

  • 远程监控:手机APP查看设备在线状态和开锁记录

八、常见问题与解决方案

问题 可能原因 解决方法
K210不发送数据 波特率不匹配或接线错误 检查波特率(115200)和TX/RX交叉连接
舵机不动作 供电不足 采用双路供电,舵机单独供电
人脸识别率低 光照不足或模型未量化 优化光照,使用MaixHub量化模型
指纹无法录入 手指太干或太湿 清洁手指,多次尝试
ESP-01S连接WiFi失败 SSID/密码错误或信号弱 检查AT指令,靠近路由器测试
OneNet连接超时 MQTT参数错误 确认产品ID、设备ID、鉴权信息正确
系统频繁复位 电源不稳定 增加电容滤波,舵机独立供电
K210误识别 模型过拟合或阈值过低 调整置信度阈值,增加训练数据

九、创新点与技术特色

  1. 多模态生物识别融合:将人脸识别、指纹识别、密码验证三种方式结合,用户可根据场景自由选择

  2. 边缘AI计算:K210在本地完成人脸检测与识别,无需联网,响应速度快

  3. 云端历史追溯:通过OneNet平台实现开锁记录云端存储与查询

  4. 模块化设计:各功能模块独立,便于后期扩展(如增加RFID刷卡、蓝牙APP等)

  5. 成本可控:全套硬件成本约300元,适合DIY和学习

十、扩展方向

扩展功能 实现方式 参考
RFID刷卡 增加RC522模块
蓝牙APP控制 增加HC-05模块
语音播报 增加JQ8900或SYN6288
远程开锁 OneNet下发指令
异常报警 增加震动传感器
口罩检测 重新训练YOLO模型
红外测温 增加MLX90614
考勤功能 记录开锁时间与用户ID

十二、总结

本项目成功设计并实现了一套基于STM32F103C8T6 + K210 + ESP-01S的多模态智能门锁系统。系统集成了人脸识别、指纹识别、密码验证三种身份验证方式,并通过OneNet云平台实现了开锁记录的远程存储与查询。

项目验证了边缘AI与物联网融合的可行性,为智能家居安防领域提供了一个低成本、可扩展的解决方案。整套系统硬件成本约300元,开发周期约10天,非常适合作为嵌入式物联网方向的毕业设计或DIY项目。

十一、参考资料

  1. STM32智能门锁系统 - CSDN

  2. 用K210和STM32做个智能门禁 - CSDN

  3. 基于STM32F103C8T6和K210的智能锁系统 - CSDN下载

  4. 基于STM32+K210的人脸识别门禁 - CSDN

  5. 基于K210与YOLOv2的嵌入式人脸门禁方案 - CSDN

  6. OneNet开发者中心

  7. GitHub - INTELLIGENT-LOCK-SYSTEM-BASED-ON-STM32

如有侵权,或需要完整代码,请及时联系博主。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐