名称介绍

简介

该电容指纹模块集指纹采集、处理、存储及指纹比对为一体。以ID809高性能处理器和半导体指纹传感器为核心,内置 IDfinger6.0指纹算法,能够独立完成全部的指纹识别工作。该模块采用标准UART通讯,配合Arduino库,非常容易实现录入指纹、删除指纹、比对指纹等指纹识别功能。同时我们提供了一个上位机软件,通过该软件就能操作该模块。 该模块外观精致轻薄一体化,具有环形炫酷呼吸灯,指纹识别速度快、安全性高,支持360度任意角度识别、深度自学习功能、高性能、低功耗。

特性

应用场景

技术规格

引脚说明

SEN0348结构

序号 名称 功能描述
1 GND 公共地
2 RX UART接收
3 TX UART发射
4 VIN 电源(3.3V):接通电源工作,断开电源休眠
5 IRQ 手指感应输出:高电平有效
6 3.3V 常供电电源

使用教程

⚠注意:建议您使用硬串口驱动指纹模块,如果使用软串口驱动,可能会因为软串口不稳定,导致不知预知的错误。使用软串口驱动建议将模块波特率降到9600。

准备

  /**
   * @brief 测试模块是否正常连接
   * @return true or false
   */
  bool isConnected();

  /**
   * @brief 设置LED灯
   * @param mode:in typedef enum eLEDMode_t
   * @param color:in typedef enum eLEDColor_t
   * @param blink Count: 0表示一直呼吸、闪烁,该参数仅在eBreathing、eFastBlink、eSlowBlink模式下有效
   * @return 0(succeed) or ERR_ID809
   */
  uint8_t ctrlLED(eLEDMode_t mode,eLEDColor_t color,uint8_t blinkCount);

  /**
   * @brief 检测是否有手指触碰
   * @return 1(有手指) or 0(无手指)
   */
  uint8_t detectFinger();

  /**
   * @brief 获取可注册首个编号
   * @return 可注册ID号 or ERR_ID809
   */
  uint8_t getEmptyID();

  /**
   * @brief 检查ID是否已被注册
   * @return 0(已注册)、1(未注册) or ERR_ID809
   */
  uint8_t getStatusID(uint8_t ID);

  /**
   * @brief 获取注册用户数量
   * @return 注册用户数量 or ERR_ID809
   */
  uint8_t getEnrollCount();

  /**
   * @brief 获取已注册用户列表
   * @return 0(succeed) or ERR_ID809
   */
   uint8_t getEnrolledIDList(uint8_t* list);

  /**
   * @brief 采集指纹
   * @return 0(succeed) or ERR_ID809
   */
  uint8_t collectionFingerprint(uint16_t timeout);

  /**
   * @brief 保存指纹
   * @param 指纹ID
   * @return 0(succeed) or ERR_ID809
   */
  uint8_t storeFingerprint(uint8_t ID);

  /**
   * @brief 删除指纹
   * @param 指纹ID or DELALL(全部删除)
   * @return 0(succeed) or ERR_ID809
   */
  uint8_t delFingerprint(uint8_t ID);

  /**
   * @brief 将指纹与全部指纹匹配
   * @return 匹配成功的指纹ID、0(匹配失败) or ERR_ID809
   */
  uint8_t search();

  /**
   * @brief 将指纹与指定指纹匹配
   * @return 匹配成功的指纹ID、0(匹配失败) or ERR_ID809
   */
  uint8_t verify(uint8_t ID);

  /**
   * @brief 获取错误信息
   * @return 错误信息的文本描述
   */
  String getErrorDescription();

接线图

Leonardo接线图

UNO接线图

样例代码1 - 查询模块波特率

模块默认波特率为115200,如果不知道模块的波特率可以使用该代码查询(模块掉电后波特率并不会恢复为默认值)

/*!
 * @file queryDeviceBPS.ino
 * @brief 查询设备波特率
 * @n 实验现象:查询设备波特率,并通过串口打印出来
 * @copyright  Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @licence     The MIT License (MIT)
 * @author [Eddard](Eddard.liu@dfrobot.com)
 * @version  V1.0
 * @date  2020-03-19
 * @get from https://www.dfrobot.com
 * @url https://github.com/DFRobot/DFRobot_ID809
*/
#include <DFRobot_ID809.h>

/*如果使用UNO或NANO,则使用软串口*/
#if ((defined ARDUINO_AVR_UNO) || (defined ARDUINO_AVR_NANO))
    #include <SoftwareSerial.h>
    SoftwareSerial Serial1(2, 3);  //RX, TX
    #define FPSerial Serial1
