#define BLYNK_TEMPLATE_ID "TMPL6YcLznNWE"
#define BLYNK_TEMPLATE_NAME "Monitoring Air"
#define BLYNK_AUTH_TOKEN "e-IvY3Cx2F9GwzP6d9ZbVb8jywghQUPM"
#define BLYNK_PRINT Serial // Kita menggunakan Blynk serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <NewPing.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
char ssid[] = "Wokwi-GUEST"; // Nama WiFi yang digunakan
char pass[] = ""; // Password WiFi yang digunakan
BlynkTimer timer; // Timer untuk pengiriman data
// Sensor Ultrasonik
#define TRIG_PIN 23
#define ECHO_PIN 22
#define MAX_DISTANCE 320 // Jarak maksimum (in cm)
NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE);
// Buzzer
#define BUZZER_PIN 19
// LED
// Level air
float waterLevelCM = 0; // Menyimpan level dalam cm
int warningSoundInterval = 5000; // 5 detik
unsigned long lastWarningTime = 0;
bool buzzerActive = false; // Status buzzer
// Enum untuk status
enum WaterLevelState { NORMAL, DANGER };
WaterLevelState waterLevelState = NORMAL;
void setup() {
// Inisialisasi LCD
lcd.backlight(); // Nyalakan lampu latar LCD
Serial.begin(115200);
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
pinMode(BUZZER_PIN, OUTPUT);
timer.setInterval(1000L, sensorRead); // Membaca sensor setiap detik
}
void sensorRead() {
waterLevelCM = sonar.ping_cm(); // Membaca level air dalam cm
Serial.print("Level Air (cm): ");
Serial.println(waterLevelCM); // Menampilkan level air dalam cm ke Serial Monitor
// Cek level air menggunakan rentang yang diberikan
if (waterLevelCM >= 0 && waterLevelCM <= 100) { // tandon air kosong
waterLevelState = NORMAL;
digitalWrite(BUZZER_PIN, HIGH); // nyalakan buzzer
lcd.setCursor(0, 1);
lcd.print ("AIR AKAN HABIS");
buzzerActive = false; // Reset status buzzer
}
else if (waterLevelCM >= 300) { // matikan air
waterLevelState = DANGER;
digitalWrite(BUZZER_PIN, LOW); // matikankan buzzer terus menerus
lcd.setCursor(0, 1);
lcd.print ("AIR PENUH");
buzzerActive = true; // Set status buzzer aktif
}
// Kirim data ke Blynk
Blynk.virtualWrite(V0, waterLevelCM); // Kirim level air dalam cm ke pin V0
updateGauge(waterLevelCM); // Panggil fungsi untuk update gauge
}
void updateGauge(float level) {
// Mengupdate tampilan gauge di Blynk
Blynk.virtualWrite(V1, level);
}
BLYNK_WRITE(V2) { // Tombol untuk menghidupkan/mematikan buzzer
int pinValue = param.asInt();
Serial.print("Buzzer button value is: ");
Serial.println(pinValue);
digitalWrite(BUZZER_PIN, pinValue ? HIGH : LOW); // Aktifkan atau matikan buzzer
}
void loop() {
Blynk.run(); // Jalankan Blynk
timer.run(); // Jalankan timer
}