Cara Memprogram Fingerprint Pada ESP32

Cara Memprogram Fingerprint Pada ESP32

Fingerprint sensor (sensor sidik jari) adalah perangkat elektronik yang digunakan untuk memindai, mendeteksi, dan mengidentifikasi sidik jari seseorang.Berikut ini adalah cara memprogram nya :

#include <Arduino.h>
#include <Adafruit_Fingerprint.h>

// Gunakan Serial1 untuk ESP32
#define mySerial Serial1  // Sesuaikan dengan port yang digunakan, misalnya Serial1 atau Serial2

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

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;
  }

  // Convert image to template
  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;
  }

  // Search the finger in the stored templates
  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;
  }

  // Print the matched ID and confidence level
  Serial.print("Found ID #"); Serial.print(finger.fingerID);
  Serial.print(" with confidence of "); Serial.println(finger.confidence);
  return finger.fingerID;
}

void setup() {
  Serial.begin(115200); // Baud rate untuk komunikasi dengan serial monitor
  mySerial.begin(57600); // Baud rate untuk komunikasi dengan sensor

  while (!Serial);  // Menunggu serial untuk siap
  delay(100);

  Serial.println("Adafruit Fingerprint Sensor Test");

  // Cek apakah sensor fingerprint terhubung
  if (finger.verifyPassword()) {
    Serial.println("Found fingerprint sensor!");
  } else {
    Serial.println("Did not find fingerprint sensor :(");
    while (1) { delay(1); }
  }

  // Baca parameter sensor untuk pengecekan
  Serial.println("Reading sensor parameters");
  finger.getParameters();
  Serial.print("Status: 0x"); Serial.println(finger.status_reg, HEX);
  Serial.print("Sys ID: 0x"); Serial.println(finger.system_id, HEX);
  Serial.print("Capacity: "); Serial.println(finger.capacity);
  Serial.print("Security level: "); Serial.println(finger.security_level);
  Serial.print("Device address: "); Serial.println(finger.device_addr, HEX);
  Serial.print("Packet len: "); Serial.println(finger.packet_len);
  Serial.print("Baud rate: "); Serial.println(finger.baud_rate);

  // Cek apakah ada template sidik jari yang tersimpan
  finger.getTemplateCount();
  if (finger.templateCount == 0) {
    Serial.println("Sensor doesn't contain any fingerprint data. Please enroll some fingerprints.");
  } else {
    Serial.print("Sensor contains "); Serial.print(finger.templateCount); Serial.println(" templates");
  }
}

void loop() {
  // Fungsi untuk mendeteksi ID sidik jari yang cocok
  int fingerID = getFingerprintID();

  // Jika ditemukan ID sidik jari, lakukan sesuatu
  if (fingerID != -1) {
    Serial.print("Finger ID: "); Serial.println(fingerID);
  }

  delay(200); // Tunda sebentar sebelum mencoba lagi
}

Berikut ini adalah penjelasan dari kode di atas :

1. Inisialisasi Library

#include <Arduino.h>
#include <Adafruit_Fingerprint.h>
  • Arduino.h: Library dasar yang digunakan untuk komunikasi dengan platform Arduino.
  • Adafruit_Fingerprint: Library khusus dari Adafruit untuk berinteraksi dengan sensor sidik jari mereka. Ini menyediakan berbagai fungsi untuk memproses gambar sidik jari dan melakukan pencocokan template.

2. Menentukan Port Serial

#define mySerial Serial1  // Sesuaikan dengan port yang digunakan, misalnya Serial1 atau Serial2
  • mySerial digunakan untuk komunikasi dengan sensor sidik jari. Pada ESP32, Anda dapat menggunakan beberapa port serial. Di sini, Serial1 dipilih untuk komunikasi dengan sensor. Kamu bisa menggantinya dengan Serial2 jika diperlukan, tergantung pada port yang digunakan untuk koneksi dengan sensor.

3. Membuat Objek untuk Sensor Sidik Jari

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
  • Membuat objek finger yang merupakan instansiasi dari kelas Adafruit_Fingerprint. Objek ini memungkinkan kamu untuk mengakses berbagai fungsi dari sensor sidik jari.