#else
    #define FPSerial Serial1
#endif

DFRobot_ID809 fingerprint;

uint32_t ID809_BPS[5] = {9600, 19200, 38400, 57600, 115200};
uint8_t i = 0;

void setup(){
  /*初始化打印串口*/
  Serial.begin(9600);
  /*测试模块波特率*/
  do{
    /*初始化FPSerial*/
    Serial.print(".");
    FPSerial.begin(ID809_BPS[i]);
    /*将FPSerial作为指纹模块的通讯串口*/
    fingerprint.begin(FPSerial);
    i++;
    if(i > 4) i = 0;
  }while(fingerprint.isConnected() == false);
  Serial.println(" ");
}

void loop(){
  Serial.print("模块波特率为:");
  Serial.println(ID809_BPS[i-1]);
  Serial.println("-----------------------------");
  delay(1000);
}             

SEN0348结果1

样例代码2 - 获取模块信息

获取模块的参数信息并通过串口打印

/*!
 * @file getDeviceInformation.ino
 * @brief 获取指纹模块信息
 * @n 实验现象:串口打印出模块的ID、安全等级、波特率等信息
 * @copyright  Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @licence     The MIT License (MIT)
 * @author [Eddard](Eddard.liu@dfrobot.com)
 * @version  V1.0
 * @date  2020-03-19
 * @get from https://www.dfrobot.com
 * @url https://github.com/DFRobot/DFRobot_ID809
*/

#include <DFRobot_ID809.h>

/*如果使用UNO或NANO,则使用软串口*/
#if ((defined ARDUINO_AVR_UNO) || (defined ARDUINO_AVR_NANO))
    #include <SoftwareSerial.h>
    SoftwareSerial Serial1(2, 3);  //RX, TX
    #define FPSerial Serial1
#else
    #define FPSerial Serial1
#endif

DFRobot_ID809 fingerprint;
//String desc;   //错误码信息,启用此功能将占用较大内存

void setup(){
  /*初始化打印串口*/
  Serial.begin(9600);
  /*初始化FPSerial*/
  FPSerial.begin(115200);
  /*将FPSerial作为指纹模块的通讯串口*/
  fingerprint.begin(FPSerial);
  /*等待Serial打开*/
  while(!Serial);
  /*测试设备与主控是否能正常通讯,
    返回true or false
    */
  while(fingerprint.isConnected() == false){
    Serial.println("与设备通讯失败,请检查接线");
    /*获取错误码信息*/
    //desc = fingerprint.getErrorDescription();
    //Serial.println(desc);
    delay(1000);
  }
}

uint8_t enrollCount;   //已注册用户数

void loop(){
  /*设置模块ID号,可设置值1-255*/
  //fingerprint.setDeviceID(/*Device ID = */1);
  Serial.print("模块ID为:");
  /*读取模块ID*/
  Serial.println(fingerprint.getDeviceID());

  /*设置模块安全等级,可设置值1-5,默认安全等级3
    Security Level          识别率
      Level 1          认假率 FAR  0.1%
                       拒真率 FRR  0.005%
      Level 2          认假率 FAR  0.003%
                       拒真率 FRR  0 01%
      Level 3          认假率 FAR  0.001%
                       拒真率 FRR  0.1%
      Level 4          认假率 FAR  0.003%
                       拒真率 FRR  0.5%
      Level 5          认假率 FAR  0.0001%
                       拒真率 FRR  1%
   */
  //fingerprint.setSecurityLevel(/*Security Level = */3);
  Serial.print("模块安全等级为:");
  /*读取模块安全等级*/
  Serial.println(fingerprint.getSecurityLevel());

  /*设置模块波特率,可设置范围如下所示:
    e9600bps    e19200bps   e38400bps   e57600bps   e115200bps
       1           2            3          4            5
   */
  //fingerprint.setBaudrate(fingerprint.e115200bps);
  Serial.print("模块波特率为:");
  /*读取模块波特率*/
  Serial.println(fingerprint.getBaudrate());

  /*设置模块自学功能,1(ON) 0(OFF)*/
  //fingerprint.setAutoLearn(/*Auto Learn = */1);
  Serial.print("模块自学功能:");
  /*读取模块自学功能状态
    如果开启则打印ON,否则打印OFF*/
  Serial.println(fingerprint.getSelfLearn()?"ON":"OFF");

  /*设置模块序列号,序列号字符数必须小于15个*/
  //fingerprint.setModuleSN(/*Module SN = */"DFRobot");
  Serial.print("模块序列号为:");
  /*读取模块序列号*/
  Serial.println(fingerprint.getModuleSN());

  Serial.print("模块内部已注册指纹数量:");
  /*获取注册用户数量*/
  Serial.println(enrollCount = fingerprint.getEnrollCount());
  /*声明一个数组用来存放ID列表*/
  uint8_t list[80] = {0};
  /*获取用户列表
    传入一个数组指针用来接收ID列表
   */
  fingerprint.getEnrolledIDList(list);
  Serial.print("已注册用户ID列表:");
  for(uint8_t i = 0; i < enrollCount; i++){
    Serial.print(list[i]);
    Serial.print(",");
  }

  Serial.print("\n指纹损坏数量:");
  /*获取损坏的指纹数量*/
  Serial.println(fingerprint.getBrokenQuantity());
  /*获取第一个损坏的指纹ID号*/
  //fingerprint.getBrokenID();
  Serial.println("-----------------------------");

  delay(1000);
}     

