#define BLYNK_TEMPLATE_ID "TMPL6upe3rcdE"
#define BLYNK_TEMPLATE_NAME "Door Lock System"
#define BLYNK_AUTH_TOKEN "7MKY8uzYVC_uGQh8eXaVCc61mqRuSjb6"
#define BLYNK_PRINT Serial
const int RELAY_PIN = 25;
#include <Keypad.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>

char ssid[] = "Wokwi-GUEST";
char password[] = "";

LiquidCrystal_I2C lcd(0x26, 16, 2);
#define Password_Length 5

char Data[Password_Length];
char Master[Password_Length] = "1234";
byte data_count = 0;
bool door = false;
char customKey;
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] = {17, 19, 18, 4};
byte colPins[COLS] = {15, 2, 0, 16};

Keypad customKeypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
unsigned long doorOpenTime = 5000;

BLYNK_WRITE(V0) {
  int value = param.asInt();
  Serial.println(value);
  if (value == 1) {
    door = true;
    digitalWrite(RELAY_PIN, HIGH);
    lcd.clear();
    lcd.print("Door is Open");
    delay(2000);

  } else {
    door = false;
     digitalWrite(RELAY_PIN,LOW);
    lcd.clear();
    lcd.print("Door is Close");
delay(2000);
  }
}

void setup() {
  // Serial.begin(115200);
  lcd.init();
  lcd.backlight();
  pinMode(RELAY_PIN, OUTPUT);
  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, password);
  digitalWrite(RELAY_PIN, LOW);
  lcd.begin(16, 2);
  lcd.print("Protected Door");
  delay(2000);
  lcd.clear();
}

bool isfirsttime = true;
long previstime = 0;

void loop() {
  Blynk.run();
  if (door) {
    if (isfirsttime) {
      previstime = millis();
      isfirsttime = false;
    }

    unsigned long currentTime = millis();

    customKey = customKeypad.getKey();
    if (customKey == '#') {
      lcd.clear();
      digitalWrite(RELAY_PIN, LOW);
      lcd.print("Door is closed");
      // Serial.println("Relay is OFF");
      delay(3000);
      door = false;
      isfirsttime = true;
    } else if (customKey == 'A') {
      changePassword();
    } else {
      lcd.setCursor(0, 0);
      lcd.print("A to change PASS");
      lcd.setCursor(0, 1);
      lcd.print("# to close door ");

      if (currentTime - previstime >= 5200) {
        lcd.clear();
        digitalWrite(RELAY_PIN, LOW);
        lcd.print("Door is closed");
        // Serial.println("Relay is OFF");
        delay(3000);
        door = false;
        isfirsttime = true;
      }
    }
  } else {
    Open();
  }
}

void clearData() {
  while (data_count != 0) {
    Data[data_count--] = 0;
  }
  return;
}

void changePassword() {
  lcd.clear();
  lcd.print("Enter New Pass");

  while (data_count < Password_Length - 1) {
    customKey = customKeypad.getKey();
    if (customKey) {
      Data[data_count] = customKey;
      lcd.setCursor(data_count, 1);
      lcd.print('*');
      data_count++;
    }
  }

  lcd.clear();
  lcd.print("Password Changed");

  strncpy(Master, Data, Password_Length);

  delay(2000);
  lcd.clear();
  clearData();
}

void Open() {
  lcd.setCursor(0, 0);
  lcd.print("Enter Password");

  customKey = customKeypad.getKey();
  if (customKey) {
    Data[data_count] = customKey;
    lcd.setCursor(data_count, 1);
    lcd.print('*');
    data_count++;
  }

  if (data_count == Password_Length - 1) {
    if (!strcmp(Data, Master)) {
      lcd.clear();
      digitalWrite(RELAY_PIN, HIGH);
      lcd.print(" Door is Open ");
      door = true;
      doorOpenTime = millis();
      Serial.println("Relay is ON");
      delay(3000);
    } else {
      lcd.clear();
      lcd.print(" Wrong Password ");
      door = false;
      digitalWrite(RELAY_PIN, LOW);
      // Serial.println("Relay is OFF");
    }
    delay(1000);
    lcd.clear();
    clearData();
  }
}
esp:0
esp:2
esp:4
esp:5
esp:12
esp:13
esp:14
esp:15
esp:16
esp:17
esp:18
esp:19
esp:21
esp:22
esp:23
esp:25
esp:26
esp:27
esp:32
esp:33
esp:34
esp:35
esp:3V3
esp:EN
esp:VP
esp:VN
esp:GND.1
esp:D2
esp:D3
esp:CMD
esp:5V
esp:GND.2
esp:TX
esp:RX
esp:GND.3
esp:D1
esp:D0
esp:CLK
keypad1:R1
keypad1:R2
keypad1:R3
keypad1:R4
keypad1:C1
keypad1:C2
keypad1:C3
keypad1:C4
lcd1:GND
lcd1:VCC
lcd1:SDA
lcd1:SCL
NOCOMNCVCCGNDINLED1PWRRelay Module
relay1:VCC
relay1:GND
relay1:IN
relay1:NC
relay1:COM
relay1:NO
vcc1:VCC
led1:A
led1:C
gnd1:GND