简介
该电容指纹模块集指纹采集、处理、存储及指纹比对为一体。以高性能处理器和半导体指纹传感器为核心,内置 IDfinger6.0指纹算法,能够独立完成全部的指纹识别工作。该模块采用标准UART通讯,配合Arduino库,非常容易实现录入指纹、删除指纹、比对指纹等指纹识别功能。同时我们提供了一个上位机软件,通过该软件就能操作该模块。
该模块外观精致轻薄一体化,指纹识别速度快、安全性高,支持360度任意角度识别、深度自学习功能、高性能、低功耗。
⚠注意:
- 建议您使用硬串口驱动指纹模块,如果使用软串口驱动,可能会因为软串口不稳定,导致不可预知的错误。使用软串口驱动建议将模块波特率降到9600。
API:fingerprint.setBaudrate(fingerprint.e9600bps); - 该指纹模块没有LED灯环,示例代码中的控制灯环代码无效,WIKI中关于灯环的现象描述无效。
特性
- 360°指纹录入与匹配
- 自动学习功能
- 轻薄易安装
应用场景
- 指纹门锁
- 抽屉锁
- 身份识别
- 授权许可
技术规格
- 工作电压:3.3V
- 工作电流:<40mA
- 通信方式:UART
- 存储容量:80枚指纹
- 1:N的验证时间:<0.5S
- 像素分辨率: 508dpi
- 像素点数:160x160
- 工作环境:‐10‐60℃ / 20% – 80%RH
- 尺寸:直径19mm
引脚说明
序号 | 名称 | 功能描述 |
---|---|---|
Pin 1 | GND | 公共地 |
Pin 2 | RX | UART接收 |
Pin 3 | TX | UART发射 |
Pin 4 | VIN | 模块处理器电源(3.3V):接通电源工作,断开电源休眠 |
Pin 5 | IRQ | 手指感应输出:高电平有效 |
Pin 6 | 3.3V | 采集器常供电源 |
使用教程
准备
-
硬件
- Arduino Leonardo控制板 x 1
- 电容指纹模块 - UART (FPC接口) x1
- 若干 杜邦线
-
软件
- Arduino IDE,点击下载Arduino IDE
- 点击 下载ID809库文件.
关于如何安装库文件,点击连接
-
常用API接口函数列表
/**
* @brief 测试模块是否正常连接
* @return true or false
*/
bool isConnected();
/**
* @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();
/*设置模块波特率,可设置范围如下所示:
e9600bps e19200bps e38400bps e57600bps e115200bps
1 2 3 4 5
*/
fingerprint.setBaudrate(fingerprint.e115200bps);
接线图
样例代码1 - 查询模块波特率
模块默认波特率为115200,如果不知道模块的波特率可以使用该代码查询(模块掉电后波特率并不会恢复为默认值)
/*!
* @file queryDeviceBPS.ino
* @brief 查询设备波特率
* @n 实验现象:查询设备波特率,并通过串口打印出来
* @copyright Copyright (c) 2010 DFRobot Co.Ltd (https://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);
/*测试模块波特率*/
FPSerial.begin(ID809_BPS[i]);
Serial.print(".");
while(fingerprint.begin(FPSerial) == false){
i++;
FPSerial.begin(ID809_BPS[i]);
Serial.print(".");
}
Serial.println(" ");
}
void loop(){
Serial.print("模块波特率为:");
Serial.println(ID809_BPS[i]);
Serial.println("-----------------------------");
delay(1000);
}
- 结果
样例代码2 - 获取或设置模块信息
获取模块的参数信息并通过串口打印
/*!
* @file getDeviceInformation.ino
* @brief 获取指纹模块信息
* @n 实验现象:串口打印出模块的ID、安全等级、波特率等信息
* @copyright Copyright (c) 2010 DFRobot Co.Ltd (https://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);
}
- Result
样例代码3 - 增加指纹
本样例自动获取可注册ID,然后采集三次指纹,采集成功黄色灯快闪3次,最后将指纹保存到获取到的未注册的编号中,绿色灯亮1S然后熄灭
/*!
* @file fingerprintRegistration.ino
* @brief 采集指纹并保存
* @n 该模块可以使用硬串口或软串口控制
* @n 实验现象:自动获取空白ID,然后采集三次指纹,采集时
* @n 设置灯环为蓝色呼吸灯,采集成功黄色灯快闪
* @n 3次,最后将指纹保存到获取到的未注册的编
* @n 号中,绿色灯亮1S然后熄灭
* @copyright Copyright (c) 2010 DFRobot Co.Ltd (https://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);
}
}
- 结果
样例代码4 - 指纹匹配
采集指纹图像并与指纹库中的指纹做对比,对比成功亮绿色灯并打印ID号,对比失败亮红色灯并提示匹配失败
/*!
* @file fingerprintMatching.ino
* @brief 采集指纹并与指纹库中指纹做对比
* @n 实验现象:采集指纹图像并与指纹库中的指纹最对比,
对比成功亮绿色灯并打印ID号,对比失败返回0
* @copyright Copyright (c) 2010 DFRobot Co.Ltd (https://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("请按下手指");
/*采集指纹图像,关闭采集超时功能
如果获取成功返回0,否则返回ERR_ID809
*/
if((fingerprint.collectionFingerprint(/*timeout=*/0)) != 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);
}
- 结果
样例代码5 - 删除指纹
运行代码,按下需要删除指纹的手指
/*!
* @file fingerprintDeletion.ino
* @brief 删除指定指纹
* @n 实验现象:按下手指,如果该手指指纹已注册则删除指纹,并亮绿灯
如果未注册或采集指纹失败,则亮红灯
* @copyright Copyright (c) 2010 DFRobot Co.Ltd (https://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);
}
- 结果
样例代码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 (https://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);
}
- 结果
样例代码7 - 指纹与模板数据对比
按下手指即可与模板数据进行比较,模板数据不占用指纹存储同类,用于对比的模板数据存储在一个数组中,因此模板数据可来自于外部(例如SD卡,云端)。使用该示例前请确保ID1中保存有指纹。
/*!
*@file contrastTemplate.ino
*@brief Extract the ID 1 fingerprint template, and collect fingerprint to compare with it.
*@copyright Copyright (c) 2010 DFRobot Co.Ltd (https://www.dfrobot.com)
*@licence The MIT License (MIT)
*@author [fengli](li.feng@dfrobot.com)
*@version V1.0
*@date 2021-6-01
*@get from https://www.dfrobot.com
*@https://github.com/DFRobot/DFRobot_ID809
*/
#include <DFRobot_ID809.h>
uint8_t temp[1008]={0}; //Template data
/*Use software serial when using UNO or 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);
}
//获取ID 1的指纹模板
fingerprint.getTemplate(/*id = */1,temp);
//将模板数据下载到ID 1中
//fingerprint.downLoadTemplate(/*id = */1,temp);
}
void loop(){
/*设置指纹LED环为蓝色呼吸灯*/
fingerprint.ctrlLED(/*LEDMode = */fingerprint.eBreathing, /*LEDColor = */fingerprint.eLEDBlue, /*blinkCount = */0);
Serial.println("请按下手指");
/*采集指纹图像,关闭采集超时功能
如果获取成功返回0,否则返回ERR_ID809
采集一次指纹模板数据,然后储存到rambuffer0
*/
if((fingerprint.collectionFingerprint(/*timeout=*/0,0)) != ERR_ID809){
/*设置指纹灯环为黄色快闪3次*/
fingerprint.ctrlLED(/*LEDMode = */fingerprint.eFastBlink, /*LEDColor = */fingerprint.eLEDYellow, /*blinkCount = */3);
Serial.println("采集成功");
Serial.println("请松开手指");
/*等待手指松开
检测到手指返回1,否则返回0
*/
while(fingerprint.detectFinger());
//将模板数据与采集的指纹做对比
if(!fingerprint.contrastTemplate(/*TEMP = */temp)){
/*设置指纹灯环为绿色常亮*/
fingerprint.ctrlLED(/*LEDMode = */fingerprint.eKeepsOn, /*LEDColor = */fingerprint.eLEDGreen, /*blinkCount = */0);
Serial.println("对比成功,模板与手指匹配");
}else{
/*Set fingerprint LED ring to always ON in red*/
fingerprint.ctrlLED(/*LEDMode = */fingerprint.eKeepsOn, /*LEDColor = */fingerprint.eLEDRed, /*blinkCount = */0);
Serial.println("对比失败,模板手指不匹配");
}
}else{
Serial.println("采集失败");
}
Serial.println("-----------------------------");
delay(1000);
}
- 结果
样例代码8 - 显示指纹图像
该示例将演示采集、显示指纹图像,并将指纹图像保存到SD卡中。
示例使用的其他设备
DFR0652 FireBeetle 2 ESP32-E IoT 开发板
DFR0664 Fermion: 2.0" 320x240 IPS TFT LCD Display with MicroSD Card (Breakout)
注意:由于图像数据过大,请使用高性能主控。如果使用其他主控请根据主控选择相应串口和修改SD部分代码。
/*!
*@file getQuarterFingerImage.ino
*@brief 将采集到的指纹图像储存与SD卡中,并显示在屏幕上,可选择获取1/4图像或者全图像
*该示例需要搭配屏幕和SD卡模块使用,并且使用高性能主控
*@copyright Copyright (c) 2010 DFRobot Co.Ltd (https://www.dfrobot.com)
*@licence The MIT License (MIT)
*@author [fengli](li.feng@dfrobot.com)
*@version V1.0
*@date 2021-6-01
*@get from https://www.dfrobot.com
*@https://github.com/DFRobot/DFRobot_ID809
*/
#include <DFRobot_ID809.h>
#include "bmpHeader.h"
#include <SD.h>
#include "DFRobot_GDL.h"
//Custom communication pins
/*M0*/
#if defined ARDUINO_SAM_ZERO
#define TFT_DC 7
#define TFT_CS 5
#define TFT_RST 6
/*ESP32*/
#elif defined ESP32
#define TFT_DC D7
#define TFT_CS D8
#define TFT_RST D9
/* AVR series mainboard */
#else
#define TFT_DC 2
#define TFT_CS 3
#define TFT_RST 4
#endif
/*请根据使用的主控选择串口*/
#define FPSerial Serial1
DFRobot_ILI9341_240x320_HW_SPI screen(/*dc=*/TFT_DC,/*cs=*/TFT_CS,/*rst=*/TFT_RST);
DFRobot_ID809 fingerprint;
//String desc;
File myFile;
#define QUARTER
#ifdef QUARTER
uint8_t data[6400]; //四分之一图像
#else
uint8_t data[25600]; //全尺寸图像
#endif
void setup(){
/*Init print serial port */
Serial.begin(9600);
/*Init FPSerial*/
FPSerial.begin(115200);
/*Take FPSerial as communication port of fingerprint module */
fingerprint.begin(FPSerial);
screen.begin();
screen.fillScreen(0xFFFF);
/*Wait for Serial to open*/
/*Test whether device can communicate properly with mainboard
Return true or false
*/
while(fingerprint.isConnected() == false){
Serial.println("Communication with device failed, please check connection");
/*Get error code information */
//desc = fingerprint.getErrorDescription();
//Serial.println(desc);
delay(1000);
}
/*请根据主控对于的SD库初始化SD卡模块*/
while(!SD.begin(/*csPin = */3, /*type = */TYPE_NONBOARD_SD_MOUDLE)) {
SerialUSB.println("initialization failed!");
delay(1000);
}
}
void loop(){
/*设置指纹LED环为蓝色呼吸灯*/
fingerprint.ctrlLED(/*LEDMode = */fingerprint.eBreathing, /*LEDColor = */fingerprint.eLEDBlue, /*blinkCount = */0);
Serial.println("Please release your finger");
/*Wait for finger to release
Return 1 when finger is detected, otherwise return 0
*/
while(!fingerprint.detectFinger());
#ifdef QUARTER //采集四分之一大小图像
fingerprint.getQuarterFingerImage(data);
#else //采集全尺寸图像
fingerprint.getFingerImage(data);
#endif
myFile = SD.open("finger.bmp", FILE_WRITE);
#ifdef QUARTER
myFile.write((const char *)bmpHeader, sizeof(bmpHeader));
for(uint8_t i = 0;i < 13 ;i++){
if(i == 12){
myFile.write((const char *)data+i*512, 256);
break;
}
myFile.write((const char *)data+i*512, 512);
}
myFile.close();
//将图片显示在屏幕上
for(uint16_t i = 0; i < 6400 ;i++){
uint8_t a = i % 80;
uint8_t b = i / 80;
screen.drawPixel(80+a,120+b,(data[i]/4)<<5);
}
#else
//将图片保存为bmp格式的文件到SD卡
bmpHeader[18] = 0xa0;
bmpHeader[22] = 0xa0;
myFile.write((const char *)bmpHeader, sizeof(bmpHeader));
for(uint8_t i = 0;i < 50 ;i++){
myFile.write((const char *)data+i*512, 512);
}
myFile.close();
//将图片显示在屏幕上
for(uint16_t i = 0; i < 25600 ;i++){
uint8_t a = i % 160;
uint8_t b = i / 160;
screen.drawPixel(40+a,80+b,(data[i]/4)<<5);
}
#endif
while(1);
}
样例代码9 - 低功耗模式演示
通过继电器控制VIN引脚使指纹模块进入低功耗模式。
如何进入休眠:先发送enterSleepStation(),再断开VIN供电(此时模块电流在10uA以下)
如何唤醒:主控监测到IRQ引脚有信号输出(手指按在指纹模块上,IRQ引脚会产生脉冲信号),给VIN供电,通过fingerprint.isConnected()判断模块正常通讯后即可正常使用
/*!
* @file 低功耗演示.ino
* @brief 通过继电器控制VIN引脚使指纹模块进入低功耗模式
* @n Experiment Phenomenon:如果不按下手指模块10S后进入休眠模式,按下手指时退出休眠模式并点亮灯环
* @copyright Copyright (c) 2010 DFRobot Co.Ltd (https://www.dfrobot.com)
* @licence The MIT License (MIT)
* @author [Eddard](Eddard.liu@dfrobot.com)
* @version V1.0
* @date 2021-08-20
* @get from https://www.dfrobot.com
* @url https://github.com/DFRobot/DFRobot_ID809
*/
#include <DFRobot_ID809.h>
#define IRQ 6
#define RELAY 7
/*Use software serial when using UNO or 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;
long long curr = 0;
uint8_t sleepFlag = 1;
void setup(){
/*Init print serial port */
Serial.begin(9600);
/*Init FPSerial*/
FPSerial.begin(115200);
/*Take FPSerial as communication port of fingerprint module */
fingerprint.begin(FPSerial);
/*Wait for Serial to open*/
pinMode(RELAY, OUTPUT);
digitalWrite(RELAY, HIGH);
delay(100); //延时100ms等待指纹模块启动
while(!Serial);
/*Test whether device can communicate properly with mainboard
Return true or false
*/
while(fingerprint.isConnected() == false){
Serial.println("Communication with device failed, please check connection");
delay(1000);
}
Serial.println("模块初始化成功,如果不按下手指10S后进入休眠");
fingerprint.ctrlLED(/*LEDMode = */fingerprint.eBreathing, /*LEDColor = */fingerprint.eLEDBlue, /*blinkCount = */0);
}
void loop(){
if(digitalRead(IRQ) && (sleepFlag == 0)){
digitalWrite(RELAY, HIGH);
Serial.println("模块退出休眠模式");
delay(100); //延时100ms等待指纹模块启动
curr = millis();
sleepFlag = 1;
if(fingerprint.isConnected() == true){
Serial.println("模块通讯恢复正常");
fingerprint.ctrlLED(/*LEDMode = */fingerprint.eBreathing, /*LEDColor = */fingerprint.eLEDBlue, /*blinkCount = */0);
} else{
Serial.println("模块通讯恢复失败");
}
}
if((sleepFlag == 1)&&(millis() - curr > 10000)){
fingerprint.enterStandbyState(); //先让模块进入待机模式再断开VIN电源
digitalWrite(RELAY, LOW);
sleepFlag = 0;
Serial.println("模块进入休眠模式");
}
}
- 结果
如果不按下手指模块10S后进入休眠模式,按下手指时退出休眠模式并点亮灯环
使用上位机控制
我们可以通过上位机程序来控制该模块,但前提是需要一个USB转串口模块将指纹模块与电脑连接
点击 下载指纹模块上位机
接线图
程序使用
常见问题
还没有客户对此产品有任何问题,欢迎通过qq或者论坛联系我们!
更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。