SEN0348结果2

样例代码3 - 增加指纹

本样例自动获取可注册ID,然后采集三次指纹,采集成功黄色灯快闪3次,最后将指纹保存到获取到的未注册的编号中,绿色灯亮1S然后熄灭

/*!
 * @file fingerprintRegistration.ino
 * @brief 采集指纹并保存
 * @n 该模块可以使用硬串口或软串口控制
 * @n 实验现象:自动获取空白ID,然后采集三次指纹,采集时
 * @n           设置灯环为蓝色呼吸灯,采集成功黄色灯快闪
 * @n           3次,最后将指纹保存到获取到的未注册的编
 * @n           号中,绿色灯亮1S然后熄灭
 * @copyright  Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @licence     The MIT License (MIT)
 * @author [Eddard](Eddard.liu@dfrobot.com)
 * @version  V1.0
 * @date  2020-03-19
 * @get from https://www.dfrobot.com
 * @url https://github.com/DFRobot/DFRobot_ID809
*/

#include <DFRobot_ID809.h>

#define COLLECT_NUMBER 3  //指纹采样次数,可设置2-3

/*如果使用UNO或NANO,则使用软串口*/
#if ((defined ARDUINO_AVR_UNO) || (defined ARDUINO_AVR_NANO))
    #include <SoftwareSerial.h>
    SoftwareSerial Serial1(2, 3);  //RX, TX
    #define FPSerial Serial1
#else
    #define FPSerial Serial1
#endif

DFRobot_ID809 fingerprint;
//String desc;   //错误码信息,启用此功能将占用较大内存

void setup(){
  /*初始化打印串口*/
  Serial.begin(9600);
  /*初始化FPSerial*/
  FPSerial.begin(115200);
  /*将FPSerial作为指纹模块的通讯串口*/
  fingerprint.begin(FPSerial);
  /*等待Serial打开*/
  while(!Serial);
  /*测试设备与主控是否能正常通讯,
    返回true or false
    */
  while(fingerprint.isConnected() == false){
    Serial.println("与设备通讯失败,请检查接线");
    /*获取错误码信息*/
    //desc = fingerprint.getErrorDescription();
    //Serial.println(desc);
    delay(1000);
  }
}

uint8_t ID,i,ret;