4. Fungsi getFingerprintID

Fungsi ini bertanggung jawab untuk menangkap gambar sidik jari, mengkonversinya menjadi template, dan mencari template yang cocok di dalam database sensor.

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;
  }
  • finger.getImage(): Mengambil gambar sidik jari dari sensor. Jika tidak ada sidik jari yang terdeteksi, akan mengembalikan status FINGERPRINT_NOFINGER.
  • Setelah gambar diambil, ada beberapa kemungkinan hasil yang bisa muncul, seperti FINGERPRINT_OK (berhasil mengambil gambar), atau FINGERPRINT_NOFINGER (tidak ada sidik jari yang terdeteksi).
  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;
  }
  • finger.image2Tz(): Mengonversi gambar sidik jari yang diambil menjadi template yang dapat diproses lebih lanjut. Jika template berhasil dibuat, status FINGERPRINT_OK akan dikembalikan.
  • Jika ada masalah dengan konversi gambar (misalnya gambar terlalu berantakan), sensor akan mengembalikan error seperti FINGERPRINT_IMAGEMESS atau FINGERPRINT_FEATUREFAIL.
  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;
  }
  • finger.fingerSearch(): Mencari kecocokan sidik jari yang terdaftar dalam database sensor. Jika ditemukan kecocokan, akan mengembalikan FINGERPRINT_OK.
  • Jika tidak ada kecocokan, status FINGERPRINT_NOTFOUND dikembalikan.
  Serial.print("Found ID #"); Serial.print(finger.fingerID);
  Serial.print(" with confidence of "); Serial.println(finger.confidence);
  return finger.fingerID;
}
  • Jika kecocokan ditemukan, ID sidik jari yang cocok dan tingkat kepercayaan (confidence level) akan dicetak ke Serial Monitor.

5. Fungsi setup()

void setup() {
  Serial.begin(115200);  // Baud rate untuk komunikasi dengan serial monitor
  mySerial.begin(57600); // Baud rate untuk komunikasi dengan sensor
  • Serial.begin(115200): Menginisialisasi komunikasi serial dengan komputer (untuk debugging).
  • mySerial.begin(57600): Menginisialisasi komunikasi serial dengan sensor sidik jari pada baud rate 57600 (default untuk Adafruit Fingerprint sensor).
  if (finger.verifyPassword()) {
    Serial.println("Found fingerprint sensor!");
  } else {
    Serial.println("Did not find fingerprint sensor :(");
    while (1) { delay(1); }
  }
  • finger.verifyPassword(): Mengecek apakah sensor sidik jari dapat terhubung dengan benar dan memiliki password yang benar. Jika berhasil, sensor siap digunakan.
  finger.getParameters();
  // Membaca parameter sensor untuk pengecekan dan debugging
  • finger.getParameters(): Membaca beberapa parameter dari sensor untuk memastikan bahwa sensor berfungsi dengan baik, seperti status sensor, ID sistem, kapasitas template, tingkat keamanan, dan banyak lagi.
  finger.getTemplateCount();
  if (finger.templateCount == 0) {
    Serial.println("Sensor doesn't contain any fingerprint data. Please enroll some fingerprints.");
  } else {
    Serial.print("Sensor contains "); Serial.print(finger.templateCount); Serial.println(" templates");
  }
  • finger.getTemplateCount(): Mengecek berapa banyak template sidik jari yang sudah tersimpan di sensor. Jika tidak ada template, sensor akan meminta untuk menambahkannya.

6. Fungsi loop()

void loop() {
  int fingerID = getFingerprintID();
  if (fingerID != -1) {
    Serial.print("Finger ID: "); Serial.println(fingerID);
  }
  delay(200); // Tunda sebentar sebelum mencoba lagi
}
  • Fungsi loop() berulang kali memanggil getFingerprintID() untuk mencoba mendeteksi sidik jari yang cocok. Jika ditemukan ID sidik jari, ID tersebut akan dicetak ke Serial Monitor.

untuk diskusi bisa kontak dibawah ini :

Sosial media :

Apa itu ESP32?