#include <Servo.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#define I2C_ADDR 0x27
#define LCD_COLUMNS 20
#define LCD_LINES 4
#define buzzer 13
#define red_led 12
#define green_led 11
#define red_button 9
#define yellow_button 8
#define green_button 7
const uint8_t ROWS = 4;
const uint8_t COLS = 3;
char keys[ROWS][COLS] = {
{ '1', '2', '3' },
{ '4', '5', '6' },
{ '7', '8', '9' },
{ '*', '0', '#' }
};
uint8_t colPins[COLS] = { 4, 5, 6 };
uint8_t rowPins[ROWS] = { 0, 1, 2, 3 };
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
Servo myservo;
const int max_access_records = 10;
char granted_access[max_access_records];
char denied_access[max_access_records];
int granted_count = 0;
int denied_count = 0;
bool is_pressed = false;
void setup() {
lcd.init();
lcd.backlight();
pinMode(red_led, OUTPUT);
pinMode(green_led, OUTPUT);
pinMode(red_button, INPUT_PULLUP);
pinMode(green_button, INPUT_PULLUP);
pinMode(yellow_button, INPUT_PULLUP);
pinMode(buzzer, OUTPUT);
myservo.attach(10);
myservo.write(0);
Serial.begin(115200);
}
void loop() {
if(digitalRead(red_button) == LOW && !is_pressed){
red_key();
}
if (digitalRead(red_button) == HIGH) {
is_pressed = false;
}
if(digitalRead(green_button) == LOW && !is_pressed){
green_key();
}
if (digitalRead(green_button) == HIGH) {
is_pressed = false;
}
if(digitalRead(yellow_button) == LOW && !is_pressed){
admin_key();
}
if (digitalRead(yellow_button) == HIGH) {
is_pressed = false;
}
}
void red_key(){
is_pressed = true;
turn_led(red_led);
access_denied();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Failed access!");
if(denied_count < max_access_records){
denied_access[denied_count] = "*";
lcd.clear();
lcd.setCursor(0, 0);
lcd.println("Failed attemp # ");
lcd.setCursor(0, 1);
lcd.println(denied_count);
denied_count++;
} else{
Serial.println("You have reached the limit!");
}
}
void green_key(){
is_pressed = true;
turn_led(green_led);
access_granted();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Successful access!");
open_door(3000);
if(granted_count < max_access_records){
granted_access[granted_count] = "*";
lcd.clear();
lcd.setCursor(0, 0);
lcd.println("Successful attemp # ");
lcd.setCursor(0, 1);
lcd.println(granted_count);
granted_count++;
} else{
Serial.println("You have reached the limit!");
}
}
void admin_key(){
is_pressed = true;
turn_led(green_led);
turn_led(red_led);
turn_led(green_led);
access_admin();
lcd.clear();
lcd.setCursor(0, 0);
lcd.println("Admin access");
lcd.setCursor(0, 1);
lcd.println("Enter a pin:");
String enteredCode = getInputFromKeypad();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Code received:");
lcd.setCursor(0, 1);
lcd.print(enteredCode);
Serial.print("Entered code: ");
Serial.println(enteredCode);
if (enteredCode == "3897") {
lcd.clear();
lcd.print("Successful access!");
open_door(3000);
} else {
lcd.clear();
lcd.print("Failed access!");
access_denied();
}
}
void access_granted(){
tone(buzzer, 1000, 100);
delay(200);
noTone(buzzer);
}
void access_denied(){
tone(buzzer, 500, 100);
delay(200);
noTone(buzzer);
}
void access_admin(){
tone(buzzer, 100, 100);
delay(200);
noTone(buzzer);
}
void turn_led(int pin){
digitalWrite(pin, HIGH);
delay(500);
digitalWrite(pin, LOW);
}
void open_door(int time){
myservo.write(90);
delay(time);
myservo.write(0);
}
String getInputFromKeypad() {
String input = "";
char key;
while (true) {
key = keypad.getKey();
if (key != NO_KEY) {
if (key == '*') {
return input;
} else if (key == '#') {
input = "";
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Input cleared!");
Serial.println("Input cleared!");
} else {
if (input.length() < 5) {
input += key;
lcd.setCursor(input.length() - 1, 1);
lcd.print(key);
Serial.print(key);
} else {
lcd.setCursor(0, 0);
lcd.print("Max length reached!");
Serial.println("Max length reached!");
}
}
}
}
}