#include <SPI.h>
#include <MFRC522.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// --------------------
// RFID wiring (UNO)
// --------------------
const int SS_PIN = 10;
const int RST_PIN = 9;
// LEDs
const int GREEN_LED = 6;
const int RED_LED = 7;
// RFID object
MFRC522 rfid(SS_PIN, RST_PIN);
// LCD (I2C address, columns, rows)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// WHITELIST
const unsigned long whiteList[] = {
2206997022UL,
1111550754UL,
2759927451UL,
1111264034UL
};
const int whiteListSize = sizeof(whiteList) / sizeof(whiteList[0]);
void setup() {
Serial.begin(9600);
SPI.begin();
rfid.PCD_Init();
pinMode(GREEN_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
digitalWrite(GREEN_LED, LOW);
digitalWrite(RED_LED, LOW);
// LCD init
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("RFID ready");
lcd.setCursor(0, 1);
lcd.print("Scan card...");
Serial.println("MFRC522 initialized");
byte version = rfid.PCD_ReadRegister(MFRC522::VersionReg);
Serial.print("MFRC522 version: 0x");
Serial.println(version, HEX);
}
void loop() {
if (!rfid.PICC_IsNewCardPresent()) {
return;
}
if (!rfid.PICC_ReadCardSerial()) {
return;
}
// -------- UID print --------
Serial.print("Card UID: ");
for (byte i = 0; i < rfid.uid.size; i++) {
Serial.print(rfid.uid.uidByte[i]);
Serial.print(" ");
}
Serial.println();
// -------- UID conversion --------
if (rfid.uid.size == 4) {
unsigned long uidNumber =
(unsigned long)rfid.uid.uidByte[0] * 256 * 256 * 256 +
(unsigned long)rfid.uid.uidByte[1] * 256 * 256 +
(unsigned long)rfid.uid.uidByte[2] * 256 +
(unsigned long)rfid.uid.uidByte[3];
bool allowed = false;
for (int i = 0; i < whiteListSize; i++) {
if (uidNumber == whiteList[i]) {
allowed = true;
break;
}
}
lcd.clear();
if (allowed) {
Serial.println("ACCESS GRANTED");
digitalWrite(GREEN_LED, HIGH);
digitalWrite(RED_LED, LOW);
lcd.setCursor(0, 0);
lcd.print("ACCESS GRANTED");
lcd.setCursor(0, 1);
lcd.print("Welcome");
} else {
Serial.println("ACCESS DENIED");
digitalWrite(GREEN_LED, LOW);
digitalWrite(RED_LED, HIGH);
lcd.setCursor(0, 0);
lcd.print("ACCESS DENIED");
lcd.setCursor(0, 1);
lcd.print("Not authorized");
}
} else {
Serial.println("Invalid UID length");
digitalWrite(GREEN_LED, LOW);
digitalWrite(RED_LED, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ACCESS DENIED");
lcd.setCursor(0, 1);
lcd.print("Invalid UID");
}
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
delay(2000);
digitalWrite(GREEN_LED, LOW);
digitalWrite(RED_LED, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Scan card...");
}