Sunday, September 29, 2024

Penggunaan Sensor Sidik Jari untuk Pengendalian Relay pada Wemos dalam Menyalakan dan Mematikan Kendaraan Listrik


A.    Kompetensi

3.1 Menguraikan konsep dasar sistem kontrol akses menggunakan teknologi fingerprint dan prinsip kerja sensor fingerprint.

3.2 Mengidentifikasi jenis-jenis perangkat keras dan perangkat lunak yang digunakan dalam sistem kontrol akses berbasis fingerprint, termasuk Wemos D1 Mini, modul relay, dan OLED display.

3.3 Menguraikan proses konfigurasi dan pemrograman sensor fingerprint pada Wemos D1 Mini, termasuk penggunaan pustaka yang diperlukan untuk berfungsi dengan baik.

4.1 Memasang dan mengonfigurasi sensor fingerprint, relay, dan OLED display pada Wemos D1 Mini.

4.2 Mengoperasikan sistem kontrol akses menggunakan sensor fingerprint untuk menghidupkan dan mematikan relay pada kendaraan listrik.

B.     Dasar Teori

Sensor Fingerprint

Sensor fingerprint adalah perangkat yang digunakan untuk mengenali dan memverifikasi identitas pengguna melalui sidik jari. Sensor ini bekerja dengan menangkap gambar dari sidik jari dan membandingkannya dengan data sidik jari yang telah disimpan dalam basis data. Jika sidik jari yang terdeteksi cocok dengan salah satu sidik jari yang tersimpan, sensor akan mengirimkan sinyal yang menandakan bahwa identitas pengguna telah terverifikasi. Proses ini melibatkan beberapa langkah, termasuk pengambilan gambar, pemrosesan citra, dan pencocokan pola. Sensor fingerprint sering digunakan dalam berbagai aplikasi keamanan, seperti akses kontrol, autentikasi perangkat, dan sistem pembayaran.

Wemos D1 Mini

Wemos D1 Mini adalah papan mikrokontroler yang berbasis pada chip ESP8266, yang dikenal karena kemampuannya untuk mendukung konektivitas WiFi. Papan ini memiliki ukuran yang kecil, sehingga cocok untuk proyek-proyek IoT (Internet of Things) yang memerlukan konektivitas jaringan tanpa kabel. Dengan Wemos D1 Mini, pengguna dapat mengembangkan aplikasi yang dapat terhubung ke internet atau jaringan lokal untuk mengirim dan menerima data. Selain itu, papan ini mendukung berbagai pustaka Arduino yang memudahkan pengembang dalam memprogram dan mengintegrasikan perangkat keras lain, seperti sensor, relay, dan layar OLED.

Relay

Relay adalah saklar elektromekanis yang dapat dikendalikan secara elektrik. Ketika arus listrik kecil diterapkan pada kumparan relay, ini akan menyebabkan saklar internal untuk membuka atau menutup, memungkinkan arus yang lebih besar untuk mengalir melalui sirkuit utama. Dalam konteks proyek ini, relay digunakan untuk mengontrol daya ke kendaraan listrik. Dengan menggunakan Wemos D1 Mini untuk mengendalikan relay, sistem dapat menghidupkan atau mematikan kendaraan listrik berdasarkan sinyal dari sensor fingerprint. Relay ini sangat penting dalam aplikasi yang memerlukan isolasi listrik antara sirkuit kendali dan sirkuit daya tinggi.

OLED Display

OLED (Organic Light Emitting Diode) display adalah jenis layar yang menggunakan teknologi dioda pemancar cahaya organik untuk menghasilkan gambar dengan kualitas tinggi dan kontras yang baik. Layar OLED sering digunakan dalam proyek elektronik karena konsumsi dayanya yang rendah dan kemampuannya untuk menampilkan teks dan grafik yang jelas. Dalam proyek ini, layar OLED digunakan untuk menampilkan status sistem kepada pengguna. Pesan seperti "Fingerprint Benar", "Fingerprint Salah", "Relay Hidup", atau "Relay Mati" akan ditampilkan di layar untuk memberikan umpan balik visual yang instan. Ini membantu pengguna memahami status operasi sistem dan memberikan pengalaman interaktif yang lebih baik.

