Library for fingerprint R503 Adaptation from Arduino Library

Dependencies:   Fingerprint-Lib

This a library and demo for fingerprint R503

For datasheet, see here -> https://cdn-shop.adafruit.com/product-files/4651/4651_R503%20fingerprint%20module%20user%20manual.pdf

This is an adaptation of Adafruit library (Arduino) to ARM MBED, tested on NUCLEO L073RZ

https://os.mbed.com/media/uploads/cdupaty/r503b.jpg https://os.mbed.com/media/uploads/cdupaty/r503-nucleol073rzpetit.jpg

For this exemple default connexions on NUCLEOL073RZ are :

TX <-> PC_0

RX <-> PC_1

WAKEUP <-> PB_0 , this is an Interrupt , you must connect a pull-up resistor (4K to 15k) between WAKEUP and DC3.3v

Power Supply 3.3v on Arduino connector

3.3VT : 5v on Arduino connector

IMPORTANT !!! There ara yet some bugs with communications UART

main.cpp

Committer:
cdupaty
Date:
2021-05-26
Revision:
11:ed67623832a3
Parent:
9:0e0ddc4a53e3

File content as of revision 11:ed67623832a3:

/***************************************************
  This is an example sketch for our optical Fingerprint sensor
  Designed specifically to work with the Adafruit BMP085 Breakout
  ----> http://www.adafruit.com/products/751
  These displays use TTL Serial to communicate, 2 pins are required to
  interface
  Adafruit invests time and resources providing this open source code,
  please support Adafruit and open-source hardware by purchasing
  products from Adafruit!
  Written by Limor Fried/Ladyada for Adafruit Industries.
  BSD license, all text above must be included in any redistribution
  
  STM32 adaptation by Christian Dupaty 03/2021
 ****************************************************/

#include <Fingerprint.h>
#include "mbed.h" 
//#include "R503lib.h"
//#include "R503lib.cpp"

DigitalOut ledV(LED1); // for various information without terminal

Serial pc(USBTX, USBRX); // tx, rx
Fingerprint finger(PC_1,PC_0,0x0); // TX,TX,pass
InterruptIn fD(PB_0);               // IT from fingerprint detection (see datasheet WAKEUP)

uint8_t id=1;

bool fingerON=false;

DigitalIn btnBleu(USER_BUTTON);     // to start enroll



// interrupt funtion 
void fingerDetect(void)
{
    ledV=1;
    wait_ms(100); 
    ledV=0;
    fingerON=true;   
}



// original setup fonction on Arduino
void setup()
{
  pc.baud(9600);
  wait_ms(100);
  fD.fall(&fingerDetect);  
  pc.printf("\nR503 Finger detect test\nSTM32 version with MBED compiler and library\n");

  // set the data rate for the sensor serial port
  finger.begin(57600);
  wait_ms(200);
  if (finger.verifyPassword()) {
    pc.printf("\nFound fingerprint sensor!\n");
  } else {
    pc.printf("\nDid not find fingerprint sensor -> STOP !!!!\n");
    while (1)
    {
         ledV=1;
         wait_ms(100); 
         ledV=0;
         wait_ms(100); 
    }
  }

  pc.printf("Reading sensor parameters\n");
  finger.getParameters();
  pc.printf("Status: 0x%X\n",finger.status_reg);
  pc.printf("Sys ID: 0x%X\n",finger.system_id);
  pc.printf("Capacity: %d\n",finger.capacity);
  pc.printf("Security level: %d\n",finger.security_level);
  pc.printf("Device address: 0x%X\n",finger.device_addr);
  pc.printf("Packet len: %d\n",finger.packet_len);
  pc.printf("Baud rate: %d\n",finger.baud_rate);

  finger.getTemplateCount();

  if (finger.templateCount == 0) {
    pc.printf("Sensor doesn't contain any fingerprint data. Please run the 'enroll' example.\n");
  }
  else {
    pc.printf("Waiting for valid finger...\n");
    pc.printf("Sensor contains : %d templates\n",finger.templateCount);
  }

}

