🔐 ESP32 + AS608 指纹识别:打造智能门禁系统

📅 2026-06-04 · 📂 硬件编程 · ⏱ 阅读约 6 分钟
🎧 听书

📺 B站推荐视频:ESP32单片机 AS608指纹锁设计 — 基于MicroPython

📖 概述

AS608 是目前市面上最常见的光学指纹识别模块,内置 DSP 处理器和指纹算法,通过 UART 串口与主控通信,支持指纹录入、图像采集、特征提取和 1:1 / 1:N 比对。搭配 ESP32 使用,可以轻松实现智能门锁、考勤打卡、保险柜等场景。

模块内部自带闪光灯和 CMOS 图像传感器,手指按上去后自动拍照并提取特征点( minutiae ),将指纹特征模板存储在板载 Flash 中(最多约 127 枚)。ESP32 通过 HardwareSerial 发送指令包即可完成所有操作。本文使用 Arduino 框架 + Adafruit Fingerprint 库,代码开箱即用。

🛒 物料清单

物料型号/参数数量参考价 (¥)
ESP32 开发板ESP32-WROOM-32 (38Pin)118 ~ 25
AS608 指纹模块光学式,UART 接口,3.3V TTL122 ~ 35
继电器模块1路 5V 低电平触发 (SRD-05VDC)13 ~ 5
电磁锁12V 推拉式电磁铁 / 电插锁115 ~ 30
SG90 舵机模拟门锁拨杆(替代方案)15 ~ 8
OLED 显示屏0.96" SSD1306 128×64 I2C18 ~ 12
蜂鸣器有源 3.3V 蜂鸣器模块11 ~ 2
杜邦线公母各 10 根若干3 ~ 5
面包板830 孔15 ~ 8

🔌 接线图

 AS608 指纹模块     →     ESP32 开发板
 ─────────────────────────────────────
 VCC  (红线)       →     3.3V
 GND  (黑线)       →     GND
 TX   (绿线)       →     GPIO16 (RX2)
 RX   (白线)       →     GPIO17 (TX2)

 OLED SSD1306 (I2C)  →  ESP32
 ─────────────────────────────────────
 VCC               →     3.3V
 GND               →     GND
 SDA               →     GPIO21
 SCL               →     GPIO22

 继电器模块         →     ESP32
 ─────────────────────────────────────
 VCC               →     5V (VIN)
 GND               →     GND
 IN                →     GPIO25

 蜂鸣器            →     ESP32
 ─────────────────────────────────────
 VCC               →     GPIO26
 GND               →     GND
        

💻 基础代码:指纹录入

首先安装库:Arduino IDE → 库管理 → 搜索 Adafruit Fingerprint Sensor LibraryAdafruit SSD1306

以下代码实现通过串口监视器交互式录入指纹:

// ========== 指纹录入程序 enroll.ino ========== #include <Adafruit_Fingerprint.h>// ESP32 使用 HardwareSerial(2),默认 GPIO16=RX2, GPIO17=TX2 HardwareSerial mySerial(2); Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial); uint8_t id; void setup() { Serial.begin(115200); while (!Serial); delay(100); Serial.println("\n🔐 AS608 指纹录入程序"); mySerial.begin(57600, SERIAL_8N1, 16, 17); finger.begin(57600); if (finger.verifyPassword()) { Serial.println("✅ 指纹传感器已连接!"); } else { Serial.println("❌ 未找到指纹传感器"); while (1) { delay(1); } } Serial.println("请输入要录入的指纹 ID (1-127):"); } void loop() { if (Serial.available()) { id = Serial.parseInt(); if (id > 0 && id <= 127) { enrollFingerprint(id); Serial.println("请输入下一个指纹 ID (1-127):"); } } } void enrollFingerprint(uint8_t id) { Serial.print("👉 请按手指 (ID="); Serial.print(id); Serial.println(")..."); int p = -1; while (p != FINGERPRINT_OK) { p = finger.getImage(); } p = finger.image2Tz(1); Serial.println("✅ 图像采集成功,请移开手指"); delay(2000); Serial.println("👉 再次按同一手指..."); p = -1; while (p != FINGERPRINT_OK) { p = finger.getImage(); } p = finger.image2Tz(2); Serial.println("✅ 第二次采集成功"); p = finger.createModel(); p = finger.storeModel(id); Serial.print("🎉 指纹录入完成!ID="); Serial.println(id); }

🔍 基础代码:指纹验证

验证程序持续检测手指按压,比对成功后返回匹配 ID 和置信度:

