#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Definisi pin GPIO untuk perangkat output
#define BUZZER_PIN 14 // Pin untuk Buzzer
#define GREEN_LED 26 // Pin untuk LED Hijau (akses diterima)
#define RED_LED 25 // Pin untuk LED Merah (akses ditolak)
#define RELAY_PIN 27 // Pin untuk Relay
// Definisi untuk OLED Display
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// ID yang diizinkan untuk akses (gantilah sesuai kebutuhan)
const String VALID_ID = "12 34 56 78";
void setup() {
Serial.begin(115200); // Inisialisasi komunikasi serial
// Inisialisasi OLED Display
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("SSD1306 gagal diinisialisasi");
while (true);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println("Masukkan e-KTP ID:");
display.display();
// Set mode pin sebagai OUTPUT
pinMode(BUZZER_PIN, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
pinMode(RELAY_PIN, OUTPUT);
// Mematikan semua perangkat output saat awal
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(GREEN_LED, LOW);
digitalWrite(RED_LED, LOW);
digitalWrite(RELAY_PIN, LOW);
Serial.println("Masukkan e-KTP ID dalam format: XX XX XX XX");
}
void loop() {
if (Serial.available()) {
String input = Serial.readStringUntil('\n'); // Membaca input dari Serial Monitor
input.trim(); // Menghapus spasi di awal dan akhir string
if (isValidFormat(input)) { // Validasi format input
if (input.equals(VALID_ID)) { // Periksa apakah ID cocok
accessGranted();
} else {
accessDenied();
}
} else {
Serial.println("Format tidak valid! Masukkan dalam format: XX XX XX XX");
display.clearDisplay();
display.setCursor(0, 0);
display.println("Format tidak valid!");
display.display();
}
}
}
// Fungsi untuk memeriksa apakah format input sesuai "XX XX XX XX"
bool isValidFormat(String input) {
if (input.length() == 11 && input.charAt(2) == ' ' && input.charAt(5) == ' ' && input.charAt(8) == ' ') {
for (int i = 0; i < input.length(); i++) {
if (i != 2 && i != 5 && i != 8) {
if (!isDigit(input.charAt(i))) {
return false; // Jika ada karakter selain angka di luar spasi, format salah
}
}
}
return true;
}
return false;
}
// Fungsi untuk akses diterima
void accessGranted() {
Serial.println("Akses diterima!");
display.clearDisplay();
display.setCursor(0, 0);
display.println("Akses Diterima!");
display.display();
digitalWrite(BUZZER_PIN, HIGH); // Hidupkan buzzer
digitalWrite(GREEN_LED, HIGH); // Hidupkan LED hijau
digitalWrite(RELAY_PIN, HIGH); // Aktifkan relay (misalnya membuka pintu)
delay(5000); // Tunggu 5 detik
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(GREEN_LED, LOW);
digitalWrite(RELAY_PIN, LOW);
}
// Fungsi untuk akses ditolak
void accessDenied() {
Serial.println("Akses ditolak!");
display.clearDisplay();
display.setCursor(0, 0);
display.println("Akses Ditolak!");
display.display();
digitalWrite(BUZZER_PIN, HIGH); // Hidupkan buzzer
digitalWrite(RED_LED, HIGH); // Hidupkan LED merah
delay(5000); // Tunggu 5 detik
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(RED_LED, LOW);
}