#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Keypad.h>
// OLED Display
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// RGB LED pins
const int redPin = 25;
const int greenPin = 26;
const int bluePin = 33;
// Other LED pins
const int LED1Pin = 12;
const int LED2Pin = 19;
const int LED3Pin = 13;
const int LED4Pin = 14;
// Buzzer pin
const int buzzerPin = 23;
// Keypad setup
const byte ROWS = 4; // four rows
const byte COLS = 4; // four columns
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {15, 2, 0, 4}; // Change to appropriate GPIO pins
byte colPins[COLS] = {16, 17, 5, 18}; // Change to appropriate GPIO pins
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
String password = "1234"; // Default password
String inputPassword = "";
int attemptCounter = 0;
const int maxAttempts = 4;
unsigned long lockoutTime = 0;
const unsigned long lockoutDuration = 31000; // 30 seconds
const unsigned long buzzerDuration = 1000;
void setup() {
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
pinMode(LED1Pin, OUTPUT);
pinMode(LED2Pin, OUTPUT);
pinMode(LED3Pin, OUTPUT);
pinMode(LED4Pin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
Serial.begin(115200);
// Initialize the OLED display
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x64
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.display();
delay(2000); // Give some time to start
// Display Welcome message
displayWelcomeMessage();
}
void loop() {
unsigned long currentMillis = millis();
if (attemptCounter >= maxAttempts && currentMillis - lockoutTime < lockoutDuration) {
displayCooldownMessage(lockoutDuration - (currentMillis - lockoutTime));
return;
}
char key = keypad.getKey();
if (key) {
if (key == '#') {
if (inputPassword == password) {
correctPassword();
attemptCounter = 0;
} else {
incorrectPassword();
attemptCounter++;
if (attemptCounter >= maxAttempts) {
lockoutTime = millis();
}
}
inputPassword = "";
} else if (key == '*') {
inputPassword = "";
} else {
inputPassword += key;
}
display.clearDisplay();
displayWelcomeMessage();
display.setCursor((SCREEN_WIDTH - 6 * inputPassword.length()) / 2, 25);
display.print(inputPassword);
display.display();
}
}
void correctPassword() {
// Green LED
digitalWrite(redPin, LOW);
digitalWrite(greenPin, HIGH);
digitalWrite(bluePin, LOW);
// Turn on solenoid lock
digitalWrite(LED1Pin, LOW);
digitalWrite(LED2Pin, LOW);
digitalWrite(LED3Pin, LOW);
digitalWrite(LED4Pin, HIGH);
// Buzzer beep
tone(buzzerPin, 500); // Example tone at 500 Hz
delay(buzzerDuration);
noTone(buzzerPin);
// Display message
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor((SCREEN_WIDTH - 6 * 14) / 2, 0); // Center text
display.println("Access Granted!");
display.display();
delay(4000);
display.clearDisplay();
display.display();
displayWelcomeMessage();
digitalWrite(LED1Pin, HIGH);
digitalWrite(LED2Pin, LOW);
digitalWrite(LED3Pin, LOW);
digitalWrite(LED4Pin, LOW);
}
void incorrectPassword() {
// Red LED
digitalWrite(redPin, HIGH);
digitalWrite(greenPin, LOW);
digitalWrite(bluePin, LOW);
// Buzzer beep for 3 seconds
for (int i = 0; i < 3; i++) {
tone(buzzerPin, 1000); // Example tone at 1000 Hz
delay(200);
}
delay(buzzerDuration - 600); // Delay to match 3 seconds
noTone(buzzerPin);
// Display message
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor((SCREEN_WIDTH - 6 * 14) / 2, 0); // Center text
display.println("Access Denied!");
display.setCursor((SCREEN_WIDTH - 6 * 19) / 2, 10); // Center text
int attemptsLeft = maxAttempts - (attemptCounter + 1);
if (attemptsLeft < 0) {
attemptsLeft = 0;
}
display.println("Attempts left: " + String(attemptsLeft));
display.display();
delay(4000); // Longer delay
// Display Welcome again
displayWelcomeMessage();
}
void displayCooldownMessage(unsigned long remainingTime) {
unsigned long startTime = millis();
while (millis() - startTime < remainingTime) {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
// Display first line centered
String line1 = "Too many attempts!";
int cursorX = (SCREEN_WIDTH - (line1.length() * 6)) / 2;
display.setCursor(cursorX, 0);
display.println(line1);
// Display second line centered
String line2 = "Try again after";
cursorX = (SCREEN_WIDTH - (line2.length() * 6)) / 2;
display.setCursor(cursorX, 10);
display.println(line2);
// Calculate remaining seconds
int secondsLeft = (remainingTime - (millis() - startTime)) / 1000;
String cooldownText = String(secondsLeft) + "s cooldown";
// Display cooldown time centered
cursorX = (SCREEN_WIDTH - (cooldownText.length() * 6)) / 2;
display.setCursor(cursorX, 20);
display.println(cooldownText);
display.display();
delay(1000);
// Turn on GPS, ESP32 Camera Module
digitalWrite(LED1Pin, LOW);
digitalWrite(LED2Pin, HIGH);
digitalWrite(LED3Pin, HIGH);
digitalWrite(LED4Pin, LOW);
}
// Display Welcome Back after cooldown
displayWelcomeMessage();
}
void displayWelcomeMessage() {
// Reset LED
digitalWrite(redPin, LOW);
digitalWrite(greenPin, LOW);
digitalWrite(bluePin, LOW);
// Fingerprint sensor operates
digitalWrite(LED1Pin, HIGH);
digitalWrite(LED2Pin, LOW);
digitalWrite(LED3Pin, LOW);
digitalWrite(LED4Pin, LOW);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
String welcomeText = "WELCOME!";
int cursorX = (SCREEN_WIDTH - (welcomeText.length() * 6)) / 2;
display.setCursor(cursorX, 5);
display.println(welcomeText);
String enterText = "Enter password:";
cursorX = (SCREEN_WIDTH - (enterText.length() * 6)) / 2;
display.setCursor(cursorX, 15);
display.println(enterText);
display.display();
}