void loop(){
  /*获取一个未注册编号,用来保存指纹
    获取成功返回ID号,
    获取失败返回ERR_ID809
   */
  if((ID = fingerprint.getEmptyID()) == ERR_ID809){
    while(1){
      /*获取错误码信息*/
      //desc = fingerprint.getErrorDescription();
      //Serial.println(desc);
      delay(1000);
    }
  }
  Serial.print("未注册编号,ID=");
  Serial.println(ID);
  i = 0;   //采样计数清零
  /*指纹采样三次*/
  while(i < COLLECT_NUMBER){
    /*设置指纹灯环模式、颜色和闪烁次数,
      可设置参数如下:
      参数1:<LEDMode>
      eBreathing   eFastBlink   eKeepsOn    eNormalClose
      eFadeIn      eFadeOut     eSlowBlink   
      参数2:<LEDColor>
      eLEDGreen  eLEDRed      eLEDYellow   eLEDBlue
      eLEDCyan   eLEDMagenta  eLEDWhite
      参数3:<呼吸、闪烁次数> 0表示一直呼吸、闪烁,
      该参数仅在eBreathing、eFastBlink、eSlowBlink模式下有效
     */
    fingerprint.ctrlLED(/*LEDMode = */fingerprint.eBreathing, /*LEDColor = */fingerprint.eLEDBlue, /*blinkCount = */0);
    Serial.print("正在进行第");
    Serial.print(i+1);
    Serial.println("次指纹采样");
    Serial.println("请按下手指");
    /*采集指纹图像,超过10S没按下手指则采集超时,如果timeout=0,关闭采集超时功能
      如果获取成功返回0,否则返回ERR_ID809
     */
    if((fingerprint.collectionFingerprint(/*timeout = */10)) != ERR_ID809){
      /*设置指纹灯环为黄色快闪3次*/
      fingerprint.ctrlLED(/*LEDMode = */fingerprint.eFastBlink, /*LEDColor = */fingerprint.eLEDYellow, /*blinkCount = */3);
      Serial.println("采集成功");
      i++;   //采样计数+1
    }else{
      Serial.println("采集失败");
      /*获取错误码信息*/
      //desc = fingerprint.getErrorDescription();
      //Serial.println(desc);
    }
    Serial.println("请松开手指");
    /*等待手指松开
      检测到手指返回1,否则返回0
     */
    while(fingerprint.detectFinger());
  }

  /*将指纹信息保存到一个未注册的编号中*/
  if(fingerprint.storeFingerprint(/*Empty ID = */ID) != ERR_ID809){
    Serial.print("保存成功,ID=");
    Serial.println(ID);
    Serial.println("-----------------------------");
    /*设置指纹灯环为绿色常亮*/
    fingerprint.ctrlLED(/*LEDMode = */fingerprint.eKeepsOn, /*LEDColor = */fingerprint.eLEDGreen, /*blinkCount = */0);
    delay(1000);
    /*关闭指纹灯环*/
    fingerprint.ctrlLED(/*LEDMode = */fingerprint.eNormalClose, /*LEDColor = */fingerprint.eLEDBlue, /*blinkCount = */0);
    delay(1000);
  }else{
    Serial.println("保存失败");
    /*获取错误码信息*/
    //desc = fingerprint.getErrorDescription();
    //Serial.println(desc);
  }
} 

SEN0348结果3

样例代码4 - 指纹匹配

采集指纹图像并与指纹库中的指纹做对比,对比成功亮绿色灯并打印ID号,对比失败亮红色灯并提示匹配失败

/*!
 * @file fingerprintMatching.ino
 * @brief 采集指纹并与指纹库中指纹做对比
 * @n 实验现象:采集指纹图像并与指纹库中的指纹最对比,
                对比成功亮绿色灯并打印ID号,对比失败返回0
 * @copyright  Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @licence     The MIT License (MIT)
 * @author [Eddard](Eddard.liu@dfrobot.com)
 * @version  V1.0
 * @date  2020-03-19
 * @get from https://www.dfrobot.com
 * @url https://github.com/DFRobot/DFRobot_ID809
*/
#include <DFRobot_ID809.h>

/*如果使用UNO或NANO,则使用软串口*/
#if ((defined ARDUINO_AVR_UNO) || (defined ARDUINO_AVR_NANO))
    #include <SoftwareSerial.h>
    SoftwareSerial Serial1(2, 3);  //RX, TX
    #define FPSerial Serial1
#else
    #define FPSerial Serial1
#endif

DFRobot_ID809 fingerprint;
//String desc;   //错误码信息,启用此功能将占用较大内存

void setup(){
  /*初始化打印串口*/
  Serial.begin(9600);
  /*初始化FPSerial*/
  FPSerial.begin(115200);
  /*将FPSerial作为指纹模块的通讯串口*/
  fingerprint.begin(FPSerial);
  /*等待Serial打开*/
  while(!Serial);
  /*测试设备与主控是否能正常通讯,
    返回true or false
    */
  while(fingerprint.isConnected() == false){
    Serial.println("与设备通讯失败,请检查接线");
    /*获取错误码信息*/
    //desc = fingerprint.getErrorDescription();
    //Serial.println(desc);
    delay(1000);
  }
}

uint8_t ret;

