Smart Door Lock Berbasis ESP32 Sebagai Solusi Keamanan Pintu Modern
Di tengah pesatnya perkembangan teknologi Internet of Things (IoT), sistem keamanan pintu kini dapat dirancang menjadi lebih cerdas, praktis, dan aman. Salah satu inovasi yang dapat diterapkan sebagai solusi keamanan modern adalah Simulasi Mini Smart Door Lock berbasis ESP32. Sistem ini memungkinkan penguncian dan pembukaan pintu dilakukan secara otomatis dan terkontrol dengan memanfaatkan teknologi mikrokontroler dan perangkat elektronik pendukung.
KONSEP DAN CARA KERJA SISTEM
Simulasi Mini Smart Door Lock berbasis ESP32 dirancang menggunakan mikrokontroler ESP32 sebagai pusat pengendali sistem. ESP32 memiliki kemampuan pemrosesan yang baik serta dukungan konektivitas WiFi dan Bluetooth, sehingga sangat sesuai untuk aplikasi sistem keamanan pintar. Sistem ini dilengkapi dengan aktuator kunci elektronik seperti solenoid door lock atau servo motor, serta perangkat input seperti tombol, keypad, atau modul RFID sebagai media autentikasi pengguna.
Ketika pengguna memberikan perintah pembukaan kunci melalui media input yang tersedia, ESP32 akan memproses data tersebut dan memverifikasi apakah perintah yang diterima valid. Jika autentikasi berhasil, ESP32 akan mengaktifkan relay atau driver motor untuk membuka kunci pintu. Sebaliknya, jika autentikasi gagal, sistem akan menolak akses dan pintu tetap dalam kondisi terkunci. Mekanisme ini bertujuan untuk meningkatkan tingkat keamanan serta mencegah akses yang tidak sah.
Sebagai simulasi, sistem ini dapat dilengkapi dengan indikator seperti LED atau buzzer untuk memberikan notifikasi status kunci pintu, apakah dalam kondisi terkunci atau terbuka. Dengan penerapan sistem kontrol otomatis, pengoperasian kunci pintu menjadi lebih efisien dan aman dibandingkan sistem kunci konvensional.
Adapun cara kerja Mini Smart Door Lock Berbasis ESP32 dapat dijelaskan sebagai berikut:
1. Inisialisasi Sistem
ESP32 melakukan inisialisasi seluruh komponen, termasuk pin input dan output, modul autentikasi, aktuator kunci, serta indikator LED atau buzzer. Setelah sistem aktif, ESP32 siap menerima perintah.
2. Input dan Autentikasi Pengguna
Pengguna memberikan input melalui media yang disediakan, seperti tombol, keypad, atau RFID. Data input tersebut kemudian diproses dan diverifikasi oleh ESP32.
3. Proses Validasi Akses
ESP32 membandingkan data input dengan data yang telah disimpan sebelumnya. Jika data sesuai, sistem menganggap akses valid.
4. Pengendalian Kunci Pintu
Jika autentikasi berhasil, ESP32 akan mengaktifkan relay atau aktuator sehingga kunci pintu terbuka. Jika tidak valid, aktuator tidak diaktifkan dan pintu tetap terkunci.
5. Indikator Status Sistem
LED atau buzzer akan memberikan informasi mengenai status sistem, seperti pintu terkunci, pintu terbuka, atau akses ditolak.
6. Penguncian Kembali Otomatis
Setelah waktu tertentu, sistem dapat mengunci kembali pintu secara otomatis untuk meningkatkan keamanan.
Coding
void unlockDoor(); void lockDoor(); #include <Arduino.h> #include <WiFi.h> #include <PubSubClient.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <ESP32Servo.h> #include <Keypad.h> #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 32 #define OLED_RESET -1 #define SERVO_PIN 4 #define BUZZER_PIN 5 #define I2C_SDA 21 #define I2C_SCL 22 const char* ssid = " CUSTOM HERE "; const char* password_wifi = "CUSTOM HERE"; const char* mqtt_server = "test.mosquitto.org"; WiFiClient espClient; PubSubClient client(espClient); Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
&Wire, OLED_RESET); Servo lockServo; bool doorUnlocked = false; unsigned long unlockStartTime = 0; // 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] = {13, 12, 14, 27}; byte colPins[COLS] = {26, 25, 33, 32}; Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins,
ROWS, COLS); String inputPassword = ""; String openPassword = "1234"; void setup_wifi() { delay(10); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password_wifi); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void showOLED(const char* msg) { display.clearDisplay(); display.setTextSize(2); int16_t x, y; uint16_t width, height; display.getTextBounds(msg, 0, 0, &x, &y, &width,
&height); display.setCursor((SCREEN_WIDTH - width) / 2, (SCREEN_HEIGHT
- height) / 2); display.print(msg); display.display(); Serial.print("[DEBUG] OLED: "); Serial.println(msg); } void lockDoor() { lockServo.write(0); digitalWrite(BUZZER_PIN, HIGH); delay(100); digitalWrite(BUZZER_PIN, LOW); showOLED("Locked"); doorUnlocked = false; Serial.println("[DEBUG] Door locked"); } void unlockDoor() { lockServo.write(45); digitalWrite(BUZZER_PIN, HIGH); delay(100); digitalWrite(BUZZER_PIN, LOW); showOLED("Unlocked"); doorUnlocked = true; unlockStartTime = millis(); Serial.println("[DEBUG] Door unlocked"); } void incorrectPassword() { showOLED("Incorrect"); for (int i = 0; i < 3; i++) { digitalWrite(BUZZER_PIN, HIGH); delay(100); digitalWrite(BUZZER_PIN, LOW); delay(100); } } void displayMaskedPassword() { display.clearDisplay(); display.setCursor(0, 0); display.setTextSize(2); display.print("Password: "); for (int i = 0; i < inputPassword.length(); i++) { display.print('*'); } display.display(); } void callback(char* topic, byte* payload, unsigned int
length) { String message; for (unsigned int i = 0; i < length; i++) { message += (char)payload[i]; } Serial.print("[DEBUG] MQTT message: '"); Serial.print(message); Serial.println("'"); if (String(topic) == "esp32/door") { if (message == "UNLOCK") { unlockDoor(); } else { lockDoor(); } } } void reconnect() { while (!client.connected()) { Serial.print("Attempting MQTT connection..."); String clientId = "ESP32Client-"; clientId += String(random(0xffff), HEX); if (client.connect(clientId.c_str())) { Serial.println("connected"); client.subscribe("esp32/door"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); delay(5000); } } } void setup() { Serial.begin(115200); Wire.begin(I2C_SDA, I2C_SCL); setup_wifi(); client.setServer(mqtt_server, 1883); client.setCallback(callback); if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F("SSD1306 allocation failed")); for (;;); } display.display(); delay(1000); display.clearDisplay(); lockServo.attach(SERVO_PIN); lockDoor(); pinMode(BUZZER_PIN, OUTPUT); digitalWrite(BUZZER_PIN, LOW); showOLED("Locked"); // Tes OLED display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0, 0); display.print("OLED TEST"); display.setTextSize(1); display.setCursor(0, 20); display.print("Jika ini tampil, OLED OK"); display.display(); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); // Keypad selalu aktif, baik locked maupun unlocked char key = keypad.getKey(); if (key) { digitalWrite(BUZZER_PIN, HIGH); delay(50); digitalWrite(BUZZER_PIN, LOW); if (key == '#') { Serial.print("[DEBUG] inputPassword: "); Serial.println(inputPassword); if (inputPassword == openPassword) { unlockDoor(); Serial.println("Unlocked!"); } else { incorrectPassword(); Serial.println("Password salah!"); } inputPassword = ""; } else if (key == '*') { inputPassword = ""; showOLED("Locked"); } else { inputPassword += key; Serial.print("[DEBUG] inputPassword now: "); Serial.println(inputPassword); } } // Auto-tutup jika sudah if (doorUnlocked && (millis() - unlockStartTime >
5000)) { lockDoor(); Serial.println("[AUTO] Door auto-locked after 5
seconds."); } |
Video dokumentasi perancangan dapat diakses melalui tautan berikut:
https://drive.google.com/drive/folders/1X9q5BTviynEa1JBScRl6xymQhRj9djcK