This capacitive fingerprint sensor supports fingerprint capture, image processing, fingerprint storage, fingerprint comparison and so on. Taking ID809 high-performance processor and semiconductor fingerprint sensor as the core, the sensor adopts built-in IDfinger6.0 algorithm, which can complete all fingerprint identification work independently. The product supports UART communication. When working with Arduino library, it can easily realize functions like fingerprint registration, fingerprint deletion, etc. Also, we provide an upper computer software to help users operate this sensor conveniently.
This fingerprint sensor comes with round breathing LEDs and has a simple structure, small size, and delicate appearance. The sensor offers fast recognition speed and high security. What’s more, it supports 360 degree arbitrary angle recognition and deep self-learning function, high performance and low power consumption.
Num | Label | Description |
---|---|---|
1 | GND | Ground |
2 | RX | UART recieve |
3 | TX | UART transmit |
4 | WAKE | Communication control: active high |
5 | IRQ | Finger sensing output:active high |
6 | 3.3V | Positive |
The module's default baud rate is 115200. You can use the following codes to check its buad rate(the buad rate will not be recovered to default value when the module is power off).
#include <DFRobot_ID809.h>
/*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;
uint32_t ID809_BPS[8] = {9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600};
uint8_t i = 0;
void setup(){
/*Init print serial port */
Serial.begin(9600);
/*Test module baud rate */
do{
/*Init FPSerial*/
Serial.print(".");
FPSerial.begin(ID809_BPS[i]);
/*Take FPSerial as communication port of fingerprint module */
fingerprint.begin(FPSerial);
i++;
}while(fingerprint.isConnected() == false);
Serial.println(" ");
}
void loop(){
Serial.print("Module baud rate:");
Serial.println(ID809_BPS[i-1]);
Serial.println("-----------------------------");
delay(1000);
}
Get and serial print the module information.
#include <DFRobot_ID809.h>
/*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(){
/*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*/
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");
/*Get error code information */
desc = fingerprint.getErrorDescription();
Serial.println(desc);
delay(1000);
}
}
uint8_t enrollCount; //Number of registered users
void loop(){
/*Set module ID, available range: 1-255*/
//fingerprint.setDeviceID(/*Device ID = */1);
Serial.print("Module ID:");
/*Read module ID*/
Serial.println(fingerprint.getDeviceID());
/*Set module security level, range 1-5. Default level: 3
Security Level Recognition rate
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("Module security level:");
/*Read module security level*/
Serial.println(fingerprint.getSecurityLevel());
/*Set module baud rate, available range:
e9600bps e19200bps e38400bps e57600bps
1 2 3 4
e115200bps e230400bps e460800bps e921600bps
5 6 7 8
*/
//fingerprint.setBaudrate(fingerprint.e115200bps);
Serial.print("Module baud rate: ");
/*Read module baud rate*/
Serial.println(fingerprint.getBaudrate());
/*Set module self-learning function, 1(ON) 0(OFF)*/
//fingerprint.setAutoLearn(/*Auto Learn = */1);
Serial.print("Module self-learning function: ");
/*Read the state of module self-learning function
Print ON if it is enabled, otherwise print OFF */
Serial.println(fingerprint.getSelfLearn()?"ON":"OFF");
/*Set module serial number, the number of characters of serial number should be small than 15 */
//fingerprint.setModuleSN(/*Module SN = */"DFRobot");
Serial.print("Module serial number:");
/*Read module serial number */
Serial.println(fingerprint.getModuleSN());
Serial.print("Number of registered fingerprints in the module:");
/*Get the number of registered users */
Serial.println(enrollCount = fingerprint.getEnrollCount());
/*Declare an array to hold ID list */
uint8_t list[80] = {0};
/*Get user list
*/
fingerprint.getEnrolledIDList(list);
Serial.print("ID list of registered users: ");
for(uint8_t i = 0; i < enrollCount; i++){
Serial.print(list[i]);
Serial.print(",");
}
Serial.print("\n Number of broken fingerprints:");
/*Get the number of broken fingerprints */
Serial.println(fingerprint.getBrokenQuantity());
/*Get the ID of the first broken fingerprint*/
//fingerprint.getBrokenID();
Serial.println("-----------------------------");
delay(1000);
}
This sample automatically obtains the registrable ID, then collects the fingerprint three times, the yellow light flashes three times successfully. At last, save the fingerprint to the acquired unregistered ID, the green light is on for 1s, and then turns off.
Collect the fingerprint image and compare it with the fingerprints in the fingerprint library. If the comparison succeeds, the green light will be on and the ID number will be printed. If it fails, the red light will be on and the matching failure will be prompted.
Run the codes to delete a specific fingerprint.
This example is a comprehensive application of fingerprint module, in which the module will enter into different modes according to the length of finger pressing time. When a finger pressed down, the blue light flashes 3 times to enter the fingerprint comparison mode; the yellow light flashes 3 times to enter the fingerprint registration mode; the red light flashes 3 times to enter the fingerprint deletion mode to delete the fingerprint. This experiment needs to connect IRQ pin to D6 pin.
#include <DFRobot_ID809.h>
#define COLLECT_NUMBER 3 //Fingerprint sampling times, can be set to 1-3
#define WAKEUP 6 //wake up pin
/*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(){
/*Init print serial*/
Serial.begin(9600);
/*Init FPSerial*/
FPSerial.begin(115200);
/*Take FPSerial as communication serial of fingerprint module*/
fingerprint.begin(FPSerial);
/*Wait for Serial to open*/
while(!Serial);
/*Test whether the device can properly communicate 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);
}
}
//Blue LED Comparison mode Yellow LED Registration mode Red Deletion mode
void loop(){
if(digitalRead(WAKEUP)){
uint16_t i = 0;
/*Capture fingerprint image, 5s idle timeout
Return 0 if succeed, otherwise return ERR_ID809
*/
if((fingerprint.collectionFingerprint(/*timeout=*/5)) != ERR_ID809){
/*Get the time finger pressed down*/
/*Set fingerprint LED ring mode, color, and number of blinks
Can be set as follows:
Parameter 1:<LEDMode>
eBreathing eFastBlink eKeepsOn eNormalClose
eFadeIn eFadeOut eSlowBlink
Paramerer 2:<LEDColor>
eLEDGreen eLEDRed eLEDYellow eLEDBlue
eLEDCyan eLEDMagenta eLEDWhite
Parameter 3:<number of blinks> 0 represents blinking all the time
This parameter will only be valid in mode eBreathing, eFastBlink, eSlowBlink
*/
fingerprint.ctrlLED(/*LEDMode = */fingerprint.eFastBlink, /*LEDColor = */fingerprint.eLEDBlue, /*blinkCount = */3); //blue LED blinks quickly 3 times, means it's in fingerprint comparison mode now
/*Wait for finger to relase */
while(fingerprint.detectFinger()){
delay(50);
i++;
if(i == 15){ //Yellow LED blinks quickly 3 times, means it's in fingerprint regisrtation mode now
/*Set fingerprint LED ring to always ON in yellow*/
fingerprint.ctrlLED(/*LEDMode = */fingerprint.eFastBlink, /*LEDColor = */fingerprint.eLEDYellow, /*blinkCount = */3);
}else if(i == 30){ //Red LED blinks quickly 3 times, means it's in fingerprint deletion mode now
/*Set fingerprint LED ring to always ON in red*/
fingerprint.ctrlLED(/*LEDMode = */fingerprint.eFastBlink, /*LEDColor = */fingerprint.eLEDRed, /*blinkCount = */3);
}
}
}
if(i == 0){
/*Fingerprint capturing failed*/
}else if(i > 0 && i < 15){
Serial.println("Enter fingerprint comparison mode");
/*Compare fingerprints*/
fingerprintMatching();
}else if(i >= 15 && i < 30){
Serial.println("Enter fingerprint registration mode");
/*Registrate fingerprint*/
fingerprintRegistration();
}else{
Serial.println("Enter fingerprint deletion mode");
/*Delete this fingerprint*/
fingerprintDeletion();
}
}
}
//Compare fingerprints
void fingerprintMatching(){
/*Compare the captured fingerprint with all fingerprints in the fingerprint library
Return fingerprint ID number(1-80) if succeed, return 0 when failed
*/
uint8_t ret = fingerprint.search();
if(ret != 0){
/*Set fingerprint LED ring to always ON in green*/
fingerprint.ctrlLED(/*LEDMode = */fingerprint.eKeepsOn, /*LEDColor = */fingerprint.eLEDGreen, /*blinkCount = */0);
Serial.print("Successfully matched,ID=");
Serial.println(ret);
}else{
/*Set fingerprint LED Ring to always ON in red*/
fingerprint.ctrlLED(/*LEDMode = */fingerprint.eKeepsOn, /*LEDColor = */fingerprint.eLEDRed, /*blinkCount = */0);
Serial.println("Matching failed");
}
delay(1000);
/*Turn off fingerprint LED Ring*/
fingerprint.ctrlLED(/*LEDMode = */fingerprint.eNormalClose, /*LEDColor = */fingerprint.eLEDBlue, /*blinkCount = */0);
Serial.println("-----------------------------");
}
//Fingerprint Registration
void fingerprintRegistration(){
uint8_t ID,i;
/*Compare the captured fingerprint with all fingerprints in the fingerprint library
Return fingerprint ID number(1-80) if succeed, return 0 when failed
Function: clear the last captured fingerprint image
*/
fingerprint.search(); //Can add "if else" statement to judge whether the fingerprint has been registered.
/*Get a unregistered ID for saving fingerprint
Return ID number when succeed
Return ERR_ID809 if failed
*/
if((ID = fingerprint.getEmptyID()) == ERR_ID809){
while(1){
/*Get error code imformation*/
desc = fingerprint.getErrorDescription();
Serial.println(desc);
delay(1000);
}
}
Serial.print("Unregistered ID,ID=");
Serial.println(ID);
i = 0; //Clear sampling times
/*Fingerprint Sampling 3 times */
while(i < COLLECT_NUMBER){
/*Set fingerprint LED ring to breathing lighting in blue*/
fingerprint.ctrlLED(/*LEDMode = */fingerprint.eBreathing, /*LEDColor = */fingerprint.eLEDBlue, /*blinkCount = */0);
Serial.print("The fingerprint sampling of the");
Serial.print(i+1);
Serial.println("(th) time is being taken");
Serial.println("Please press down your finger");
/*Capture fingerprint image, 10s idle timeout
If succeed return 0, otherwise return ERR_ID809
*/
if((fingerprint.collectionFingerprint(/*timeout = */10)) != ERR_ID809){
/*Set fingerprint LED ring to quick blink in yellow 3 times*/
fingerprint.ctrlLED(/*LEDMode = */fingerprint.eFastBlink, /*LEDColor = */fingerprint.eLEDYellow, /*blinkCount = */3);
Serial.println("Capturing succeeds");
i++; //Sampling times +1
}else{
Serial.println("Capturing fails");
/*Get error code information*/
desc = fingerprint.getErrorDescription();
Serial.println(desc);
}
Serial.println("Please release your finger");
/*Wait for finger to release
Return 1 when finger is detected, otherwise return 0
*/
while(fingerprint.detectFinger());
}
/*Save fingerprint information into an unregistered ID*/
if(fingerprint.storeFingerprint(/*Empty ID = */ID) != ERR_ID809){
Serial.print("Saving succeed,ID=");
Serial.println(ID);
/*Set fingerprint LED ring to always ON in green*/
fingerprint.ctrlLED(/*LEDMode = */fingerprint.eKeepsOn, /*LEDColor = */fingerprint.eLEDGreen, /*blinkCount = */0);
delay(1000);
/*Turn off fingerprint LED ring */
fingerprint.ctrlLED(/*LEDMode = */fingerprint.eNormalClose, /*LEDColor = */fingerprint.eLEDBlue, /*blinkCount = */0);
}else{
Serial.println("Saving failed");
/*Get error code information*/
desc = fingerprint.getErrorDescription();
Serial.println(desc);
}
Serial.println("-----------------------------");
}
//Fingerprint deletion
void fingerprintDeletion(){
uint8_t ret;
/*Compare the captured fingerprint with all the fingerprints in the fingerprint library
Return fingerprint ID(1-80) if succeed, return 0 when failed
*/
ret = fingerprint.search();
if(ret){
/*Set fingerprint LED ring to always ON in green*/
fingerprint.ctrlLED(/*LEDMode = */fingerprint.eKeepsOn, /*LEDColor = */fingerprint.eLEDGreen, /*blinkCount = */0);
fingerprint.delFingerprint(ret);
Serial.print("deleted fingerprint,ID=");
Serial.println(ret);
}else{
/*Set fingerprint LED ring to always ON in red*/
fingerprint.ctrlLED(/*LEDMode = */fingerprint.eKeepsOn, /*LEDColor = */fingerprint.eLEDRed, /*blinkCount = */0);
Serial.println("Matching failed or the fingerprint hasn't been registered");
}
delay(1000);
/*Turn off fingerprint LED ring*/
fingerprint.ctrlLED(/*LEDMode = */fingerprint.eNormalClose, /*LEDColor = */fingerprint.eLEDBlue, /*blinkCount = */0);
Serial.println("-----------------------------");
}
For controlling the module via upper host program, we need to connect this module to a computer with a USB to serial module.
Connection