void loop(){
  /*设置指纹灯环模式、颜色和闪烁次数,
    可设置参数如下:
    参数1:<LEDMode>
    eBreathing   eFastBlink   eKeepsOn    eNormalClose
    eFadeIn      eFadeOut     eSlowBlink   
    参数2:<LEDColor>
    eLEDGreen  eLEDRed      eLEDYellow   eLEDBlue
    eLEDCyan   eLEDMagenta  eLEDWhite
    参数3:<呼吸、闪烁次数> 0表示一直呼吸、闪烁,
    该参数仅在eBreathing、eFastBlink、eSlowBlink模式下有效
   */
  fingerprint.ctrlLED(/*LEDMode = */fingerprint.eBreathing, /*LEDColor = */fingerprint.eLEDBlue, /*blinkCount = */0);
  Serial.println("请按下手指");
  /*采集指纹图像,关闭采集超时功能
    如果获取成功返回0,否则返回ERR_ID809
   */
  if((fingerprint.collectionFingerprint(/*timeout=*/10)) != ERR_ID809){
    /*设置指纹灯环为黄色快闪3次*/
    fingerprint.ctrlLED(/*LEDMode = */fingerprint.eFastBlink, /*LEDColor = */fingerprint.eLEDYellow, /*blinkCount = */3);
    Serial.println("采集成功");
    Serial.println("请松开手指");
    /*等待手指松开
      检测到手指返回1,否则返回0
     */
    while(fingerprint.detectFinger());
    /*将采集到的指纹与指纹库中的所有指纹对比,
      成功返回指纹编号(1-80),失败返回0
     */
    ret = fingerprint.search();
    /*将采集到的指纹与指定编号指纹对比
      成功返回指纹编号(1-80),失败返回0
     */
    //ret = fingerprint.verify(/*Fingerprint ID = */1);  
    if(ret != 0){
      /*设置指纹灯环为绿色常亮*/
      fingerprint.ctrlLED(/*LEDMode = */fingerprint.eKeepsOn, /*LEDColor = */fingerprint.eLEDGreen, /*blinkCount = */0);
      Serial.print("匹配成功,ID=");
      Serial.println(ret);
    }else{
      /*设置指纹灯环为红色常亮*/
      fingerprint.ctrlLED(/*LEDMode = */fingerprint.eKeepsOn, /*LEDColor = */fingerprint.eLEDRed, /*blinkCount = */0);
      Serial.println("匹配失败");
    }
  }else{
    Serial.println("采集失败");
    /*获取错误码信息*/
    //desc = fingerprint.getErrorDescription();
    //Serial.println(desc);
  }
  Serial.println("-----------------------------");
  delay(1000);
}            

SEN0348结果4

样例代码5 - 删除指纹

运行代码,按下需要删除指纹的手指

/*!
 * @file fingerprintDeletion.ino
 * @brief 删除指定指纹
 * @n 实验现象:按下手指,如果该手指指纹已注册则删除指纹,并亮绿灯
                如果未注册或采集指纹失败,则亮红灯
 * @copyright  Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @licence     The MIT License (MIT)
 * @author [Eddard](Eddard.liu@dfrobot.com)
 * @version  V1.0
 * @date  2020-03-19
 * @get from https://www.dfrobot.com
 * @url https://github.com/DFRobot/DFRobot_ID809
*/
#include <DFRobot_ID809.h>

/*如果使用UNO或NANO,则使用软串口*/
#if ((defined ARDUINO_AVR_UNO) || (defined ARDUINO_AVR_NANO))
    #include <SoftwareSerial.h>
    SoftwareSerial Serial1(2, 3);  //RX, TX
    #define FPSerial Serial1
#else
    #define FPSerial Serial1
#endif

DFRobot_ID809 fingerprint;
//String desc;   //错误码信息,启用此功能将占用较大内存

void setup(){
  /*初始化打印串口*/
  Serial.begin(9600);
  /*初始化FPSerial*/
  FPSerial.begin(115200);
  /*将FPSerial作为指纹模块的通讯串口*/
  fingerprint.begin(FPSerial);
  /*等待Serial打开*/
  while(!Serial);
  /*测试设备与主控是否能正常通讯,
    返回true or false
    */
  while(fingerprint.isConnected() == false){
    Serial.println("与设备通讯失败,请检查接线");
    /*获取错误码信息*/
    //desc = fingerprint.getErrorDescription();
    //Serial.println(desc);
    delay(1000);
  }
}

