#define BLYNK_TEMPLATE_ID "TMPL6_L7eA7Zq"
#define BLYNK_TEMPLATE_NAME "projek"
#define BLYNK_AUTH_TOKEN "zr2FJ8n_XtDfpIT8JRCLfb8-k9-cmmvF"
#define BLYNK_PRINT Serial
#include <BlynkSimpleEsp32.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
BlynkTimer timer;
#define echoPin 18 // GPIO18 untuk Pin Echo
#define trigPin 5 // GPIO5 untuk Pin Trigger
#define ledPin 19 // GPIO19 untuk LED indikator
#define buzzerPin 21 // GPIO21 untuk Buzzer alarm
long duration;
float jarak;
float tinggiWadah; // Nilai awal tinggi wadah (dapat diubah melalui Blynk)
float luasAlaswadah; // Nilai awal luas alas wadah (dapat diubah melalui Blynk)
float tinggiAir;
float volume;
float batasTinggiAir; // Nilai awal batas tinggi air (dapat diubah melalui Blynk)
void setup() {
Serial.begin(115200);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
Blynk.begin(auth, ssid, pass, "blynk.cloud", 80);
lcd.begin(16, 2); // Menentukan jumlah kolom dan baris pada LCD
lcd.backlight();
timer.setInterval(1000L, checkWaterLevel); // Set interval untuk mengecek ketinggian air
// Inisialisasi nilai awal di Blynk
Blynk.virtualWrite(V2, tinggiWadah); // Kirim nilai tinggiWadah ke Blynk
Blynk.virtualWrite(V3, luasAlaswadah); // Kirim nilai luasAlaswadah ke Blynk
Blynk.virtualWrite(V4, batasTinggiAir); // Kirim nilai batasTinggiAir ke Blynk
}
// Fungsi untuk membaca nilai dari Blynk dan mengupdate variabel
BLYNK_WRITE(V2) {
tinggiWadah = param.asFloat(); // Set tinggiWadah dengan nilai dari aplikasi Blynk
}
BLYNK_WRITE(V3) {
luasAlaswadah = param.asFloat(); // Set luasAlaswadah dengan nilai dari aplikasi Blynk
}
BLYNK_WRITE(V4) {
batasTinggiAir = param.asFloat(); // Set batasTinggiAir dengan nilai dari aplikasi Blynk
}
void checkWaterLevel() {
// Mengukur jarak dengan sensor ultrasonik
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
jarak = duration * 0.034 / 2; // Konversi ke jarak sebenarnya (cm)
// Menghitung tinggi air dan volume
tinggiAir = tinggiWadah - jarak;
if (tinggiAir < 0) tinggiAir = 0; // Hindari nilai negatif
volume = tinggiAir * luasAlaswadah;
// Menampilkan hasil di LCD
lcd.setCursor(0, 0);
lcd.print("T air:");
lcd.print(tinggiAir);
lcd.print(" cm");
lcd.setCursor(0, 1);
lcd.print("V air:");
lcd.print(volume);
lcd.print(" ml");
// Mengirim data ke Blynk
Blynk.virtualWrite(V0, tinggiAir); // Kirim data tinggi air ke widget Gauge
Blynk.virtualWrite(V1, volume); // Kirim data volume ke Blynk
Blynk.virtualWrite(V4, batasTinggiAir); // Kirim batas tinggi air ke widget Gauge
// Mengecek apakah tinggi air melebihi batas atau wadah penuh
if (tinggiAir >= batasTinggiAir || tinggiAir >= tinggiWadah) {
digitalWrite(ledPin, HIGH); // Hidupkan LED
digitalWrite(buzzerPin, HIGH); // Hidupkan buzzer
Blynk.virtualWrite(V6, "PERINGATAN: Tinggi air melebihi batas!"); // Kirim peringatan ke V6
Blynk.logEvent("high_water_level", "PERINGATAN: Tinggi air melebihi batas!");
} else {
digitalWrite(ledPin, LOW); // Matikan LED
digitalWrite(buzzerPin, LOW); // Matikan buzzer
Blynk.virtualWrite(V6, ""); // Matikan pesan peringatan di V6
}
}
void loop() {
Blynk.run(); // Menjalankan fungsi Blynk
timer.run(); // Menjalankan timer
}