Assalamualaikum Pertamina — ESP32 simulation

aw

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

Components

Sketch code

#define BLYNK_TEMPLATE_ID "TMPL6UPCQQv2p"
#define BLYNK_TEMPLATE_NAME "ESP32 SMART WATER LEVEL MONITORING"
#define BLYNK_AUTH_TOKEN "r2CqFwH5KifiOyhlYOMvY506sK2V2RFP"

#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define TRIG_PIN   27
#define ECHO_PIN   26
#define LED_PIN    14
#define BUZZER_PIN 13

#define OLED_SDA 21
#define OLED_SCL 22
#define OLED_ADDR 0x3C
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

// Parameter Toren
#define TANK_HEIGHT_CM 175.0
#define MAX_CAPACITY_L 2250.0

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

float distanceCm = TANK_HEIGHT_CM;
float waterHeight = 0.0;
float percentage = 0.0;
float volumeLiters = 0.0;

unsigned long lastSensorTime = 0;
unsigned long lastOLEDTime = 0;
unsigned long lastBlynkTime = 0;

bool isAlarmActive = false;
String statusPesan = "AMAN";

bool oledOK = false;
bool isBuzzerOn = false; 

volatile unsigned long echoStart = 0;
volatile unsigned long echoEnd = 0;
volatile bool newReading = false;

// Interrupt untuk HC-SR04 non-blocking
void IRAM_ATTR echoISR() {
  if (digitalRead(ECHO_PIN) == HIGH) {
    echoStart = micros();
  } else {
    echoEnd = micros();
    newReading = true;
  }
}

void setup() {
  Serial.begin(115200);
  
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  pinMode(LED_PIN, OUTPUT);

  digitalWrite(LED_PIN, LOW);
  
  attachInterrupt(digitalPinToInterrupt(ECHO_PIN), echoISR, CHANGE);

  Wire.begin(OLED_SDA, OLED_SCL);
  if (display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
    oledOK = true;
    display.clearDisplay();
    display.setTextColor(SSD1306_WHITE);
    display.setTextSize(1);
    display.setCursor(10, 25);
    display.println(F("Memulai Sistem..."));
    display.display();
  }

  WiFi.begin("TKA", "tka2026*#", 6);
  Blynk.config(BLYNK_AUTH_TOKEN);
}

void loop() {
  unsigned long currentMillis = millis();
  if (WiFi.status() == WL_CONNECTED) Blynk.run();

  // 1. Trigger Sensor Ultrasonik setiap 100ms
  if (currentMillis - lastSensorTime >= 100) {
    lastSensorTime = currentMillis;
    digitalWrite(TRIG_PIN, LOW);
    delayMicroseconds(2);
    digitalWrite(TRIG_PIN, HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIG_PIN, LOW);
  }

  // 2. Kalkulasi Fisika: Jarak, Tinggi Air, Persentase, dan Volume
  if (newReading) {
    unsigned long duration = echoEnd - echoStart;
    newReading = false;
    
    if (duration > 0 && duration < 35000) { 
      distanceCm = (duration * 0.0343) / 2.0;
      distanceCm = constrain(distanceCm, 2.0, TANK_HEIGHT_CM);
    } else {
      distanceCm = TANK_HEIGHT_CM;
    }
    
    waterHeight = TANK_HEIGHT_CM - distanceCm;
    if(waterHeight < 0) waterHeight = 0;
    
    percentage = (waterHeight / TANK_HEIGHT_CM) * 100.0;
    volumeLiters = (percentage / 100.0) * MAX_CAPACITY_L;
  }

  // 3. Logika Threshold & Alarm Otomatis
  if (percentage <= 5.0) {
    statusPesan = "SEGERA ISI AIR!!!";
  

More projects by juannikosilvano