// --------------------------------------
uint8_t getFingerprintID() {
  uint8_t p = finger.getImage();
  switch (p) {
    case FINGERPRINT_OK:
      pc.printf("Image taken\n");
      break;
    case FINGERPRINT_NOFINGER:
      pc.printf("No finger detected\n");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      pc.printf("Communication error\n");
      return p;
    case FINGERPRINT_IMAGEFAIL:
      pc.printf("Imaging error\n");
      return p;
    default:
      pc.printf("Unknown error\n");
      return p;
  }

  // OK success!

  p = finger.image2Tz();
  switch (p) {
    case FINGERPRINT_OK:
      pc.printf("Image converted\n");
      break;
    case FINGERPRINT_IMAGEMESS:
      pc.printf("Image too messy\n");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      pc.printf("Communication error\n");
      return p;
    case FINGERPRINT_FEATUREFAIL:
      pc.printf("Could not find fingerprint feature\n");
      return p;
    case FINGERPRINT_INVALIDIMAGE:
      pc.printf("Could not find fingerprint features\n");
      return p;
    default:
      pc.printf("Unknown error\n");
      return p;
  }

  // OK converted!
  p = finger.fingerSearch();
  if (p == FINGERPRINT_OK) {
    pc.printf("Found a print match!\n");
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    pc.printf("Communication error\n");
    return p;
  } else if (p == FINGERPRINT_NOTFOUND) {
    pc.printf("Did not find a match\n");
    return p;
  } else {
    pc.printf("Unknown error\n");
    return p;
  }

  // found a match!
  pc.printf("Found ID #%d\n",finger.fingerID);
  pc.printf(" with confidence of %d\n",finger.confidence);

  return finger.fingerID;
}

// returns -1 if failed, otherwise returns ID #
int getFingerprintIDez() {
  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)  return -1;

  // found a match!
  pc.printf("Found ID #%d\n",finger.fingerID);
  pc.printf(" with confidence of %d\n",finger.confidence);
  return finger.fingerID;
}

void demoLED(void)
{
// control (3 on)(4off), speed (0-255) , color (1 red, 2 blue, 3 purple), cycles (0 infinit,- 255)
// LED fully on
  finger.LEDcontrol(FINGERPRINT_LED_ON, 0, FINGERPRINT_LED_RED);
  wait_ms(250);
  finger.LEDcontrol(FINGERPRINT_LED_ON, 0, FINGERPRINT_LED_BLUE);
  wait_ms(250);
  finger.LEDcontrol(FINGERPRINT_LED_ON, 0, FINGERPRINT_LED_PURPLE);
  wait_ms(250);

  // flash red LED
  finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 25, FINGERPRINT_LED_RED, 10);
  wait_ms(2000);
  // Breathe blue LED till we say to stop
  finger.LEDcontrol(FINGERPRINT_LED_BREATHING, 100, FINGERPRINT_LED_BLUE);
  wait_ms(3000);
  finger.LEDcontrol(FINGERPRINT_LED_GRADUAL_ON, 200, FINGERPRINT_LED_PURPLE);
  wait_ms(2000);
  finger.LEDcontrol(FINGERPRINT_LED_GRADUAL_OFF, 200, FINGERPRINT_LED_PURPLE);
  wait_ms(2000);
}