C.    Alat dan Bahan:

·         Wemos D1 Mini

·         Sensor Fingerprint

·         Relay module

·         OLED Display (I2C)

·         Software Arduino IDE

D.    Rangkaian


E.     Program

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

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif

U8X8_SSD1306_64X48_ER_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);

#if (defined(__AVR__) || defined(ESP8266)) && !defined(__AVR_ATmega2560__)
SoftwareSerial mySerial(2, 0);
#else
#define mySerial Serial1
#endif

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

void setup() {
  Serial.begin(9600);
  u8x8.begin();
  u8x8.setPowerSave(0);
  while (!Serial);
  delay(100);
  Serial.println("\n\nKendali relay berbasis fingerprint");

  finger.begin(57600);
  delay(5);
  if (finger.verifyPassword()) {
    Serial.println("Sensor fingerprint terdeteksi");
  } else {
    Serial.println("Sensor fingerprint tidak ditemukan");
    while (1) {
      delay(1);
    }
  }

  Serial.println(F("Membaca parameter sensor"));
  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 tidak memiliki data fingerprint. Mohon lakukan 'enroll'");
  }
  else {
    Serial.println("Menunggu data fingerprint...");
    Serial.print("Sensor menyimpan "); Serial.print(finger.templateCount); Serial.println(" data");
  }
  u8x8.setFont(u8x8_font_chroma48medium8_r);
  u8x8.drawString(0, 0, " Status");
  u8x8.drawString(0, 1, " Menunggu");
  u8x8.refreshDisplay();
}

void loop() {
  getFingerprintID();
  u8x8.refreshDisplay();
  delay(50);
}

uint8_t getFingerprintID() {
  uint8_t p = finger.getImage();
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Gambar diperoleh");
      break;
    case FINGERPRINT_NOFINGER:
      Serial.println("Tidak ada jari terdeteksi");
      u8x8.drawString(0, 3, " Sentuh");
      u8x8.drawString(0, 4, " Sensor");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Komunikasi error");
      return p;
    case FINGERPRINT_IMAGEFAIL:
      Serial.println("Error saat menangkap gambar");
      return p;
    default:
      Serial.println("Error yang tidak diketahui");
      return p;
  }

  p = finger.image2Tz();
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Gambar terkonversi");
      break;
    case FINGERPRINT_IMAGEMESS:
      Serial.println("Image too messy");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Komunikasi error");
      return p;
    case FINGERPRINT_FEATUREFAIL:
      Serial.println("Tidak dapat menemukan fitur fingerprint");
      return p;
    case FINGERPRINT_INVALIDIMAGE:
      Serial.println("Tidak dapat menemukan fitur fingerprint");
      return p;
    default:
      Serial.println("Error tidak diketahui");
      return p;
  }

  p = finger.fingerSearch();
  if (p == FINGERPRINT_OK) {
    Serial.println("Data fingerprint sesuai!");
    u8x8.clear();
    u8x8.drawString(0, 3, " Data");
    u8x8.drawString(0, 4, " Sesuai");
    delay(1000);
    u8x8.clear();
  }
  else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("Komunikasi error");
    return p;
  }
  else if (p == FINGERPRINT_NOTFOUND) {
    Serial.println("Data fingerprint tidak sesuai!");
    u8x8.clear();
    u8x8.drawString(0, 3, " Tidak");
    u8x8.drawString(0, 4, " Dikenal");
    delay(1000);
    u8x8.clear();
    return p;
  }
  else {
    Serial.println("Error tidak diketahui");
    return p;
  }

  Serial.print("Ditemukan ID #"); Serial.print(finger.fingerID);
  Serial.print(" dengan confidence "); Serial.println(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;

  Serial.print("Ditemukan ID #"); Serial.print(finger.fingerID);
  Serial.print(" dengan confidence "); Serial.println(finger.confidence);
  return finger.fingerID;
}

