#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);
// Daftar ID yang diizinkan untuk akses
const String VALID_IDS[] = {"12 34 56 78", "87 65 43 21", "11 22 33 44", "99 88 77 66"};
const int NUM_VALID_IDS = sizeof(VALID_IDS) / sizeof(VALID_IDS[0]);
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("Silahkan Tempelkan Kartu Anda:");
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 ID Kartu 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 (isAuthorizedID(input)) { // 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 memeriksa apakah ID diizinkan
bool isAuthorizedID(String input) {
for (int i = 0; i < NUM_VALID_IDS; i++) {
if (input.equals(VALID_IDS[i])) {
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);
resetDisplay();
}
// Fungsi untuk akses ditolak
void accessDenied() {
Serial.println("Akses ditolak / Kartu Tidak Dikenal!");
display.clearDisplay();
display.setCursor(0, 0);
display.println("Akses Ditolak / Kartu Tidak Dikenal!");
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);
resetDisplay();
}
// Fungsi untuk mengembalikan teks awal di display
void resetDisplay() {
display.clearDisplay();
display.setCursor(0, 0);
display.println("Silahkan Tempelkan Kartu Anda:");
display.display();
}