void loop(){
  uint8_t ret = 0;
  /*设置指纹灯环模式、颜色和闪烁次数,
    可设置参数如下:
    参数1:<LEDMode>
    eBreathing   eFastBlink   eKeepsOn    eNormalClose
    eFadeIn      eFadeOut     eSlowBlink   
    参数2:<LEDColor>
    eLEDGreen  eLEDRed      eLEDYellow   eLEDBlue
    eLEDCyan   eLEDMagenta  eLEDWhite
    参数3:<呼吸、闪烁次数> 0表示一直呼吸、闪烁,
    该参数仅在eBreathing、eFastBlink、eSlowBlink模式下有效
   */
  fingerprint.ctrlLED(/*LEDMode = */fingerprint.eBreathing, /*LEDColor = */fingerprint.eLEDBlue, /*blinkCount = */0);
  Serial.println("请按下需要删除指纹的手指");
  /*采集指纹图像,超过10S没按下手指则采集超时,如果timeout=0,关闭采集超时功能
    如果获取成功返回0,否则返回ERR_ID809
   */
  if((fingerprint.collectionFingerprint(/*timeout=*/10)) != ERR_ID809){
    /*将采集到的指纹与指纹库中的所有指纹对比,
      成功返回指纹编号(1-80),失败返回0
     */
    ret = fingerprint.search();
    /*将采集到的指纹与指定编号指纹对比
      成功返回指纹编号(1-80),失败返回0
     */
    if(ret != 0){
      /*删除该编号的指纹*/
      fingerprint.delFingerprint(/*Fingerprint ID = */ret);
      //fingerprint.delFingerprint(DELALL);  //删除所有指纹
      Serial.print("删除成功,ID=");
      Serial.println(ret);
      /*设置指纹灯环为绿色常亮*/
      fingerprint.ctrlLED(/*LEDMode = */fingerprint.eKeepsOn, /*LEDColor = */fingerprint.eLEDGreen, /*blinkCount = */0);
    }else{
      Serial.println("指纹未注册");
      /*设置指纹灯环为红色常亮*/
      fingerprint.ctrlLED(/*LEDMode = */fingerprint.eKeepsOn, /*LEDColor = */fingerprint.eLEDRed, /*blinkCount = */0);
    }
  }else{
    Serial.println("采集失败");
    /*获取错误码信息*/
    //desc = fingerprint.getErrorDescription();
    //Serial.println(desc);
    /*设置指纹灯环为红色常亮*/
    fingerprint.ctrlLED(/*LEDMode = */fingerprint.eKeepsOn, /*LEDColor = */fingerprint.eLEDRed, /*blinkCount = */0);
  }
  Serial.println("请松开手指");
  /*等待手指松开
    检测到手指返回1,否则返回0
   */
  while(fingerprint.detectFinger());

  /*检查指纹编号是否被注册
    如果已注册返回1,否则返回0
   */
//  if(fingerprint.getStatusID(/*Fingerprint ID = */FINGERPRINTID)){
//    Serial.println("ID已注册");
//  }else{
//    Serial.println("ID未注册");
//  }
  Serial.println("-----------------------------");
  delay(1000);
}             

SEN0348结果5

样例代码6 - 综合示例

本样例是对指纹模块的综合应用,根据手指按下时间长短不同进入不同的模式。按下手指,蓝灯快闪3次表示进入对比指纹模式;黄灯快闪3次,表示进入指纹注册模式;红灯快闪3次,表示进入删除指纹模式,删除该指纹。 本实验需要将IRQ引脚接到D6引脚。

/*!
 * @file comprehensiveExample.ino
 * @brief 综合示例
 * @n 该模块可以使用硬串口或软串口控制,本实验需要将IRQ引脚接到D6
 * @n 实验现象:按下手指,蓝灯快闪3次表示进入对比指纹模式
 * @n           黄灯快闪3次,表示进入指纹注册模式
 * @n           红灯快闪3次,表示进入删除指纹模式,删除该指纹
 * @copyright  Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @licence     The MIT License (MIT)
 * @author [Eddard](Eddard.liu@dfrobot.com)
 * @version  V1.0
 * @date  2020-03-19
 * @get from https://www.dfrobot.com
 * @url https://github.com/DFRobot/DFRobot_ID809
*/

#include <DFRobot_ID809.h>

#define COLLECT_NUMBER 3  //指纹采样次数,可设置1-3
#define IRQ         6  //中断引脚

/*如果使用UNO或NANO,则使用软串口*/
#if ((defined ARDUINO_AVR_UNO) || (defined ARDUINO_AVR_NANO))
    #include <SoftwareSerial.h>
    SoftwareSerial Serial1(2, 3);  //RX, TX
    #define FPSerial Serial1
#else
    #define FPSerial Serial1
#endif

DFRobot_ID809 fingerprint;
//String desc;   //错误码信息,启用此功能将占用较大内存

