基于AS608光学指纹模块与ColorEasyDuino的嵌入式指纹识别系统实战

最近有不少朋友在问,想给自己的DIY项目加个指纹锁功能,有没有简单好上手的方案?正好,我手头有块ColorEasyDuino开发板和一个AS608光学指纹模块,就用它们来搭一个完整的指纹识别系统吧。这个组合特别适合学生、创客和刚入门的嵌入式开发者,因为AS608模块把最复杂的指纹算法都封装好了,咱们只需要通过串口发指令就能控制,省去了研究算法的麻烦。

今天这篇教程,我就带你从零开始,手把手完成硬件连接、库安装、代码编写,最终实现指纹的录入、识别和删除。整个过程就像搭积木,咱们一步步来。

1. 认识你的“搭档”:AS608指纹模块

在动手接线之前,咱们先得了解一下AS608这个核心部件。它可不是一个简单的传感器,而是一个集成了完整指纹识别算法的“小电脑”。

1.1 模块核心与特点

AS608模块的核心是一颗来自杭州晟元芯片技术有限公司的专用指纹识别芯片。这颗芯片内部自带DSP运算单元,也就是说,采集指纹图像、提取特征、比对识别这些复杂的计算,都在模块内部完成了。咱们的ColorEasyDuino开发板只需要告诉它“开始录入”或者“开始识别”,然后等结果就行,非常省心。

它的主要特点有:

  • 指纹容量:最多可以存储300枚指纹(ID编号从0到299)。
  • 识别速度快:搜索一整库指纹,时间小于0.3秒。
  • 安全性高:认假率(把别人的指纹误认为你的)低于0.001%,这个指标在实际的门锁、保险箱应用中已经足够可靠。
  • 双通信接口:同时提供了串口(UART)和USB两种通信方式。在嵌入式项目里,我们最常用、最方便的就是串口。

1.2 引脚定义与硬件连接

模块引出来一排8Pin的排针,咱们用到的其实主要是前6个。每个引脚的功能和接线方法,我整理成了下面这个表格,接线时对照着看,一目了然。

引脚编号 线色 引脚名称 功能说明 连接至 ColorEasyDuino
1 VCC 模块主电源 3.3V (切记!接5V会烧毁模块)
2 TX 模块串口发送端 数字引脚 2 (作为MCU的RX)
3 RX 模块串口接收端 数字引脚 3 (作为MCU的TX)
4 GND 电源地 GND
5 TOUCH 触摸感应输出 可接3.3V上拉,用于检测手指触摸
6 绿 VTOUCH 触摸感应电源 3.3V (通常与VCC并接)
7 - D- USB数据线- 使用串口时悬空
8 - D+ USB数据线+ 使用串口时悬空

注意:供电电压必须是 3.0V - 3.6V,绝对不能接到5V上!很多开发板的5V引脚离3.3V很近,接线前一定要确认清楚。

连接示意图总结:

  1. 电源:AS608的 VCC(1脚)VTOUCH(6脚) 连接到 ColorEasyDuino 的 3.3V 引脚。
  2. 地线:AS608的 GND(4脚) 连接到 ColorEasyDuino 的 GND
  3. 串口:AS608的 TX(2脚) 接开发板的 数字引脚2,AS608的 RX(3脚) 接开发板的 数字引脚3。这里用到了“软串口”,因为开发板自带的硬件串口(0,1引脚)通常要留给电脑通信做调试。

按照这个接法,你的硬件连接就完成了,是不是很简单?

2. 搭建软件开发环境

硬件连好了,接下来让代码跑起来。我们需要一个关键的库来帮我们和AS608对话。

2.1 安装 Adafruit Fingerprint 库

这个库封装了所有与AS608模块通信的底层指令,让我们能用简单的函数来完成复杂操作。

打开 Arduino IDE,按照以下步骤安装:

  1. 点击菜单栏的 工具 -> 管理库...
  2. 在库管理器的搜索框中输入 “Adafruit Fingerprint”
  3. 找到 “Adafruit Fingerprint Sensor Library”,点击安装。

2.2 理解程序框架与核心函数