F.     Langkah-langkah:

1.      Siapkan alat dan bahan yang dibutuhkan.

2.      Sambungkan rangkaian sesuai dengan skematik yang sudah diberikan.

3.      Koneksikan pin sensor fingerprint pada wemos sebagai berikut:

§  Pin RX ke Pin 0 Wemos

§  Pin TX ke Pin 2 Wemos

§  Pin VCC ke 3V3 Wemos

§  Pin GND ke GND Wemos

4.      Koneksikan pin OLED pada wemos sebagai berikut:

§  Pin 3V3 ke 3V3 Wemos

§  Pin D1 ke Pin 5 Wemos

§  Pin D2 ke Pin 4 Wemos

§  Pin GND ke GND Wemos

5.      Sebelum mengupload program diatas ke Wemos D1 Mini menggunakan Arduino IDE.

a.       Buka Arduino IDE.

b.      Tambahkan Board Wemos D1 Mini:

·         Pergi ke File > Preferences.

·         Di bagian "Additional Boards Manager URLs", tambahkan URL berikut: http://arduino.esp8266.com/stable/package_esp8266com_index.json.

·         Pergi ke Tools > Board > Boards Manager, cari esp8266 dan instal.

c.       Pilih Board dan Port:

·         Pergi ke Tools > Board > ESP8266 Boards > pilih LOLIN(WEMOS) D1 R2 & mini.

·         Pergi ke Tools > Port > pilih port yang sesuai dengan Wemos D1 Mini.

d.      Tambahkan database sidik jari pada sensor fingerprint dengan langkah berikut

·         Pilih file > Adafruit Fingerprint Sensor Library > enroll

·     Kemudian tekan Upload untuk mengupload program.

6.      Buka Serial Monitor untuk melihat output dari sensor fingerprint dan OLED display.

·         Pergi ke Tools > Serial Monitor.

·         Pastikan baud rate diatur ke 9600.

7.      Letakkan jari pada sensor fingerprint dan amati pesan yang ditampilkan pada OLED display:

·         Jika sidik jari dikenali, akan ditampilkan pesan "Data Sesuai".

·         Jika sidik jari tidak dikenali, akan ditampilkan pesan "Tidak Dikenal".

8.      Setelah itu masukkan program yang sudah disediakan di atas.

9.      Periksa koneksi dan pastikan semua komponen terhubung dengan benar jika terdapat kesalahan dalam membaca sidik jari atau tampilan OLED tidak sesuai.

·         Pastikan semua koneksi sesuai dengan skematik.

·         Jika terdapat kesalahan dalam membaca sidik jari atau tampilan OLED tidak sesuai, periksa ulang sambungan kabel dan pastikan tidak ada kabel yang longgar atau terputus.

G.    Tugas

1.      Jelaskan bagaimana cara kerja rangkaian ini?

2.      Selanjutnya Paste program yang mengaktifkan relay ketika sensor membaca sidik jari yang dikenali, dan mematikannya ketika sidik jari tersebut dikenali kembali. Jika sidik jari tidak dikenali, relay tidak akan menyala.

Program :
#include <Adafruit_Fingerprint.h>
#include <Arduino.h>
#include <U8x8lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif

U8X8_SSD1306_64X48_ER_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);

#if (defined(__AVR__) || defined(ESP8266)) && !defined(__AVR_ATmega2560__)
SoftwareSerial mySerial(2, 0);

#else
#define mySerial Serial1

#endif


Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
int relayPin = 15;
int relStat = 1;

