#define BLYNK_TEMPLATE_ID "TMPL6V6RIr-X-"
#define BLYNK_TEMPLATE_NAME "Lab Monitoring System"
#define BLYNK_AUTH_TOKEN "kR-7K4iNeWRUj06EdeaJtV6zhzeP2S1r"
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <SPI.h>
#include <MFRC522.h>
#include <Keypad.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <ESP32Servo.h>
/*** WIFI ***/
const char* ssid = "Wokwi-GUEST";
const char* password = "";
/*** TELEGRAM ***/
const char* botToken = "8745623640:AAGEqT2T3GYeVEtGazK5PdoodEg8QJeHqaA ";
const char* chatID = "1379143187";
WiFiClientSecure secured_client;
UniversalTelegramBot bot(botToken, secured_client);
/*** PIN SETUP ***/
// RFID
#define SS_PIN 5
#define RST_PIN 4
MFRC522 rfid(SS_PIN, RST_PIN);
// DHT11
#define DHTPIN 15
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
// MQ2
#define MQ2_PIN 34
// LEDs
#define GREEN_LED 2
#define RED_LED 13
// Servo
#define SERVO_PIN 12
Servo doorServo;
// LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
/*** KEYPAD ***/
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] = {14, 27, 26, 25};
byte colPins[COLS] = {33, 32, 17, 16};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
/*** ACCESS DATA ***/
String correctPassword = "1234";
String inputPassword = "";
String authorizedUID = "D4F6A21B";
/*** SYSTEM STATE ***/
bool accessGranted = false;
unsigned long accessStartTime = 0;
bool systemLocked = false;
unsigned long lockStartTime = 0;
/*** FUNCTIONS ***/
void grantAccess() {
digitalWrite(GREEN_LED, HIGH);
digitalWrite(RED_LED, LOW);
accessGranted = true;
accessStartTime = millis();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("ACCESS GRANTED");
lcd.setCursor(0,1);
lcd.print("Door Opening");
doorServo.write(90);
bot.sendMessage(chatID, "â
ACCESS GRANTED\nđŞ Door Opening", "");
Blynk.virtualWrite(V0, 1);
Blynk.virtualWrite(V2, 1);
Blynk.virtualWrite(V3, 0);
delay(2000);
doorServo.write(0);
digitalWrite(GREEN_LED, LOW);
Blynk.virtualWrite(V2, 0);
}
void denyAccess() {
digitalWrite(RED_LED, HIGH);
systemLocked = true;
lockStartTime = millis();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("ACCESS DENIED");
bot.sendMessage(chatID, "â ACCESS DENIED\nâ ď¸ Unauthorized attempt!", "");
Blynk.virtualWrite(V4, 1);
Blynk.virtualWrite(V3, 1);
Blynk.virtualWrite(V2, 0);
doorServo.write(0);
delay(2000);
digitalWrite(RED_LED, LOW);
Blynk.virtualWrite(V3, 0);
}
void resetPasswordInput() {
inputPassword = "";
lcd.clear();
lcd.print("Enter Password:");
lcd.setCursor(0,1);
lcd.print(">");
}
void showReady() {
lcd.clear();
lcd.print("Tap Card / PIN");
}
/*** SETUP ***/
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.print("Connecting");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi Connected");
secured_client.setInsecure();
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, password);
SPI.begin();
rfid.PCD_Init();
dht.begin();
pinMode(GREEN_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
doorServo.attach(SERVO_PIN);
doorServo.write(0);
lcd.init();
lcd.backlight();
showReady();
}
/*** LOOP ***/
void loop() {
Blynk.run();
if (systemLocked && millis() - lockStartTime < 5000) {
return;
} else {
systemLocked = false;
}
if (accessGranted && millis() - accessStartTime > 5000) {
accessGranted = false;
}
if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
String uid = "";
for (byte i = 0; i < rfid.uid.size; i++) {
if (rfid.uid.uidByte[i] < 0x10) uid += "0";
uid += String(rfid.uid.uidByte[i], HEX);
}
uid.toUpperCase();
Serial.println(uid);
if (uid == authorizedUID) {
grantAccess();
} else {
denyAccess();
}
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
}
char key = keypad.getKey();
if (key) {
if (key == '#') {
if (inputPassword == correctPassword) {
grantAccess();
} else {
denyAccess();
}
inputPassword = "";
}
else if (key == '*') {
resetPasswordInput();
}
else {
inputPassword += key;
lcd.clear();
lcd.print("Enter Password:");
lcd.setCursor(0,1);
lcd.print(">");
for (int i = 0; i < inputPassword.length(); i++) {
lcd.print("*");
}
}
}
static unsigned long lastUpdate = 0;
if (millis() - lastUpdate >= 5000) {
lastUpdate = millis();
float temp = dht.readTemperature();
float hum = dht.readHumidity();
int gas = analogRead(MQ2_PIN);
Serial.println("Sending to Blynk...");
Blynk.virtualWrite(V1, temp);
Blynk.virtualWrite(V5, hum);
Blynk.virtualWrite(V1, gas);
if (gas > 2000) {
bot.sendMessage(chatID, "đ¨ GAS ALERT DETECTED!", "");
digitalWrite(RED_LED, HIGH);
}
}
}Loading
mfrc522
mfrc522