diff --git a/Adafruit_Fingerprint.cpp b/Adafruit_Fingerprint.cpp index 34e4fe1..60d8847 100644 --- a/Adafruit_Fingerprint.cpp +++ b/Adafruit_Fingerprint.cpp @@ -139,7 +139,10 @@ void Adafruit_Fingerprint::begin(uint32_t baudrate) { */ /**************************************************************************/ boolean Adafruit_Fingerprint::verifyPassword(void) { - return checkPassword() == FINGERPRINT_OK; + if(checkPassword() == FINGERPRINT_OK){ + return getParameters()== FINGERPRINT_OK; //properly configure the object by reading system parameters + } + return false; } uint8_t Adafruit_Fingerprint::checkPassword(void) { @@ -266,6 +269,67 @@ uint8_t Adafruit_Fingerprint::getModel(void) { SEND_CMD_PACKET(FINGERPRINT_UPLOAD, 0x01); } +/**************************************************************************/ +/*! + @brief read template data from the sensor + @returns a buffer where the template's 512 bytes are stored +*/ +/**************************************************************************/ +uint8_t Adafruit_Fingerprint::get_template_buffer(int bufsize,uint8_t ref_buf[]) { //new addition + int div=ceil(bufsize/packet_len); + int rcv_bt_len=(packet_len+11)*div; //data packet contains 11 extra bytes(first->2-header,4-address,1-type,2-length,last->2-checksum) excpet the main data + uint8_t bytesReceived[rcv_bt_len]; + memset(bytesReceived, 0xff, rcv_bt_len); + uint32_t starttime = millis(); + int i = 0; + while (iavailable()) { + starttime = millis(); + bytesReceived[i++] = mySerial->read(); + } + } + if(i!=rcv_bt_len) return FINGERPRINT_TIMEOUT; + memset(ref_buf, 0xff, bufsize); + for(int m=0;mdata, data, length); else - memcpy(this->data, data, 64); + memcpy(this->data, data, 256); } uint16_t start_code; ///< "Wakeup" code for packet detection uint8_t address[4]; ///< 32-bit Fingerprint sensor address uint8_t type; ///< Type of packet uint16_t length; ///< Length of packet - uint8_t data[64]; ///< The raw buffer for packet payload + uint8_t data[256]; ///< The raw buffer for packet payload }; ///! Helper class to communicate with and keep state for fingerprint sensors @@ -180,6 +181,9 @@ class Adafruit_Fingerprint { uint8_t storeModel(uint16_t id); uint8_t loadModel(uint16_t id); uint8_t getModel(void); + uint8_t get_template_buffer(int bufsize,uint8_t ref_buf[]); // new addiiton,for getting template data from sensor + uint8_t downloadModel(uint8_t buffer_no); //new addiiton,for loading template data to buffer + boolean write_template_to_sensor(int temp_Size, uint8_t ref_buf[]) ; // new addition, for writing template data to sensor uint8_t deleteModel(uint16_t id); uint8_t fingerFastSearch(void); uint8_t fingerSearch(uint8_t slot = 1); @@ -207,11 +211,11 @@ class Adafruit_Fingerprint { uint16_t status_reg = 0x0; ///< The status register (set by getParameters) uint16_t system_id = 0x0; ///< The system identifier (set by getParameters) - uint16_t capacity = 64; ///< The fingerprint capacity (set by getParameters) + uint16_t capacity = 127; ///< The fingerprint capacity (set by getParameters) uint16_t security_level = 0; ///< The security level (set by getParameters) uint32_t device_addr = 0xFFFFFFFF; ///< The device address (set by getParameters) - uint16_t packet_len = 64; ///< The max packet length (set by getParameters) + uint16_t packet_len = 128; ///< The max packet length (set by getParameters) uint16_t baud_rate = 57600; ///< The UART baud rate (set by getParameters) private: diff --git a/examples/show_fingerprint_templates/show_fingerprint_templates.ino b/examples/show_fingerprint_templates/show_fingerprint_templates.ino deleted file mode 100644 index d4f2a2d..0000000 --- a/examples/show_fingerprint_templates/show_fingerprint_templates.ino +++ /dev/null @@ -1,164 +0,0 @@ -/*************************************************** - This is an example sketch for our optical Fingerprint sensor - - 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 - ****************************************************/ - - -#include - -#if (defined(__AVR__) || defined(ESP8266)) && !defined(__AVR_ATmega2560__) -// For UNO and others without hardware serial, we must use software serial... -// pin #2 is IN from sensor (GREEN wire) -// pin #3 is OUT from arduino (WHITE wire) -// Set up the serial port to use softwareserial.. -SoftwareSerial mySerial(2, 3); - -#else -// On Leonardo/M0/etc, others with hardware serial, use hardware serial! -// #0 is green wire, #1 is white -#define mySerial Serial1 - -#endif - - -Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial); - -int getFingerprintIDez(); - -void setup() -{ - while (!Serial); - Serial.begin(9600); - Serial.println("Fingerprint template extractor"); - - // set the data rate for the sensor serial port - finger.begin(57600); - - if (finger.verifyPassword()) { - Serial.println("Found fingerprint sensor!"); - } else { - Serial.println("Did not find fingerprint sensor :("); - while (1); - } - - // Try to get the templates for fingers 1 through 10 - for (int finger = 1; finger < 10; finger++) { - downloadFingerprintTemplate(finger); - } -} - -uint8_t downloadFingerprintTemplate(uint16_t id) -{ - Serial.println("------------------------------------"); - Serial.print("Attempting to load #"); Serial.println(id); - uint8_t p = finger.loadModel(id); - switch (p) { - case FINGERPRINT_OK: - Serial.print("Template "); Serial.print(id); Serial.println(" loaded"); - break; - case FINGERPRINT_PACKETRECIEVEERR: - Serial.println("Communication error"); - return p; - default: - Serial.print("Unknown error "); Serial.println(p); - return p; - } - - // OK success! - - Serial.print("Attempting to get #"); Serial.println(id); - p = finger.getModel(); - switch (p) { - case FINGERPRINT_OK: - Serial.print("Template "); Serial.print(id); Serial.println(" transferring:"); - break; - default: - Serial.print("Unknown error "); Serial.println(p); - return p; - } - - // one data packet is 267 bytes. in one data packet, 11 bytes are 'usesless' :D - uint8_t bytesReceived[534]; // 2 data packets - memset(bytesReceived, 0xff, 534); - - uint32_t starttime = millis(); - int i = 0; - while (i < 534 && (millis() - starttime) < 20000) { - if (mySerial.available()) { - bytesReceived[i++] = mySerial.read(); - } - } - Serial.print(i); Serial.println(" bytes read."); - Serial.println("Decoding packet..."); - - uint8_t fingerTemplate[512]; // the real template - memset(fingerTemplate, 0xff, 512); - - // filtering only the data packets - int uindx = 9, index = 0; - memcpy(fingerTemplate + index, bytesReceived + uindx, 256); // first 256 bytes - uindx += 256; // skip data - uindx += 2; // skip checksum - uindx += 9; // skip next header - index += 256; // advance pointer - memcpy(fingerTemplate + index, bytesReceived + uindx, 256); // second 256 bytes - - for (int i = 0; i < 512; ++i) { - //Serial.print("0x"); - printHex(fingerTemplate[i], 2); - //Serial.print(", "); - } - Serial.println("\ndone."); - - return p; - - /* - uint8_t templateBuffer[256]; - memset(templateBuffer, 0xff, 256); //zero out template buffer - int index=0; - uint32_t starttime = millis(); - while ((index < 256) && ((millis() - starttime) < 1000)) - { - if (mySerial.available()) - { - templateBuffer[index] = mySerial.read(); - index++; - } - } - - Serial.print(index); Serial.println(" bytes read"); - - //dump entire templateBuffer. This prints out 16 lines of 16 bytes - for (int count= 0; count < 16; count++) - { - for (int i = 0; i < 16; i++) - { - Serial.print("0x"); - Serial.print(templateBuffer[count*16+i], HEX); - Serial.print(", "); - } - Serial.println(); - }*/ -} - - - -void printHex(int num, int precision) { - char tmp[16]; - char format[128]; - - sprintf(format, "%%.%dX", precision); - - sprintf(tmp, format, num); - Serial.print(tmp); -} - -void loop() -{} - diff --git a/examples/template_transfer/get_direct_template/get_direct_template.ino b/examples/template_transfer/get_direct_template/get_direct_template.ino new file mode 100644 index 0000000..1bb9397 --- /dev/null +++ b/examples/template_transfer/get_direct_template/get_direct_template.ino @@ -0,0 +1,104 @@ +/******************************************************************************************* + Author: Md. Asifuzzaman Khan (HAALniner21) + Date:9/3/2022 + + This example shows how to save template data to an 512 byte array buffer for further + manipulation (i.e: save in SD card or cloud). + + You can load this data on the 'fingerTemplate' buffer of the "write_template_from_SD.ino" + example to write it back to the sensor. + + Happy coding! :) + *******************************************************************************************/ +#include +#include + +SoftwareSerial swser(6, 7); // RX, TX + +Adafruit_Fingerprint finger = Adafruit_Fingerprint(&swser, 0); + + +uint8_t f_buf[512]; //here is where the template data is sotred + +void setup() { + Serial.begin(9600); + finger.begin(57600); //set your sensor's baudrate + if (finger.verifyPassword()) { + Serial.println("Found fingerprint sensor!"); + } else { + Serial.println("Did not find fingerprint sensor :("); + while (1); + } + store_template_to_buf(); +} + + +void store_template_to_buf(){ + + Serial.println("Waiting for valid finger...."); + while (finger.getImage() != FINGERPRINT_OK) { // press down a finger take 1st image + } + Serial.println("Image taken"); + + + if (finger.image2Tz(1) == FINGERPRINT_OK) { //creating the charecter file for 1st image + Serial.println("Image converted"); + } else { + Serial.println("Conversion error"); + return; + } + + Serial.println("Remove finger"); + delay(2000); + uint8_t p = 0; + while (p != FINGERPRINT_NOFINGER) { + p = finger.getImage(); + } + + Serial.println("Place same finger again, waiting...."); + while (finger.getImage() != FINGERPRINT_OK) { // press the same finger again to take 2nd image + } + Serial.println("Image taken"); + + + if (finger.image2Tz(2) == FINGERPRINT_OK) { //creating the charecter file for 2nd image + Serial.println("Image converted"); + } else { + Serial.println("Conversion error"); + return; + } + + + Serial.println("Creating model..."); + + if (finger.createModel() == FINGERPRINT_OK) { //creating the template from the 2 charecter files and saving it to char buffer 1 + Serial.println("Prints matched!"); + Serial.println("Template created"); + } else { + Serial.println("Template not build"); + return; + } + + Serial.println("Attempting to get template..."); + if (finger.getModel() == FINGERPRINT_OK) { //requesting sensor to transfer the template data to upper computer (this microcontroller) + Serial.println("Transferring Template...."); + } else { + Serial.println("Failed to transfer template"); + return; + } + + if (finger.get_template_buffer(512, f_buf) == FINGERPRINT_OK) { //read the template data from sensor and save it to buffer f_buf + Serial.println("Template data (comma sperated HEX):"); + for (int k = 0; k < (512/finger.packet_len); k++) { //printing out the template data in seperate rows, where row-length = packet_length + for (int l = 0; l < finger.packet_len; l++) { + Serial.print("0x"); + Serial.print(f_buf[(k * finger.packet_len) + l], HEX); + Serial.print(","); + } + Serial.println(""); + } + } + +} + +void loop() {} diff --git a/examples/template_transfer/show_saved_template/show_saved_template.ino b/examples/template_transfer/show_saved_template/show_saved_template.ino new file mode 100644 index 0000000..57bdf9a --- /dev/null +++ b/examples/template_transfer/show_saved_template/show_saved_template.ino @@ -0,0 +1,86 @@ +/******************************************************************************************* + Author: Md. Asifuzzaman Khan (HAALniner21) + Date:9/3/2022 + + This example shows how to read already saved template data from the sensor + + Happy coding! :) + *******************************************************************************************/ + +#include + +#include +SoftwareSerial swser(6, 7); // RX, TX + +#define mySerial swser + +Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial, 0); + +void setup() +{ Serial.begin(115200); + finger.begin(57600); + delay(5000); + if (finger.verifyPassword()) { + Serial.println("Found fingerprint sensor!"); + } else { + Serial.println("Did not find fingerprint sensor :("); + while (1); + } + + Serial.print(F("Status: 0x")); Serial.println(finger.status_reg, HEX); + Serial.print(F("Sys ID: 0x")); Serial.println(finger.system_id, HEX); + Serial.print(F("Capacity: ")); Serial.println(finger.capacity); + Serial.print(F("Security level: ")); Serial.println(finger.security_level); + Serial.print(F("Device address: ")); Serial.println(finger.device_addr, HEX); + Serial.print(F("Packet len: ")); Serial.println(finger.packet_len); + Serial.print(F("Baud rate: ")); Serial.println(finger.baud_rate); + finger.getTemplateCount(); + Serial.print(F("stored template: ")); Serial.println(finger.templateCount); + + show_from_saved(5); //input the id of the template you want to see, in this example it is 5 + +} + +void show_from_saved(uint16_t id) { + Serial.println("------------------------------------"); + Serial.print("Attempting to load #"); Serial.println(id); + uint8_t p = finger.loadModel(id); + switch (p) { + case FINGERPRINT_OK: + Serial.print("Template "); Serial.print(id); Serial.println(" loaded"); + break; + case FINGERPRINT_PACKETRECIEVEERR: + Serial.println("Communication error"); + return; + default: + Serial.print("Unknown error "); Serial.println(p); + return ; + } + + // OK success! + + Serial.print("Attempting to get #"); Serial.println(id); + p = finger.getModel(); + switch (p) { + case FINGERPRINT_OK: + Serial.print("Template "); Serial.print(id); Serial.println(" transferring:"); + break; + default: + Serial.print("Unknown error "); Serial.println(p); + return; + } + + uint8_t f_buf[512]; + if (finger.get_template_buffer(512, f_buf) == FINGERPRINT_OK) { + for (int k = 0; k < 4; k++) { + for (int l = 0; l < 128; l++) { + Serial.print(f_buf[(k * 128) + l], HEX); + Serial.print(","); + } + Serial.println(""); + } + } +} + + +void loop() {} diff --git a/examples/template_transfer/write_to_sensor/write_to_sensor.ino b/examples/template_transfer/write_to_sensor/write_to_sensor.ino new file mode 100644 index 0000000..941ecbb --- /dev/null +++ b/examples/template_transfer/write_to_sensor/write_to_sensor.ino @@ -0,0 +1,82 @@ +/******************************************************************************************* + Author: Md. Asifuzzaman Khan (HAALniner21) + Date:9/3/2022 + + This example shows how to write template data to the sensor + and enroll aginst an ID. + + The teplate data is stored initially in the microcontroller + saved within the microcontroller (can be fetched from SD card or cloud) + + To work with this example first get the template data from "get_direct_template.ino" example. Then store it in + the 'fingerTemplate' array buffer in this code. Then the template data will + be written to the sensor and be enrolled against an ID. + + Happy coding! :) + *******************************************************************************************/ +#include +#include + +SoftwareSerial swser(6, 7); // RX, TX + +Adafruit_Fingerprint finger = Adafruit_Fingerprint(&swser, 0); + +void setup() { + Serial.begin(115200); + finger.begin(57600); //set your sensor's baudrate + if (finger.verifyPassword()) { + Serial.println("Found fingerprint sensor!"); + } else { + Serial.println("Did not find fingerprint sensor :("); + while (1); + } + write_template_data_to_sensor(); +} + +uint8_t readnumber(void) { + uint8_t num = 0; + + while (num == 0) { + while (! Serial.available()); + num = Serial.parseInt(); + } + return num; +} + +void write_template_data_to_sensor() { + int template_buf_size=512; //usually hobby grade sensors have 512 byte template data, watch datasheet to know the info + + uint8_t fingerTemplate[512]; //this is where you need to store your template data + /* + you can manually save the data got from "get_template.ino" example like this + + uint8_t fingerTemplate[512]={0x03,0x0E,....your template data.....}; + + */ + memset(fingerTemplate, 0xff, 512); //comment this line if you've manually put data to the line above + + Serial.println("Ready to write template to sensor..."); + Serial.println("Enter the id to enroll against, i.e id (1 to 127)"); + int id = readnumber(); + if (id == 0) {// ID #0 not allowed, try again! + return; + } + Serial.print("Writing template against ID #"); Serial.println(id); + + if (finger.write_template_to_sensor(template_buf_size,fingerTemplate)) { //telling the sensor to download the template data to it's char buffer from upper computer (this microcontroller's "fingerTemplate" buffer) + Serial.println("now writing to sensor..."); + } else { + Serial.println("writing to sensor failed"); + return; + } + + Serial.print("ID "); Serial.println(id); + if (finger.storeModel(id) == FINGERPRINT_OK) { //saving the template against the ID you entered or manually set + Serial.print("Successfully stored against ID#");Serial.println(id); + } else { + Serial.println("Storing error"); + return ; + } +} + +void loop() {} diff --git a/library.properties b/library.properties index b435fec..defd664 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=Adafruit Fingerprint Sensor Library -version=2.1.0 +version=2.1.1 author=Adafruit maintainer=Adafruit sentence=Arduino library for interfacing to the fingerprint sensor in the Adafruit shop