void setup(){
  /*初始化打印串口*/
  Serial.begin(9600);
  /*初始化FPSerial*/
  FPSerial.begin(115200);
  /*将FPSerial作为指纹模块的通讯串口*/
  fingerprint.begin(FPSerial);
  /*等待Serial打开*/
  while(!Serial);
  /*测试设备与主控是否能正常通讯,
    返回true or false
    */
  while(fingerprint.isConnected() == false){
    Serial.println("与设备通讯失败,请检查接线");
    /*获取错误码信息*/
    //desc = fingerprint.getErrorDescription();
    //Serial.println(desc);
    delay(1000);
  }
}

//蓝灯 匹配模式  黄灯 注册模式  红灯  删除模式
void loop(){
  if(digitalRead(IRQ)){
    uint16_t i = 0;
    /*采集指纹图像,超过5S没按下手指则采集超时,如果timeout=0,关闭采集超时功能
      如果获取成功返回0,否则返回ERR_ID809
     */
    if((fingerprint.collectionFingerprint(/*timeout=*/5)) != ERR_ID809){
      /*获取手指按下时间*/
      /*设置指纹灯环模式、颜色和闪烁次数,
        可设置参数如下:
        参数1:<LEDMode>
        eBreathing   eFastBlink   eKeepsOn    eNormalClose
        eFadeIn      eFadeOut     eSlowBlink   
        参数2:<LEDColor>
        eLEDGreen  eLEDRed      eLEDYellow   eLEDBlue
        eLEDCyan   eLEDMagenta  eLEDWhite
        参数3:<呼吸、闪烁次数> 0表示一直呼吸、闪烁,
        该参数仅在eBreathing、eFastBlink、eSlowBlink模式下有效
       */
      fingerprint.ctrlLED(/*LEDMode = */fingerprint.eFastBlink, /*LEDColor = */fingerprint.eLEDBlue, /*blinkCount = */3);  //蓝灯快闪3次,表示正处于对比指纹模式
      /*等待手指松开*/
      while(fingerprint.detectFinger()){
        delay(50);
        i++;
        if(i == 15){             //黄灯快闪3次,表示正处于注册指纹模式
          /*设置指纹灯环为黄色常亮*/
          fingerprint.ctrlLED(/*LEDMode = */fingerprint.eFastBlink, /*LEDColor = */fingerprint.eLEDYellow, /*blinkCount = */3);
        }else if(i == 30){      //红灯快闪3次,表示正处于删除指纹模式
          /*设置指纹灯环为红色常亮*/
          fingerprint.ctrlLED(/*LEDMode = */fingerprint.eFastBlink, /*LEDColor = */fingerprint.eLEDRed, /*blinkCount = */3);
        }
      }
    }
    if(i == 0){
      /*采集指纹失败*/
    }else if(i > 0 && i < 15){
      Serial.println("进入匹配指纹模式");
      /*对比指纹*/
      fingerprintMatching();
    }else if(i >= 15 && i < 30){
      Serial.println("进入注册指纹模式");
      /*注册指纹*/
      fingerprintRegistration();
    }else{
      Serial.println("进入删除指纹模式");
      /*删除该指纹*/
      fingerprintDeletion();
    }
  }
}

//对比指纹
void fingerprintMatching(){
  /*将采集到的指纹与指纹库中的所有指纹对比,
    成功返回指纹编号(1-80),失败返回0
   */
  uint8_t ret = fingerprint.search();
  if(ret != 0){
    /*设置指纹灯环为绿色常亮*/
    fingerprint.ctrlLED(/*LEDMode = */fingerprint.eKeepsOn, /*LEDColor = */fingerprint.eLEDGreen, /*blinkCount = */0);
    Serial.print("匹配成功,ID=");
    Serial.println(ret);
  }else{
    /*设置指纹灯环为红色常亮*/
    fingerprint.ctrlLED(/*LEDMode = */fingerprint.eKeepsOn, /*LEDColor = */fingerprint.eLEDRed, /*blinkCount = */0);
    Serial.println("匹配失败");
  }
  delay(1000);
  /*关闭指纹灯环*/
  fingerprint.ctrlLED(/*LEDMode = */fingerprint.eNormalClose, /*LEDColor = */fingerprint.eLEDBlue, /*blinkCount = */0);
}

