#include <ESP32Servo.h>
#define BLYNK_TEMPLATE_ID "TMPL5YKoRtSDP"
#define BLYNK_TEMPLATE_NAME "IoT Physical Practical Part II"
#define BLYNK_AUTH_TOKEN "B3rGzzFxg-sS8rkE-v9KBxFGAbVyr0G9"
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <Password.h>
#include <DHT.h>
#include <Wire.h>
#include <RTClib.h>
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#define servoPin 15
#define DHTPIN 13
#define DHTTYPE DHT22
#define redPin 25
#define greenPin 26
#define bluePin 27
#define buzzerPin 14
const char* ssid = "Wokwi-GUEST";
const char* password = "";
Servo servo;
DHT dht(DHTPIN, DHTTYPE);
RTC_DS3231 rtc;
LiquidCrystal_I2C lcd(0x27, 20, 4);
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] = {32, 19, 18, 5};
byte colPins[COLS] = {17, 16, 4, 2};
bool isDoorLocked = true;
Password doorPassword("1");
byte maxPasswordLength = 6;
byte currentPasswordLength = 0;
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
void setup() {
Serial.begin(115200);
servo.attach(servoPin);
servo.write(10);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Door LOCK Info System");
delay(2000);
lcd.clear();
dht.begin();
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("RTC not found");
while (1);
}
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
setRGBColor(0, 0, 220); // Initial color Blue for locked door
// Connect to Wi-Fi and Blynk
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to Wi-Fi");
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, password);
}
void loop() {
Blynk.run();
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
DateTime now = rtc.now();
lcd.setCursor(3, 0);
isDoorLocked ? lcd.print("DOOR LOCKED") : lcd.print("DOOR OPEN");
lcd.setCursor(0, 1);
lcd.print("Temperature: ");
lcd.print(temperature);
lcd.print("C");
lcd.setCursor(0, 2);
lcd.print("Humidity: ");
lcd.print(humidity);
lcd.print("%");
lcd.setCursor(6, 3); // Adjust the position to center the time
if (now.hour() < 10) lcd.print('0');
lcd.print(now.hour());
lcd.print(':');
if (now.minute() < 10) lcd.print('0');
lcd.print(now.minute());
lcd.print(':');
if (now.second() < 10) lcd.print('0');
lcd.print(now.second());
char key = keypad.getKey();
Serial.println(key);
if (key != NO_KEY) {
delay(100);
if (key == '#') {
checkDoorPassword();
} else {
processNumberKey(key);
}
}
// Send data to Blynk
Blynk.virtualWrite(V1, temperature);
Blynk.virtualWrite(V2, humidity);
Blynk.virtualWrite(V3, isDoorLocked ? "LOCKED" : "OPEN");
}
void processNumberKey(char key) {
if (currentPasswordLength < maxPasswordLength) {
lcd.setCursor(currentPasswordLength + 5, 1);
lcd.print("*");
doorPassword.append(key);
currentPasswordLength++;
}
}
void checkDoorPassword() {
if (doorPassword.evaluate()) {
doorOpen();
} else {
setRGBColor(255, 0, 0); // Red for wrong password
displayMessage("Wrong Password", "Try Again");
activateBuzzer(5); // Activate buzzer 5 times
setRGBColor(0, 0, 220);
resetDoorPassword();
}
}
void doorOpen() {
servo.write(180);
setRGBColor(0, 255, 0); // Green for correct password
displayMessage("Password Correct", "DOOR UNLOCKED");
activateBuzzer(1); // Activate buzzer 1 time
delay(10000); // Keep green for 10 seconds
servo.write(10); // Lock the door again
setRGBColor(0, 0, 220);
isDoorLocked = true;
displayMessage("Door Locked", "Automatically");
resetDoorPassword();
}
void resetDoorPassword() {
doorPassword.reset();
currentPasswordLength = 0;
lcd.clear();
lcd.setCursor(0, 0);
}
void displayMessage(const char *line1, const char *line2) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(line1);
lcd.setCursor(3, 1);
lcd.print(line2);
delay(3000);
lcd.clear();
}
void setRGBColor(int red, int green, int blue) {
analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);
}
void activateBuzzer(int buzzCount) {
for (int i = 0; i < buzzCount; i++) {
digitalWrite(buzzerPin, HIGH);
delay(200);
digitalWrite(buzzerPin, LOW);
delay(100);
}
}