void setup()
{
  Serial.begin(9600);
  u8x8.begin();
  u8x8.setPowerSave(0);
  while (!Serial);
  delay(100);
  Serial.println("\n\nKendali relay berbasis fingerprint");

  finger.begin(57600);
  pinMode(relayPin, OUTPUT);
  digitalWrite(relayPin, relStat);
  delay(5);
  if (finger.verifyPassword()) {
    Serial.println("Sensor fingerprint terdeteksi");
  } else {
    Serial.println("Sensor fingerprint tidak ditemukan");
    while (1) {
      delay(1);
    }
  }

  Serial.println(F("Membaca parameter sensor"));
  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 tidak memiliki data fingerprint. Mohon lakukan 'enroll'");
  }
  else {
    Serial.println("Menunggu data fingerprint...");
    Serial.print("Sensor menyimpan "); Serial.print(finger.templateCount); Serial.println(" data");
  }
  u8x8.setFont(u8x8_font_chroma48medium8_r);
  u8x8.drawString(0, 0, " Relay");
  u8x8.drawString(0, 1, "  OFF");
  u8x8.refreshDisplay();
}

void loop() {
  getFingerprintID();
  //  u8x8.clear();
  u8x8.refreshDisplay();
  delay(50);
}

uint8_t getFingerprintID() {
  if (relStat == 0) {
    u8x8.drawString(0, 0, " Relay");
    u8x8.drawString(0, 1, "  ON");
  }
  else {
    u8x8.drawString(0, 0, " Relay");
    u8x8.drawString(0, 1, "  OFF");
  }

  uint8_t p = finger.getImage();
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Gambar diperoleh");
      break;
    case FINGERPRINT_NOFINGER:
      Serial.println("Tidak ada jari terdeteksi");
      u8x8.drawString(0, 3, " Sentuh");
      u8x8.drawString(0, 4, " Sensor");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Komunikasi error");
      return p;
    case FINGERPRINT_IMAGEFAIL:
      Serial.println("Error saat menangkap gambar");
      return p;
    default:
      Serial.println("Error yang tidak diketahui");
      return p;
  }

  // OK success!

  p = finger.image2Tz();
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Gambar terkonversi");
      break;
    case FINGERPRINT_IMAGEMESS:
      Serial.println("Image too messy");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Komunikasi error");
      return p;
    case FINGERPRINT_FEATUREFAIL:
      Serial.println("Tidak dapat menemukan fitur fingerprint");
      return p;
    case FINGERPRINT_INVALIDIMAGE:
      Serial.println("Tidak dapat menemukan fitur fingerprint");
      return p;
    default:
      Serial.println("Error tidak diketahui");
      return p;
  }

  // OK converted!
  p = finger.fingerSearch();
  if (p == FINGERPRINT_OK) {
    Serial.println("Data fingerprint sesuai!");
    if (relStat == 0) {
      relStat = 1;
      //      u8x8.drawString(0, 0, "Relay");
      //      u8x8.drawString(0, 1, "   OFF");
    }
    else if (relStat == 1) {
      relStat = 0;
    }
    digitalWrite(relayPin, relStat);
    Serial.println("TRIG");
    u8x8.clear();
    u8x8.drawString(0, 3, " Data");
    u8x8.drawString(0, 4, " Sesuai");
    delay(1000);
    u8x8.clear();
  }
  else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("Komunikasi error");
    return p;
  }
  else if (p == FINGERPRINT_NOTFOUND) {
    Serial.println("Data fingerprint tidak sesuai!");
    u8x8.clear();
    u8x8.drawString(0, 3, " Tidak");
    u8x8.drawString(0, 4, " Dikenal");
    delay(1000);
    u8x8.clear();
    return p;
  }
  else {
    Serial.println("Error tidak diketahui");
    return p;
  }

  // found a match!
  Serial.print("Ditemukan ID #"); Serial.print(finger.fingerID);
  Serial.print(" dengan confidence "); Serial.println(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!
  Serial.print("Ditemukan ID #"); Serial.print(finger.fingerID);
  Serial.print(" dengan confidence "); Serial.println(finger.confidence);
  return finger.fingerID;
}

Jika program eror bisa gunakan link Drive

3.      Buatlah laporan praktikum dan dikumpulkan!



No comments:

Post a Comment

Dokumen Untuk PPL 2025

 PPL UNY 2025 Periode Juli - September 2025 CP dan ATP Mapel Motor Listrik disini https://docs.google.com/document/d/1Nqhubj8UAlmCR1IsdLw_CF...