#include <Arduino.h>
//Blynk batara
#define BLYNK_TEMPLATE_ID "TMPL6vvYT2h6v"
#define BLYNK_TEMPLATE_NAME "IOT Tandon"
#define BLYNK_AUTH_TOKEN "KIHDXb8knQ6YsBQ4ivvTLkYr96kY9uil"
//Blynk Zakaa
// #define BLYNK_TEMPLATE_ID "TMPL6tv4diXcp"
// #define BLYNK_TEMPLATE_NAME "Sensor Suhu"
// #define BLYNK_AUTH_TOKEN "D8ozl9vC0VrcRMq3UPN_lDIJ5Hs16zCP"
// #define BLYNK_TEMPLATE_ID "TMPL6YwX6uJlE"
// #define BLYNK_TEMPLATE_NAME "suhu"
// #define BLYNK_AUTH_TOKEN "BS_APltCStHzmDzil5sfTkLfZJPpX6jn"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
#define PIN_FLOAT_SWITCH 4 // Slide switch untuk mendeteksi air minimum
#define TRIG_PIN 5 // Trigger Ultrasonic
#define ECHO_PIN 18 // Echo Ultrasonic
#define RELAY_PIN 19 // Relay ke solenoid valve
#define LED_SOLENOID 21 // LED indikator solenoid aktif
BlynkTimer timer;
// Setting batas jarak maksimum
const int JARAK_MAX = 10; // Misal 10 cm tandon penuh
bool aktivasi = false;
bool sensorAktif = true;
bool manualOverride = false; // Menyimpan status manual override
bool previousAktivasi = false; // Menyimpan nilai asli aktivasi sebelum override
unsigned long lastCheck = 0;
const unsigned long interval = 1000; // 1 detik
void setup() {
Serial.begin(115200);
Blynk.begin(auth, ssid, pass);
pinMode(PIN_FLOAT_SWITCH, INPUT_PULLUP); // Slide switch aktif LOW
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
pinMode(LED_SOLENOID, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
digitalWrite(LED_SOLENOID, LOW);
}
// Fungsi ultrasonic
long ultrasonicRead() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
return pulseIn(ECHO_PIN, HIGH);
}
// Fungsi utama sistem tandon
// Fungsi utama sistem tandon
void loopTandon() {
if (!sensorAktif) return; // Jika sensor dimatikan dari Blynk
int sensorMinState = digitalRead(PIN_FLOAT_SWITCH);
// Debugging untuk memastikan nilai dari slide switch
Serial.print("Nilai PIN_FLOAT_SWITCH: ");
Serial.println(sensorMinState);
if (sensorMinState == LOW && !aktivasi) {
// Air sudah melewati batas minimum → aktifkan sistem
aktivasi = true;
Serial.println("Float switch aktif: Mulai pengisian.");
digitalWrite(RELAY_PIN, HIGH); // Aktifkan relay (mengalirkan listrik ke solenoid)
digitalWrite(LED_SOLENOID, HIGH); // Aktifkan LED sebagai indikator relay aktif
Blynk.virtualWrite(V1, 1); // Indikator pengisian ON di Blynk
}
if (aktivasi) {
long duration = ultrasonicRead();
int distance = duration * 0.034 / 2;
Serial.print("Jarak air: ");
Serial.print(distance);
Serial.println(" cm");
if (distance <= JARAK_MAX) {
// Air sudah penuh
Serial.println("Air penuh. Menutup solenoid.");
aktivasi = false;
digitalWrite(RELAY_PIN, LOW); // Matikan relay (menghentikan listrik ke solenoid)
digitalWrite(LED_SOLENOID, LOW); // Matikan LED sebagai indikator relay mati
Blynk.virtualWrite(V1, 0); // Indikator pengisian OFF di Blynk
}
}
}
// Tombol Blynk: Pengisian Manual (V2)
BLYNK_WRITE(V2) {
int state = param.asInt();
if (state == 1) {
if (!manualOverride) {
previousAktivasi = aktivasi; // Simpan nilai asli
manualOverride = true;
}
aktivasi = true; // Aktifkan pengisian manual
digitalWrite(RELAY_PIN, HIGH);
digitalWrite(LED_SOLENOID, HIGH);
Blynk.virtualWrite(V1, 1); // Indikator pengisian ON
Serial.println("Pengisian manual aktif dari Blynk.");
} else {
if (manualOverride) {
aktivasi = previousAktivasi; // Kembalikan nilai asli
manualOverride = false;
}
if (!aktivasi) {
digitalWrite(RELAY_PIN, LOW);
digitalWrite(LED_SOLENOID, LOW);
Blynk.virtualWrite(V1, 0); // Indikator pengisian OFF
}
Serial.println("Pengisian manual dimatikan.");
}
}
// Tombol Blynk: Mematikan Paksa Pengisian Air (V3)
BLYNK_WRITE(V3) {
int state = param.asInt();
if (state == 1) {
if (!manualOverride) {
previousAktivasi = aktivasi; // Simpan nilai asli
manualOverride = true;
}
aktivasi = false; // Matikan paksa pengisian
digitalWrite(RELAY_PIN, LOW);
digitalWrite(LED_SOLENOID, LOW);
Blynk.virtualWrite(V1, 0); // Indikator pengisian OFF
Serial.println("Pengisian dimatikan paksa dari Blynk.");
} else {
if (manualOverride) {
aktivasi = previousAktivasi; // Kembalikan nilai asli
manualOverride = false;
}
if (aktivasi) {
digitalWrite(RELAY_PIN, HIGH);
digitalWrite(LED_SOLENOID, HIGH);
Blynk.virtualWrite(V1, 1); // Indikator pengisian ON
}
Serial.println("Pengisian paksa dimatikan.");
}
}
// Tombol Blynk: Restart Sistem (V4)
BLYNK_WRITE(V4) {
int state = param.asInt();
if (state == 1) {
Serial.println("Restart sistem dari Blynk.");
ESP.restart(); // Restart ESP32
}
}
// Tombol Blynk: Shutdown Sensor (V5)
BLYNK_WRITE(V5) {
int state = param.asInt();
sensorAktif = (state == 0); // Jika tombol ditekan, sensor dimatikan
if (!sensorAktif) {
Serial.println("Semua sensor dinonaktifkan dari Blynk.");
aktivasi = false;
digitalWrite(RELAY_PIN, LOW);
digitalWrite(LED_SOLENOID, LOW);
Blynk.virtualWrite(V0, 0);
} else {
Serial.println("Sensor diaktifkan kembali dari Blynk.");
}
}
void loop() {
Blynk.run();
unsigned long currentMillis = millis();
if (currentMillis - lastCheck >= interval) {
lastCheck = currentMillis;
loopTandon();
}
}