🔐 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) | 1 | 18 ~ 25 |
| AS608 指纹模块 | 光学式,UART 接口,3.3V TTL | 1 | 22 ~ 35 |
| 继电器模块 | 1路 5V 低电平触发 (SRD-05VDC) | 1 | 3 ~ 5 |
| 电磁锁 | 12V 推拉式电磁铁 / 电插锁 | 1 | 15 ~ 30 |
| SG90 舵机 | 模拟门锁拨杆(替代方案) | 1 | 5 ~ 8 |
| OLED 显示屏 | 0.96" SSD1306 128×64 I2C | 1 | 8 ~ 12 |
| 蜂鸣器 | 有源 3.3V 蜂鸣器模块 | 1 | 1 ~ 2 |
| 杜邦线 | 公母各 10 根 | 若干 | 3 ~ 5 |
| 面包板 | 830 孔 | 1 | 5 ~ 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 Library 和 Adafruit 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() 中先设置 pinMode 再 digitalWrite 到关闭状态。继电器模块 IN 引脚建议接 1kΩ 下拉电阻到 GND,防止浮空误触发。
粤ICP备2026055292号-1