// ========== 指纹验证程序 verify.ino ========== #include <Adafruit_Fingerprint.h> #include <Adafruit_SSD1306.h>HardwareSerial mySerial(2); Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial); Adafruit_SSD1306 display(128, 64, &Wire, -1); const int RELAY_PIN = 25; const int BUZZER_PIN = 26; void setup() { Serial.begin(115200); mySerial.begin(57600, SERIAL_8N1, 16, 17); finger.begin(57600); pinMode(RELAY_PIN, OUTPUT); pinMode(BUZZER_PIN, OUTPUT); digitalWrite(RELAY_PIN, HIGH); // 初始关闭 display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay(); display.setTextColor(SSD1306_WHITE); showMessage("🔐 请按指纹", ""); } void loop() { int result = getFingerprintID(); if (result >= 0) { Serial.print("✅ 验证通过!ID="); Serial.println(result); unlockDoor(); } delay(50); } int getFingerprintID() { uint8_t p = finger.getImage(); if (p != FINGERPRINT_OK) return -1; p = finger.image2Tz(); if (p != FINGERPRINT_OK) return -1; p = finger.fingerFastSearch(); if (p != FINGERPRINT_OK) { showMessage("❌ 验证失败", "请重试"); return -1; } Serial.print("Found ID #"); Serial.print(finger.fingerID); Serial.print(" confidence="); Serial.println(finger.confidence); return finger.fingerID; } void unlockDoor() { showMessage("✅ 验证通过!", "门已开启"); digitalWrite(RELAY_PIN, LOW); // 继电器吸合digitalWrite(BUZZER_PIN, HIGH); // 蜂鸣器响delay(3000); digitalWrite(RELAY_PIN, HIGH); digitalWrite(BUZZER_PIN, LOW); showMessage("🔐 请按指纹", ""); } void showMessage(const char* line1, const char* line2) { display.clearDisplay(); display.setTextSize(2); display.setCursor(0, 10); display.print(line1); display.setTextSize(1); display.setCursor(0, 45); display.print(line2); display.display(); }

🚀 进阶应用

1. 指纹 + WiFi 远程授权

将验证成功的指纹 ID 和时间戳通过 WiFi POST 到服务器,管理员可远程查看开门记录:

#include <WiFi.h> #include <HTTPClient.h>void logAccess(uint8_t fingerID) { HTTPClient http; http.begin("http://your-server/api/log"); http.addHeader("Content-Type", "application/json"); String body = "{\"id\":" + String(fingerID) + ",\"time\":" + String(millis()) + "}"; http.POST(body); http.end(); }

2. 指纹 + RFID 双重认证

高安全场景需要"指纹+IC卡"双重验证:先用 RC522 读取卡号,验证卡片有效性后,再要求指纹匹配。两个模块都通过串口/SPI 独立通信,互不冲突。之前学过的 RFID门禁 和本文的指纹识别可以无缝联动。

3. 指纹考勤机

用 ESP32 的 RTC 获取时间,每次指纹验证成功记录 (ID, 时间戳) 到 MicroSD 卡。配合 WiFi 定时同步到云端,实现离线+在线双重考勤方案。加上 SSD1306 OLED 显示"签到成功"和当前时间。

🎯 实战场景

场景一:智能门锁完整方案

需求:用指纹开锁,OLED 显示状态,WiFi 远程开锁,门磁检测门是否关好。

物料组合:AS608(指纹)+ SSD1306 OLED(显示)+ 继电器模块(驱动电锁)+ 门磁传感器(检测门状态)+ ESP32(WiFi联网)。

与已学模块联动WiFi联网 提供远程控制能力,OLED显示 输出状态信息,舵机 可替代继电器做机械拨杆。

场景二:实验室设备授权管理

需求:贵重仪器只有授权人员才能启动,记录每次使用时间和人员。

物料组合:AS608 + ESP32 + 继电器(控制设备电源) + MicroSD 模块(记录日志)。

与已学模块联动L298N电机驱动 控制大型设备启停,MQTT上云 把使用日志实时推送到管理后台。

⚠️ 常见问题

🔴 传感器不响应 / 密码验证失败
检查波特率是否设为 57600(不是 9600)。AS608 默认波特率为 57600,如果串口监视器看到乱码说明波特率不匹配。另外 ESP32 的 GPIO16/17 是 Serial2 的默认引脚,确保接线正确且没有与其他设备共用引脚。
🔴 指纹录入成功但验证总失败
AS608 是光学传感器,手指太干或太湿都会导致图像质量差。录入时尽量多角度按压(正/左/右各一次),提高模板覆盖度。也可以降低置信度阈值:Adafruit 库默认比对阈值已内置于模块固件中,无需软件设置。
🔴 模块存储指纹数量有限
AS608 最多存储 约 127 枚指纹模板。每个指纹占用 2 个特征模板槽(因为录入时需要采集两次)。实际可用 ID 为 1~127,超过 127 会存储失败。如需更大容量,可考虑使用 FPM383C 等更高级模块。
🔴 继电器频繁误触发
ESP32 GPIO 启动瞬间可能有电平抖动。务必在 setup() 中先设置 pinModedigitalWrite 到关闭状态。继电器模块 IN 引脚建议接 1kΩ 下拉电阻到 GND,防止浮空误触发。

粤ICP备2026055292号-1