//注册指纹
void fingerprintRegistration(){
  uint8_t ID,i;
  /*将采集到的指纹与指纹库中的所有指纹对比,
    成功返回指纹编号(1-80),失败返回0
    此处作用:清除上次采集的指纹图像。
   */
  fingerprint.search();       //可增加判断语句,检测该指纹是否注册
  /*获取一个未注册编号,用来保存指纹
    获取成功返回ID号,
    获取失败返回ERR_ID809
   */
  if((ID = fingerprint.getEmptyID()) == ERR_ID809){
    while(1){
      /*获取错误码信息*/
      //desc = fingerprint.getErrorDescription();
      //Serial.println(desc);
      delay(1000);
    }
  }
  Serial.print("未注册编号,ID=");
  Serial.println(ID);
  i = 0;   //采样计数清零
  /*指纹采样三次*/
  while(i < COLLECT_NUMBER){
    /*设置指纹灯环为蓝色呼吸*/
    fingerprint.ctrlLED(/*LEDMode = */fingerprint.eBreathing, /*LEDColor = */fingerprint.eLEDBlue, /*blinkCount = */0);
    Serial.print("正在进行第");
    Serial.print(i+1);
    Serial.println("次指纹采样");
    Serial.println("请按下手指");
    /*采集指纹图像,超过10S没按下手指则采集超时
      如果获取成功返回0,否则返回ERR_ID809
     */
    if((fingerprint.collectionFingerprint(/*timeout = */10)) != ERR_ID809){
      /*设置指纹灯环为黄色快闪3次*/
      fingerprint.ctrlLED(/*LEDMode = */fingerprint.eFastBlink, /*LEDColor = */fingerprint.eLEDYellow, /*blinkCount = */3);
      Serial.println("采集成功");
      i++;   //采样计数+1
    }else{
      Serial.println("采集失败");
      /*获取错误码信息*/
      //desc = fingerprint.getErrorDescription();
      //Serial.println(desc);
    }
    Serial.println("请松开手指");
    /*等待手指松开
      检测到手指返回1,否则返回0
     */
    while(fingerprint.detectFinger());
  }

  /*将指纹信息保存到一个未注册的编号中*/
  if(fingerprint.storeFingerprint(/*Empty ID = */ID) != ERR_ID809){
    Serial.print("保存成功,ID=");
    Serial.println(ID);
    Serial.println("-----------------------------");
    /*设置指纹灯环为绿色常亮*/
    fingerprint.ctrlLED(/*LEDMode = */fingerprint.eKeepsOn, /*LEDColor = */fingerprint.eLEDGreen, /*blinkCount = */0);
    delay(1000);
    /*关闭指纹灯环*/
    fingerprint.ctrlLED(/*LEDMode = */fingerprint.eNormalClose, /*LEDColor = */fingerprint.eLEDBlue, /*blinkCount = */0);
  }else{
    Serial.println("保存失败");
    /*获取错误码信息*/
    //desc = fingerprint.getErrorDescription();
    //Serial.println(desc);
  }
}


//删除指纹
void fingerprintDeletion(){
  uint8_t ret;
  /*将采集到的指纹与指纹库中的所有指纹对比,
    成功返回指纹编号(1-80),失败返回0
   */
  ret = fingerprint.search();
  if(ret){
    /*设置指纹灯环为绿色常亮*/
    fingerprint.ctrlLED(/*LEDMode = */fingerprint.eKeepsOn, /*LEDColor = */fingerprint.eLEDGreen, /*blinkCount = */0);
    fingerprint.delFingerprint(ret);
    Serial.print("已删除指纹,ID=");
    Serial.println(ret);
  }else{
    /*设置指纹灯环为红色常亮*/
    fingerprint.ctrlLED(/*LEDMode = */fingerprint.eKeepsOn, /*LEDColor = */fingerprint.eLEDRed, /*blinkCount = */0);
    Serial.println("匹配失败或该指纹未注册");
  }
  delay(1000);
  /*关闭指纹灯环*/
  fingerprint.ctrlLED(/*LEDMode = */fingerprint.eNormalClose, /*LEDColor = */fingerprint.eLEDBlue, /*blinkCount = */0);
}               

SEN0348结果6

使用上位机控制

我们可以通过上位机程序来控制该模块,但前提是需要一个USB转串口模块将指纹模块与电脑连接

点击 下载指纹模块上位机

接线图

SEN0348串口驱动接线

程序使用

SEN0348上位机介绍

常见问题

还没有客户对此产品有任何问题,欢迎通过qq或者论坛联系我们!

更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。

更多

DFshopping_car1.png DFRobot商城购买链接