#define BLYNK_TEMPLATE_ID "TMPL6v8TWbZsr"
#define BLYNK_TEMPLATE_NAME "Smart door lock"
#define BLYNK_AUTH_TOKEN "eEAhl7vPoq0L4bcQMTnAeobM7rtMwAjH"
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <ESP32Servo.h>
// WiFi credentials
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// LCD I2C
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Ultrasonic pins
#define TRIG_PIN 5
#define ECHO_PIN 4
// Output
#define LED_PIN 10
#define BUZZER_PIN 13
#define SERVO_PIN 11
// Password
String sandiRumah = "2025";
int i = 0;
const int n = 3;
bool aksesMasuk = false;
// Servo object
Servo pintuServo;
// Keypad setup
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] = {1, 2, 42, 41};
byte colPins[COLS] = {35, 0, 45, 48};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// Blynk input handler
BLYNK_WRITE(V2) {
String inputDariBlynk = param.asStr();
handlePassword(inputDariBlynk);
}
void setup() {
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
digitalWrite(BUZZER_PIN, LOW);
Serial.begin(115200);
Wire.begin(21, 20);
lcd.init();
lcd.backlight();
pintuServo.attach(SERVO_PIN);
pintuServo.write(0);
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
lcd.setCursor(0, 0);
lcd.print("Perangkat On");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Group 6 - TT4609");
delay(2000);
lcd.clear();
}
void loop() {
Blynk.run();
long waktu;
int jarak;
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
waktu = pulseIn(ECHO_PIN, HIGH);
jarak = waktu * 0.034 / 2;
if (jarak < 50 && !aksesMasuk) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Selamat Datang!");
Blynk.virtualWrite(V0, "Selamat Datang!");
delay(2000);
lcd.clear();
handlePasswordKeypad();
}
delay(500);
}
void handlePasswordKeypad() {
String input = "";
lcd.setCursor(0, 0);
lcd.print("Masukkan Kode:");
lcd.setCursor(0, 1);
lcd.print("> ");
while (input.length() < 4) {
char key = keypad.getKey();
if (key) {
if (key == '#') break;
input += key;
lcd.print("*");
}
}
lcd.clear();
handlePassword(input);
}
void handlePassword(String input) {
lcd.setCursor(0, 0);
lcd.print("Verifikasi...");
Blynk.virtualWrite(V0, "Verifikasi...");
if (input == sandiRumah) {
aksesMasuk = true;
lcd.clear();
lcd.print("Akses Diterima");
Blynk.virtualWrite(V0, "Akses Diterima");
digitalWrite(LED_PIN, HIGH);
pintuServo.write(90);
delay(5000);
pintuServo.write(0);
digitalWrite(LED_PIN, LOW);
lcd.clear();
} else {
i++;
if (i >= n) {
lcd.print("Akses Ditolak!");
tone(BUZZER_PIN, 1000);
Blynk.virtualWrite(V0, "Akses Ditolak!");
Blynk.virtualWrite(V1, 1);
delay(3000);
noTone(BUZZER_PIN);
Blynk.virtualWrite(V1, 0);
lcd.clear();
} else {
lcd.print("Kode Salah!");
Blynk.virtualWrite(V0, "Kode Salah! Coba Lagi");
delay(2000);
lcd.clear();
}
}
}