#include <SPI.h>
#include <MFRC522.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Pin RFID MFRC522
#define RFID_SS_PIN 5
#define RFID_RST_PIN 21
// Pin output
#define RELAY_PIN 4
#define LED_MERAH 27
#define BUZZER_PIN 13
// Pin LCD I2C
#define LCD_SDA 32
#define LCD_SCL 22
MFRC522 rfid(RFID_SS_PIN, RFID_RST_PIN);
LiquidCrystal_I2C lcd(0x27, 16, 2);
// UID kartu Wokwi yang diizinkan
byte kartuTerdaftar[4] = {0xDE, 0xAD, 0xBE, 0xEF};
bool uidSesuai() {
if (rfid.uid.size != 4) {
return false;
}
for (byte i = 0; i < 4; i++) {
if (rfid.uid.uidByte[i] != kartuTerdaftar[i]) {
return false;
}
}
return true;
}
void tampilkanUID() {
Serial.print("UID kartu: ");
for (byte i = 0; i < rfid.uid.size; i++) {
if (rfid.uid.uidByte[i] < 0x10) {
Serial.print("0");
}
Serial.print(rfid.uid.uidByte[i], HEX);
if (i < rfid.uid.size - 1) {
Serial.print(" ");
}
}
Serial.println();
}
void setup() {
Serial.begin(115200);
pinMode(RELAY_PIN, OUTPUT);
pinMode(LED_MERAH, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
digitalWrite(LED_MERAH, LOW);
noTone(BUZZER_PIN);
// Memulai LCD pada SDA 32 dan SCL 22
Wire.begin(LCD_SDA, LCD_SCL);
lcd.init();
lcd.backlight();
// Memulai RFID
SPI.begin();
rfid.PCD_Init();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print ("HALLO TARUNI");
lcd.setCursor(0, 1);
lcd.print("Tempelkan kartu");
Serial.println("Smart Door Lock siap.");
}
void loop() {
// Menunggu kartu RFID
if (!rfid.PICC_IsNewCardPresent()) {
return;
}
if (!rfid.PICC_ReadCardSerial()) {
return;
}
tampilkanUID();
if (uidSesuai()) {
aksesDiterima();
} else {
aksesDitolak();
}
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SMART DOOR LOCK");
lcd.setCursor(0, 1);
lcd.print("Tempelkan kartu");
}
void aksesDiterima() {
Serial.println("Akses diterima");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("AKSES DITERIMA");
lcd.setCursor(0, 1);
lcd.print("Pintu terbuka");
digitalWrite(LED_MERAH, LOW);
digitalWrite(RELAY_PIN, HIGH);
tone(BUZZER_PIN, 1200, 150);
delay(3000);
digitalWrite(RELAY_PIN, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("PINTU TERKUNCI");
delay(1000);
}
void aksesDitolak() {
Serial.println("Akses ditolak");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("AKSES DITOLAK");
lcd.setCursor(0, 1);
lcd.print("Kartu tdk valid");
digitalWrite(RELAY_PIN, LOW);
digitalWrite(LED_MERAH, HIGH);
tone(BUZZER_PIN, 700);
delay(1000);
noTone(BUZZER_PIN);
digitalWrite(LED_MERAH, LOW);
delay(1000);
}Loading
mfrc522
mfrc522