// enroll a fingerprint
uint8_t getFingerprintEnroll() 
{
  int p = -1;
  fD.fall(NULL); 
  pc.printf("Waiting for valid finger to enroll as #%d\n",id);
  while (p != FINGERPRINT_OK) 
  {
    p = finger.getImage();
    switch (p) 
    {
    case FINGERPRINT_OK:
      pc.printf("Image taken\n");
      break;
    case FINGERPRINT_NOFINGER:
      pc.printf(".");
      break;
    case FINGERPRINT_PACKETRECIEVEERR:
      pc.printf("Communication error\n");
      break;
    case FINGERPRINT_IMAGEFAIL:
      pc.printf("Imaging error\n");
      break;
    default:
      pc.printf("Unknown error\n");
      break;
    }
  }

  // OK success!

  p = finger.image2Tz(1);
  switch (p) {
    case FINGERPRINT_OK:
      pc.printf("Image converted");
      break;
    case FINGERPRINT_IMAGEMESS:
      pc.printf("Image too messy\n");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      pc.printf("Communication error\n");
      return p;
    case FINGERPRINT_FEATUREFAIL:
      pc.printf("Could not find fingerprint features\n");
      return p;
    case FINGERPRINT_INVALIDIMAGE:
      pc.printf("Could not find fingerprint features\n");
      return p;
    default:
      pc.printf("Unknown error\n");
      return p;
  }

  pc.printf("Remove finger\n");
  wait(2);
  p = 0;
  while (p != FINGERPRINT_NOFINGER) {
    p = finger.getImage();
  }
  pc.printf("ID %d\n",id);
  p = -1;
  pc.printf("Place same finger again\n");
  while (p != FINGERPRINT_OK) {
    p = finger.getImage();
    switch (p) {
    case FINGERPRINT_OK:
      pc.printf("Image taken\n");
      break;
    case FINGERPRINT_NOFINGER:
      pc.printf(".");
      break;
    case FINGERPRINT_PACKETRECIEVEERR:
      pc.printf("Communication error\n");
      break;
    case FINGERPRINT_IMAGEFAIL:
      pc.printf("Imaging error\n");
      break;
    default:
      pc.printf("Unknown error\n");
      break;
    }
  }

  // OK success!

  p = finger.image2Tz(2);
  switch (p) {
    case FINGERPRINT_OK:
      pc.printf("Image converted\n");
      break;
    case FINGERPRINT_IMAGEMESS:
      pc.printf("Image too messy\n");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      pc.printf("Communication error\n");
      return p;
    case FINGERPRINT_FEATUREFAIL:
      pc.printf("Could not find fingerprint features\n");
      return p;
    case FINGERPRINT_INVALIDIMAGE:
      pc.printf("Could not find fingerprint features\n");
      return p;
    default:
      pc.printf("Unknown error\n");
      return p;
  }

  // OK converted!
  pc.printf("Creating model for #%d\n",id); 

  p = finger.createModel();
  if (p == FINGERPRINT_OK) {
    pc.printf("Prints matched!\n");
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    pc.printf("Communication error\n");
    return p;
  } else if (p == FINGERPRINT_ENROLLMISMATCH) {
    pc.printf("Fingerprints did not match\n");
    return p;
  } else {
    pc.printf("Unknown error\n");
    return p;
  }

  pc.printf("ID %d\n",id);
  p = finger.storeModel(id);
  if (p == FINGERPRINT_OK) {
    pc.printf("Stored!\n");
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    pc.printf("Communication error\n");
    return p;
  } else if (p == FINGERPRINT_BADLOCATION) {
    pc.printf("Could not store in that location\n");
    return p;
  } else if (p == FINGERPRINT_FLASHERR) {
    pc.printf("Error writing to flash\n");
    return p;
  } else {
    pc.printf("Unknown error\n");
    return p;
  }
  fD.fall(&fingerDetect); 
  return true;
}


int main(void)                    // run over and over again
{
unsigned char c=1;
  setup();
  demoLED();
  finger.LEDcontrol(3,128,1,10);
  pc.printf("\nPret ! \n");
  while(1)
  {

      if (fingerON)
      {
          pc.printf("Doigt detecte ! \n");     
          fingerON=false;
          getFingerprintID();
          pc.printf("\nPret ! \n");
      }
      if (!btnBleu)
      {
        pc.printf("\nEnregistrement empreinte \n");
        c=getFingerprintEnroll();
        pc.printf("\nPret ! \n");
      }
      wait_ms(500);            //don't need to run this at full speed.
  }
 // return 0;
}