#include <SPI.h>
#include <MFRC522.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Definisi pin untuk MFRC522
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN); // Membuat instance MFRC522
// Definisi untuk LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C biasanya 0x27 atau 0x3F
// Daftar UID yang diotorisasi
String authorizedUIDs[10]; // Array untuk menyimpan UID yang diotorisasi
int uidCount = 0; // Counter untuk jumlah UID yang diotorisasi
void setup()
{
Serial.begin(9600); // Memulai komunikasi serial
SPI.begin(); // Memulai bus SPI
mfrc522.PCD_Init(); // Memulai MFRC522
lcd.init(); // Memulai LCD
lcd.backlight(); // Mengaktifkan backlight LCD
lcd.begin(16, 2); // Memastikan LCD diinisialisasi dengan benar
lcd.setCursor(0, 0);
lcd.print("Dekatkan kartu");
lcd.setCursor(0, 1);
lcd.print("ke pembaca...");
Serial.println("Pilih mode:");
Serial.println("1: Daftar kartu baru");
Serial.println("2: Tambah UID manual");
}
void loop()
{
if (Serial.available() > 0) {
char choice = Serial.read();
if (choice == '1') {
registerNewCard();
} else if (choice == '2') {
registerUIDManual();
}
}
// Mencari kartu baru
if (!mfrc522.PICC_IsNewCardPresent())
{
return;
}
// Memilih salah satu kartu
if (!mfrc522.PICC_ReadCardSerial())
{
return;
}
// Menampilkan UID di serial monitor dan LCD
Serial.print("UID tag: ");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("UID tag: ");
String content = "";
for (byte i = 0; i < mfrc522.uid.size; i++)
{
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
lcd.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
lcd.print(mfrc522.uid.uidByte[i], HEX);
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
Serial.println();
content.toUpperCase();
Serial.println("Content: " + content); // Menampilkan konten UID yang dibaca
// Memeriksa apakah UID diotorisasi
bool accessGranted = false;
for (int i = 0; i < uidCount; i++) {
if (content.substring(1) == authorizedUIDs[i]) {
accessGranted = true;
break;
}
}
delay(3000); // Menunggu 3 detik sebelum membaca lagi
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Dekatkan kartu");
lcd.setCursor(0, 1);
lcd.print("ke pembaca...");
}
void registerNewCard() {
Serial.println("Dekatkan kartu baru ke pembaca...");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Daftarkan kartu");
lcd.setCursor(0, 1);
lcd.print("ke pembaca...");
while (!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) {
delay(50);
}
String content = "";
for (byte i = 0; i < mfrc522.uid.size; i++) {
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
content.toUpperCase();
authorizedUIDs[uidCount] = content.substring(1);
uidCount++;
Serial.println("Kartu berhasil didaftarkan: " + content);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Kartu terdaftar");
lcd.setCursor(0, 1);
lcd.print(content);
delay(3000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Dekatkan kartu");
lcd.setCursor(0, 1);
lcd.print("ke pembaca...");
}
void registerUIDManual() {
Serial.println("Masukkan UID baru (dalam format XX XX XX XX):");
while (Serial.available() == 0) {
delay(50);
}
String newUID = Serial.readString();
newUID.trim();
newUID.toUpperCase();
authorizedUIDs[uidCount] = newUID;
uidCount++;
Serial.println("UID berhasil ditambahkan: " + newUID);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("UID terdaftar");
lcd.setCursor(0, 1);
lcd.print(newUID);
delay(3000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Dekatkan kartu");
lcd.setCursor(0, 1);
lcd.print("ke pembaca...");
}