From cdf4cde989c9536f301c7565bf2298fb6ac37551 Mon Sep 17 00:00:00 2001
From: yakovlevkg87 <yakovlevkg87@ya.ru>
Date: Wed, 2 Oct 2024 15:52:30 +0500
Subject: [PATCH] add fingerprint handler example

---
 .../fingerprint_handler.ino                   | 147 ++++++++++++++++++
 1 file changed, 147 insertions(+)
 create mode 100644 examples/fingerprint_handler/fingerprint_handler.ino

diff --git a/examples/fingerprint_handler/fingerprint_handler.ino b/examples/fingerprint_handler/fingerprint_handler.ino
new file mode 100644
index 0000000..63cf911
--- /dev/null
+++ b/examples/fingerprint_handler/fingerprint_handler.ino
@@ -0,0 +1,147 @@
+#include <Adafruit_Fingerprint.h>
+
+#if (defined(__AVR__) || defined(ESP8266)) && !defined(__AVR_ATmega2560__)
+
+// UNO            R503-5V Fingerprint Module
+// 5V          -> 1. Power Supply (RED)
+// GND         -> 2. GND (BLACK)
+// pin #4      -> 3. TXD (YELLOW)
+// pin #5      -> 4. RXD (GREEN)
+// pin #3      -> 5. WAKEUP (BLUE)
+// 3.3V or 5V  -> 6. Touch induction power supply (WHITE)
+
+#define TXD_GPIO_NUM 4
+#define RXD_GPIO_NUM 5
+#define WAKEUP_GPIO_NUM 3
+
+// Set up the serial port to use softwareserial..
+SoftwareSerial mySerial(TXD_GPIO_NUM, RXD_GPIO_NUM);
+
+#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);
+
+volatile bool fingerDetected = false;
+
+void setup()
+{
+  Serial.begin(9600);
+  while (!Serial);  // For Yun/Leo/Micro/Zero/...
+  delay(100);
+  Serial.println("\n\nAdafruit finger detect test");
+
+  // set the data rate for the sensor serial port
+  finger.begin(57600);
+  delay(5);
+  if (finger.verifyPassword()) {
+    Serial.println("Found fingerprint sensor!");
+  } else {
+    Serial.println("Did not find fingerprint sensor :(");
+    while (1) { delay(1); }
+  }
+
+  Serial.println(F("Reading sensor parameters"));
+  finger.getParameters();
+  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();
+
+  if (finger.templateCount == 0) {
+    Serial.print("Sensor doesn't contain any fingerprint data. Please run the 'enroll' example.");
+  }
+  else {
+    Serial.println("Waiting for valid finger...");
+      Serial.print("Sensor contains "); Serial.print(finger.templateCount); Serial.println(" templates");
+  }
+
+  attachInterrupt(digitalPinToInterrupt(WAKEUP_GPIO_NUM), detectedFinger, FALLING);
+}
+
+void loop() {
+  // put your main code here, to run repeatedly:
+  if (fingerDetected) {
+    getFingerprintID();
+    fingerDetected = false;
+  }
+}
+
+void detectedFinger() {
+  fingerDetected = true;
+}
+
+uint8_t getFingerprintID() {
+  uint8_t p = finger.getImage();
+  switch (p) {
+    case FINGERPRINT_OK:
+      Serial.println("Image taken");
+      break;
+    case FINGERPRINT_NOFINGER:
+      Serial.println("No finger detected");
+      return p;
+    case FINGERPRINT_PACKETRECIEVEERR:
+      Serial.println("Communication error");
+      return p;
+    case FINGERPRINT_IMAGEFAIL:
+      Serial.println("Imaging error");
+      return p;
+    default:
+      Serial.println("Unknown error");
+      return p;
+  }
+
+  // OK success!
+
+  p = finger.image2Tz();
+  switch (p) {
+    case FINGERPRINT_OK:
+      Serial.println("Image converted");
+      break;
+    case FINGERPRINT_IMAGEMESS:
+      Serial.println("Image too messy");
+      return p;
+    case FINGERPRINT_PACKETRECIEVEERR:
+      Serial.println("Communication error");
+      return p;
+    case FINGERPRINT_FEATUREFAIL:
+      Serial.println("Could not find fingerprint features");
+      return p;
+    case FINGERPRINT_INVALIDIMAGE:
+      Serial.println("Could not find fingerprint features");
+      return p;
+    default:
+      Serial.println("Unknown error");
+      return p;
+  }
+
+  // OK converted!
+  p = finger.fingerSearch();
+  if (p == FINGERPRINT_OK) {
+    Serial.println("Found a print match!");
+  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
+    Serial.println("Communication error");
+    return p;
+  } else if (p == FINGERPRINT_NOTFOUND) {
+    Serial.println("Did not find a match");
+    return p;
+  } else {
+    Serial.println("Unknown error");
+    return p;
+  }
+
+  // found a match!
+  Serial.print("Found ID #"); Serial.print(finger.fingerID);
+  Serial.print(" with confidence of "); Serial.println(finger.confidence);
+  
+  return finger.fingerID;
+}
\ No newline at end of file