UTS-iot (copy) — ESP32-S3 simulation

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

Components

Sketch code

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <ESP32Servo.h>
#include <PN532/PN532_I2C/PN532_I2C.h>
#include <PN532/PN532/PN532.h>
#include <NfcAdapter.h>
#include <WiFi.h>

#include <PubSubClient.h> // Pastikan library ini sudah ter-install di Velxio
#include "MqttHub.h"

// 1. Deklarasikan klien WiFi
WiFiClient wifiClient;

#define I2C_SDA 8
#define I2C_SCL 9

LiquidCrystal_I2C lcd(0x27, 16, 2); 

#define BUZZER_PIN 46

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] = {7,6,5,4}; 
byte colPins[COLS] = {14,12,11,10}; 

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

// ==========================================
// PENGATURAN KEAMANAN
// ==========================================
String correctPIN = "1234"; 
String guestPIN = "5678";   // TAMBAHAN: Variabel untuk PIN Tamu
String inputPIN = "";       
int wrongAttempts = 0;      
int MAX_ATTEMPTS = 3; 
bool clearAlarmViaMQTT = false; // Variabel pemicu reset alarm dari jarak jauh

// Ubah nilai ini untuk durasi lockdown (dalam milidetik)
// Contoh: 300000 = 5 menit, 60000 = 1 menit
unsigned long LOCKDOWN_DURATION = 10000; 
// ==========================================

Servo myServo;
int servoPin = 21;
int openBtnPin = 45;
int closeBtnPin = 48;
int doorMagnetSwitch = 17;
int belPin = 38;
int trig_pin = 1;
int echo_pin = 2;

// Variabel Status Pintu
bool btnOpenState = HIGH;
bool btnCloseState = HIGH;
bool belState = HIGH;
bool lastBelState = HIGH;
int doorStatus = 0; // 0 open 1 close
bool isFirst = true;
bool successUnlock = false;
bool isIntruderAlarmActive = false; 
bool lcdNeedsUpdate = true; 
long lastMeasuredDist = -1;

// Timers (Non-blocking variables)
unsigned long lastUltraSonicCheck = 0;
bool isPersonNear = false;
unsigned long lastNfcCheck = 0;
unsigned long buzzerTimer = 0;
unsigned long lcdMessageTimer = 0;
bool isBuzzerOn = false;

// Variabel Lockdown
bool isSystemLocked = false;
unsigned long lockdownTimer = 0;
unsigned long lastTimerUpdate = 0; 

PN532_I2C pn532i2c(Wire);
NfcAdapter nfc(pn532i2c);

// Fungsi non-blocking beep tunggal 
void triggerShortBeep() {
  for (int i = 0; i < 3; i++) {
    ledcWrite(BUZZER_PIN, 128);
    delay(500); 
    ledcWrite(BUZZER_PIN, 0);
    delay(500);
  }
}

// Fungsi Pintu
void openDoor() {
  successUnlock = true;
  for (int a = 0; a <= 180; a += 5) { myServo.write(a); delay(10); } 
}

void closeDoor() {
  successUnlock = false;
  for (int a = 180; a >= 0; a -= 5) { myServo.write(a); delay(10); } 
}

// Kembalikan ke menu utama 
void resetLcdToMain() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Enter PIN:");
  inputPIN = "";
  lcdNeedsUpdate = false;
}

void onMqttMessageReceived(String topic, String payload) {
  Serial.println("MQTT Masuk: [" + topic + "] -> " + payload);
  
  // Jika ada perintah untuk mereset alarm dari aplikasi/Hub Utama
  if (topic == 

More projects by itsmebenn