#include #include #include #include #include // Pin definitions for ESP32 #define SS_PIN 21 // SDA/SS pin #define RST_PIN 22 // Reset pin #define SCK_PIN 18 // SCK pin #define MOSI_PIN 23 // MOSI pin #define MISO_PIN 19 // MISO pin #define OUTPUT_PIN 26 // Output pin to control // Nokia 5110 LCD pin definitions #define LCD_CLK 14 // SCK #define LCD_DIN 25 // MOSI #define LCD_DC 12 // Data/Command #define LCD_CE 33 // Chip Enable #define LCD_RST 32 // Reset Adafruit_PCD8544 display = Adafruit_PCD8544(LCD_CLK, LCD_DIN, LCD_DC, LCD_CE, LCD_RST); // Keypad configuration const byte ROWS = 4; const byte COLS = 3; char keys[ROWS][COLS] = { {'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}, {'*', '0', '#'} }; // Keypad pin connections byte rowPins[ROWS] = {5, 17, 16, 4}; // R1, R2, R3, R4 byte colPins[COLS] = {2, 13, 15}; // C1, C2, C3 Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS); MFRC522 mfrc522(SS_PIN, RST_PIN); // Variables for stable detection bool cardPresent = false; bool passwordEntered = false; bool waitingForPassword = false; unsigned long lastCardTime = 0; const unsigned long CARD_TIMEOUT = 300; // 300ms timeout // Password settings String correctPassword = "1234"; // Change this to your desired password String enteredPassword = ""; const int MAX_PASSWORD_LENGTH = 10; // Display variables unsigned long lastDisplayUpdate = 0; const unsigned long DISPLAY_UPDATE_INTERVAL = 100; // Update display every 100ms void setup() { Serial.begin(115200); // Initialize output pin pinMode(OUTPUT_PIN, OUTPUT); digitalWrite(OUTPUT_PIN, LOW); // Start with pin OFF // Initialize SPI with custom pins SPI.begin(SCK_PIN, MISO_PIN, MOSI_PIN, SS_PIN); // Initialize MFRC522 mfrc522.PCD_Init(); // Initialize Nokia 5110 display display.begin(); display.setContrast(50); // Adjust contrast (0-100) display.clearDisplay(); display.setTextSize(1); display.setTextColor(BLACK); // Show startup screen display.setCursor(0, 0); display.println("RFID Security"); display.println("System Ready"); display.println(""); display.println("Place card"); display.println("near reader"); display.display(); Serial.println("RFID Reader with Keypad Password System"); Serial.println("Place a card near the reader..."); Serial.println("After card detection, enter password on keypad"); Serial.println("GPIO 26 will turn ON when both card is detected AND correct password is entered"); Serial.println(); } void updateDisplay() { display.clearDisplay(); display.setCursor(0, 0); display.setTextSize(1); if (!cardPresent) { // No card detected display.println("RFID Security"); display.println(""); display.println("Place card"); display.println("near reader"); display.println(""); display.print("Status: LOCKED"); } else if (waitingForPassword) { // Card detected, waiting for password display.println("Card Detected!"); display.println(""); display.println("Enter Password:"); display.println(""); // Show password as asterisks display.print("Pass: "); for (int i = 0; i < enteredPassword.length(); i++) { display.print("*"); } display.println(""); display.print("Press # to enter"); } else if (passwordEntered) { // Both card and password correct display.println("ACCESS GRANTED"); display.println(""); display.println("System: UNLOCKED"); display.println(""); display.println("Machine: Running"); display.println(""); display.print("Remove card"); } display.display(); } void loop() { bool cardDetected = false; // Check if card is present if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) { cardDetected = true; lastCardTime = millis(); // Print card info only when first detected if (!cardPresent) { Serial.println("Card detected!"); Serial.print("Card UID: "); for (byte i = 0; i < mfrc522.uid.size; i++) { Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(mfrc522.uid.uidByte[i], HEX); } Serial.println(); // Print card type MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak); Serial.print("Card type: "); Serial.println(mfrc522.PICC_GetTypeName(piccType)); // Start password entry process waitingForPassword = true; passwordEntered = false; enteredPassword = ""; Serial.println("Please enter password on keypad:"); Serial.println("---"); } } // Update card presence with timeout for stability if (cardDetected) { cardPresent = true; } else if (millis() - lastCardTime > CARD_TIMEOUT) { if (cardPresent) { Serial.println("Card removed. GPIO 26 OFF"); // Reset password states when card is removed waitingForPassword = false; passwordEntered = false; enteredPassword = ""; } cardPresent = false; } // Handle keypad input when waiting for password if (waitingForPassword && cardPresent) { char key = keypad.getKey(); if (key) { Serial.print("Key pressed: "); Serial.println(key); if (key == '#') { // Enter key - check password if (enteredPassword == correctPassword) { Serial.println("Password CORRECT! GPIO 26 ON"); passwordEntered = true; waitingForPassword = false; } else { Serial.println("Password INCORRECT! Try again:"); enteredPassword = ""; // Show error on display briefly display.clearDisplay(); display.setCursor(0, 0); display.println("WRONG PASSWORD"); display.println(""); display.println("Try Again..."); display.display(); delay(1500); } } else if (key == '*') { // Clear key - reset password entry Serial.println("Password cleared. Enter password:"); enteredPassword = ""; } else if (key >= '0' && key <= '9') { // Number key - add to password if (enteredPassword.length() < MAX_PASSWORD_LENGTH) { enteredPassword += key; Serial.print("Password: "); // Print asterisks for security for (int i = 0; i < enteredPassword.length(); i++) { Serial.print("*"); } Serial.println(); } } // Update display immediately after key press updateDisplay(); } } // Set GPIO based on both card presence AND correct password bool shouldActivate = cardPresent && passwordEntered; digitalWrite(OUTPUT_PIN, shouldActivate ? HIGH : LOW); // Update display periodically if (millis() - lastDisplayUpdate > DISPLAY_UPDATE_INTERVAL) { updateDisplay(); lastDisplayUpdate = millis(); } delay(50); // Faster checking for better stability }