库安装好后,咱们来看看程序的整体结构。整个项目通过串口监视器和你交互,你输入数字选择功能,程序调用对应的函数。

核心就三个功能函数:

  • addFingerprint(id):录入一个新指纹,并保存到指定的ID位置。
  • getFingerprintIDez():识别当前按下的指纹,并返回匹配的ID。
  • deleteFingerprint(id):删除指定ID的指纹数据。

程序一开始会进行初始化,检测指纹模块是否连接正常。

#include <Adafruit_Fingerprint.h>
#include <SoftwareSerial.h>

// 配置软串口,引脚对应我们刚才的接线:开发板引脚2(RX)接模块TX,引脚3(TX)接模块RX
SoftwareSerial mySerial(2, 3);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

void setup() {
  Serial.begin(9600);       // 用于和电脑串口监视器通信
  mySerial.begin(57600);    // 用于和指纹模块通信,波特率必须为57600
  finger.begin(57600);

  // 验证密码,确认模块连接成功
  if (finger.verifyPassword()) {
    Serial.println("指纹传感器连接成功");
  } else {
    Serial.println("指纹传感器连接失败");
    while (1) { delay(1); } // 连接失败就停在这里
  }
  showMenu(); // 显示功能菜单
}

3. 核心功能代码详解与实战

现在,咱们深入每个功能的代码,看看具体是怎么实现的,以及编程时有哪些需要注意的“坑”。

3.1 功能一:录入指纹

录入指纹的目的是获取手指图像,生成特征模板,并存入模块的Flash中。这个过程需要采集两次同一手指的图像,以确保准确性。

void addFingerprint(uint8_t id) {
  int p = -1; // 用于接收模块返回的状态码
  Serial.println("请放置手指...");

  // 第一步:等待并采集第一幅指纹图像
  while (p != FINGERPRINT_OK) {
    p = finger.getImage(); // 尝试获取图像
    if (p == FINGERPRINT_NOFINGER) {
      Serial.print("."); // 没检测到手指,打印点提示
    } else if (p == FINGERPRINT_OK) {
      Serial.println("图像采集成功");
    } else {
      // 处理其他错误,如图像太模糊、通信失败等
      Serial.println("采集出错,代码: " + String(p));
      return;
    }
    delay(50);
  }

  // 第二步:将图像转换为特征码,存入缓冲区1 (CharBuffer1)
  p = finger.image2Tz(1);
  if (p != FINGERPRINT_OK) {
    Serial.println("特征转换失败");
    return;
  }

  Serial.println("请移开手指");
  delay(2000); // 给用户时间移开手指
  Serial.println("请再次放置同一手指...");

  // 第三步:采集第二幅图像
  p = -1;
  while (p != FINGERPRINT_OK) {
    p = finger.getImage();
    // ... 状态判断与第一次类似,此处省略 ...
    delay(50);
  }

  // 第四步:将第二幅图像转换为特征码,存入缓冲区2 (CharBuffer2)
  p = finger.image2Tz(2);
  if (p != FINGERPRINT_OK) { return; }

  // 第五步:将两个特征码合成为一个指纹模板(模型)
  p = finger.createModel();
  if (p == FINGERPRINT_OK) {
    Serial.println("两次指纹匹配,模板创建成功");
  } else if (p == FINGERPRINT_ENROLLMISMATCH) {
    Serial.println("错误:两次按压的指纹不匹配!");
    return;
  } else {
    Serial.println("模板创建失败");
    return;
  }

  // 第六步:将模板存储到指定ID的Flash位置
  Serial.print("正在存储指纹模板到ID "); Serial.print(id); Serial.println(" ...");
  p = finger.storeModel(id);
  if (p == FINGERPRINT_OK) {
    Serial.println("指纹录入成功!");
  } else if (p == FINGERPRINT_BADLOCATION) {
    Serial.println("存储失败:ID号无效或Flash已满");
  } else {
    Serial.println("存储失败");
  }
}

提示:录入时,一定要保证手指放置的位置、力度大致相同。如果两次图像差异太大,createModel()函数会返回FINGERPRINT_ENROLLMISMATCH错误。

