Smart Security and Lightning Vault — ESP32 simulation

An interactive ESP32 circuit simulation you can run free in your browser on Velxio, by ryanankar.

Components

Sketch code

#define BLYNK_TEMPLATE_ID           "TMPL6VY-TOzBZ"
#define BLYNK_TEMPLATE_NAME         "Quickstart Device"
#define BLYNK_AUTH_TOKEN            "uEaJ7GnIcPUskG7eqj69s1cMSBMYvMSA"

#define BLYNK_PRINT Serial

#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>

// Konfigurasi WiFi
char ssid[] = "ARFANAKBAR";
char pass[] = "Aespa1705-";

// Inisialisasi LCD I2C (Alamat 0x27, ukuran 16x2)
LiquidCrystal_I2C lcd(0x27, 16, 2);

// Inisialisasi Servo
Servo lockServo;

// Definisi Pin Komponen
const int SPEAKER_PIN = 32;    // Grove Speaker di D32
const int LED_RED = 18;        // LED Merah (Bahaya)
const int LED_GREEN = 5;       // LED Hijau (Aman)
const int BUTTON_PIN = 4;     // Pushbutton Fisik (toggle override)
const int SERVO_PIN = 25;      // Servo Motor

// Alamat I2C TSL2561
const int TSL2561_ADDR = 0x29;

// Ambang batas cahaya awal (bisa diubah dinamis via Blynk V5)
unsigned int LUX_THRESHOLD = 2000;

BlynkTimer timer;

// Nilai cahaya terakhir yang valid (global agar bisa dipakai tombol)
unsigned int lightVal = 0;

// Status sistem & alarm
bool systemDanger = false;
bool alarmState = false;
bool manualOverride = false;

// Variabel untuk deteksi tekan tombol fisik (edge detection + debounce)
bool lastButtonState = HIGH;
unsigned long lastButtonTime = 0;

// ==========================================
// EVALUASI STATUS & KONTROL HARDWARE
// ==========================================

// Satu-satunya tempat yang menentukan status BAHAYA/AMAN dan mengatur LED, alarm, LCD.
void updateStatus() {
  // Override otomatis berakhir jika kotak benar-benar ditutup
  if (lightVal <= LUX_THRESHOLD) {
    manualOverride = false;
  }

  systemDanger = (lightVal > LUX_THRESHOLD && !manualOverride);

  if (systemDanger) {
    // --- KONDISI BAHAYA ---
    digitalWrite(LED_RED, HIGH);
    digitalWrite(LED_GREEN, LOW);
    lockServo.write(90);    // <-- TAMBAHKAN INI: Servo membuka ke 90 derajat saat bahaya

    if (!alarmState) {
      tone(SPEAKER_PIN, 1000);
      alarmState = true;
    }

    lcd.setCursor(0, 1);
    lcd.print("STATUS: BAHAYA! ");
    Blynk.virtualWrite(V9, "BAHAYA: KOTAK DIBUKA!");
  }
  else {
    // --- KONDISI AMAN ---
    digitalWrite(LED_RED, LOW);
    digitalWrite(LED_GREEN, HIGH);
    lockServo.write(0);     // <-- TAMBAHKAN INI: Servo kembali mengunci ke 0 derajat saat aman

    if (alarmState) {
      noTone(SPEAKER_PIN);
      alarmState = false;
    }

    lcd.setCursor(0, 1);
    lcd.print("STATUS: AMAN    ");
    Blynk.virtualWrite(V9, manualOverride ? "Aman (Override)" : "Aman");
  }
}

// Toggle override (dipakai tombol fisik dan tombol Blynk V4):
//  - Saat BAHAYA            -> override AKTIF  (jadi AMAN)
//  - Saat override aktif    -> override MATI   (cek ulang: lux > threshold = BAHAYA lagi)
//  - Saat aman karena gelap -> tidak ada yang berubah
void toggleOverride() {
  if (systemDanger) {
    manualOverride = true;
    lockServo

More projects by ryanankar