#define AUTO_LOCK_TIMER 2000 // 5 minutes in milliseconds
// These are macros defining the Blynk template
#define BLYNK_TEMPLATE_ID "TMPL5gocehxa1"//template ID
#define BLYNK_TEMPLATE_NAME "doorLock"//template name
#define BLYNK_AUTH_TOKEN "Sz6fBxpkpiJshCuA76PRQE9xSu-6T4vU"//authentication token
// The code includes various libraries necessary for working with WiFi, a keypad, I2C LCD, and a Servo motor on an ESP32.
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <Keypad.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>
#define led 25
int buzzer = 13;
char auth[] = BLYNK_AUTH_TOKEN;
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {15, 2, 4, 5};
byte colPins[COLS] = {18, 19, 27, 23};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
const int potPin = A0;
Servo myServo;
const int servoPin = 14;
const int unlockPosition = -90;
const int lockPosition = 90;
LiquidCrystal_I2C lcd(0x27, 16, 2);
bool locked = true;
char enteredCode[5];
int codeIndex = 0;
BlynkTimer timer;
unsigned long unlockTime = 0;
bool autoLockEnabled = false;
bool fiveSecMessageDisplayed = false;
BLYNK_WRITE(V2) {
int switchState = param.asInt();
if (switchState == HIGH) {
unlockDoor();
} else {
lockDoor();
}
}
void setup() {
Serial.begin(9600);
Blynk.begin(auth, "Wokwi-GUEST", "");
myServo.attach(servoPin);
lcd.init();
lcd.backlight();
updateLockStatus();
timer.setInterval(1000L, updateBlynk);
pinMode(led, OUTPUT);
pinMode(buzzer, OUTPUT);
}
void updateBlynk() {
Blynk.virtualWrite(V2, locked ? 0 : 1);
}
void loop() {
Blynk.run();
timer.run();
char key = keypad.getKey();
if (key) {
handleKeypadInput(key);
}
digitalWrite(led, locked ? LOW : HIGH);
if (autoLockEnabled && millis() - unlockTime >= AUTO_LOCK_TIMER) {
if (millis() - unlockTime >= AUTO_LOCK_TIMER - 5000 && !fiveSecMessageDisplayed) {
lcd.clear();
lcd.print("Initiating Auto Door Lock");
fiveSecMessageDisplayed = true;
}
if (millis() - unlockTime >= AUTO_LOCK_TIMER) {
lockDoor();
lcd.clear();
lcd.print("Auto Locked");
autoLockEnabled = false;
fiveSecMessageDisplayed = false;
}
}
}
void updateLockStatus() {
if (locked) {
lcd.clear();
lcd.print("Door Locked");
Blynk.virtualWrite(V0, 0);
Blynk.virtualWrite(V1, "Door Locked");
} else {
lcd.clear();
lcd.print("Door Unlocked");
Blynk.virtualWrite(V0, 255);
Blynk.virtualWrite(V1, "Door Unlocked");
}
}
void handleKeypadInput(char key) {
if (locked) {
if (key == '#' && codeIndex > 0) {
enteredCode[codeIndex] = '\0';
codeIndex = 0;
if (strcmp(enteredCode, "1234") == 0) {
unlockDoor();
lcd.clear();
lcd.print("Door Unlocked");
Serial.println("Door Unlocked");
digitalWrite(led, LOW);
noTone(buzzer);
Blynk.virtualWrite(V1, "Door Unlocked");
Blynk.virtualWrite(V4, LOW);
Blynk.virtualWrite(V3, LOW);
Blynk.virtualWrite(V2, HIGH);
} else {
lcd.clear();
lcd.print("Incorrect Pin!");
Serial.println("Incorrect Pin!");
Serial.println("There are error!!, Door locked");
digitalWrite(led, HIGH);
tone(buzzer,300);
Blynk.virtualWrite(V3, HIGH);
Blynk.virtualWrite(V4, HIGH);
Blynk.virtualWrite(V2, LOW);
delay(2000);
lcd.clear();
lcd.print("Door Locked");
}
memset(enteredCode, 0, sizeof(enteredCode));
} else if (key == 'C' && codeIndex > 0) {
lcd.setCursor(codeIndex - 1, 1);
lcd.print(' ');
codeIndex--;
enteredCode[codeIndex] = '\0';
} else if (key != '#' && key != 'C' && codeIndex < sizeof(enteredCode) - 1) {
enteredCode[codeIndex] = key;
lcd.setCursor(codeIndex, 1);
lcd.print('*');
codeIndex++;
}
} else {
if (key == '*') {
lockDoor();
lcd.clear();
lcd.print("Door Locked");
Blynk.virtualWrite(V1, "Door Locked");
Blynk.virtualWrite(V2, 0);
}
}
}
void unlockDoor() {
locked = false;
myServo.write(unlockPosition);
unlockTime = millis();
autoLockEnabled = true;
updateLockStatus();
}
void lockDoor() {
locked = true;
myServo.write(lockPosition);
updateLockStatus();
}