3.2 功能二:识别指纹

识别过程比录入简单,只需要采集一次图像,然后让模块在指纹库中搜索匹配的模板。

uint8_t getFingerprintIDez() {
  // 1. 采集图像
  uint8_t p = finger.getImage();
  if (p != FINGERPRINT_OK) {
    // 处理无手指或采集错误
    if (p == FINGERPRINT_NOFINGER) {
      Serial.println("未检测到手指");
    }
    return p;
  }
  Serial.println("图像采集成功");

  // 2. 转换图像为特征码(这次不指定缓冲区,使用默认)
  p = finger.image2Tz();
  if (p != FINGERPRINT_OK) {
    if (p == FINGERPRINT_IMAGEMESS) {
      Serial.println("图像太模糊,请按稳手指");
    }
    return p;
  }
  Serial.println("特征转换成功");

  // 3. 在指纹库中快速搜索匹配项
  p = finger.fingerFastSearch();
  if (p == FINGERPRINT_OK) {
    // 搜索成功!匹配的ID和置信度保存在 finger 对象中
    Serial.print("识别成功!ID #"); Serial.println(finger.fingerID);
    Serial.print("匹配得分: "); Serial.println(finger.confidence);
    // 这里可以添加你的控制逻辑,比如点亮LED、打开继电器等
    // digitalWrite(LED_PIN, HIGH);
  } else if (p == FINGERPRINT_NOTFOUND) {
    Serial.println("指纹库中未找到匹配项");
  } else {
    Serial.println("搜索过程中发生错误");
  }
  return p;
}

识别成功后,finger.fingerID 里存的就是匹配到的指纹编号,finger.confidence 是匹配得分(值越大,匹配度越高)。你可以根据这个ID去执行后续操作,比如开锁。

3.3 功能三:删除指纹

删除功能最简单,直接告诉模块要删除哪个ID的指纹数据。

void deleteFingerprint(uint8_t id){
  Serial.print("正在删除ID "); Serial.println(id);
  uint8_t p = finger.deleteModel(id);

  if (p == FINGERPRINT_OK) {
    Serial.println("删除成功!");
  } else if (p == FINGERPRINT_BADLOCATION) {
    Serial.println("删除失败:指定的ID无效");
  } else {
    Serial.println("删除失败");
  }
}

4. 运行测试与调试心得

把完整的代码(包含showMenuloop函数)上传到ColorEasyDuino后,打开串口监视器(波特率设为9600),你就能看到交互菜单了。

测试流程:

  1. 添加指纹:在串口监视器输入1,回车。根据提示输入一个ID(比如1),然后按照提示先后两次按压手指。看到“指纹录入成功”即表示完成。
  2. 识别指纹:输入2,回车。按压刚才录入的手指,串口会显示识别到的ID和匹配得分。
  3. 删除指纹:输入3,回车。输入要删除的ID(比如1),成功后再次识别该手指,就会提示“未找到匹配项”。

我踩过的坑与调试技巧:

  • 供电不足:如果模块工作时不稳定,识别时好时坏,首先检查3.3V电源是否稳定。可以尝试用外部稳压电源单独给模块供电。
  • 通信失败:最常见的错误是FINGERPRINT_PACKETRECIEVEERR。请务必检查TX、RX线是否接反(模块TX接开发板RX),以及软串口初始化的波特率是否设置为57600
  • 图像采集失败FINGERPRINT_IMAGEFAILFINGERPRINT_IMAGEMESS 通常是因为手指太干、太湿,或者按压位置偏移太大、用力不均。多试几次,保持手指清洁。
  • ID号范围:AS608的ID范围是0-299,但有些例程或库可能默认从1开始。删除不存在的ID会报错。

这个基于AS608和ColorEasyDuino的指纹识别系统,核心代码其实就这二百来行。它已经具备了完整的功能骨架,你可以轻松地把它集成到你的门禁、保险箱或者考勤机项目中,只需要在识别成功的地方,加上控制继电器、舵机或者记录数据的代码就行了。动手试试吧,遇到问题多在论坛里交流,嵌入式开发的乐趣就在于不断解决问题。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