// Blynk setup
#define BLYNK_TEMPLATE_ID "TMPL6iXcPCg-g"
#define BLYNK_TEMPLATE_NAME "Deteksi Banjir"
#define BLYNK_AUTH_TOKEN "IfYIgIoMnTbB_ScBUv50aKBQWoZNDdpM"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <DHT.h>
#include <ESP32Servo.h>
#include <LiquidCrystal_I2C.h>
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// Konstanta dan pin
#define TRIG_PIN 25
#define ECHO_PIN 26
#define RAIN_PIN 34
#define DHT_PIN 4
#define SERVO_PIN 2
#define BUZZER_PIN 5
#define LED_HIJAU 19
#define LED_KUNING 18
#define LED_MERAH 15
#define DHTTYPE DHT22
DHT dht(DHT_PIN, DHTTYPE);
Servo servo;
LiquidCrystal_I2C lcd(0x27, 16, 2);
boolean st;
void setup() {
Serial.begin(115200);
dht.begin();
servo.attach(SERVO_PIN);
lcd.init();
lcd.backlight();
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_HIJAU, OUTPUT);
pinMode(LED_KUNING, OUTPUT);
pinMode(LED_MERAH, OUTPUT);
servo.write(180); // posisi awal tertutup
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Deteksi Banjir");
Blynk.begin(auth, ssid, pass);
while (!st) {
st = Blynk.connected();
delay(100);
}
delay(2000);
}
void loop() {
Blynk.run();
// Baca sensor
float suhu = dht.readTemperature();
float kelembaban = dht.readHumidity();
if (isnan(suhu) || isnan(kelembaban)) {
Serial.println("Gagal baca DHT!");
return;
}
long durasi, jarak;
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
durasi = pulseIn(ECHO_PIN, HIGH);
jarak = durasi * 0.034 / 2;
int curahHujan = analogRead(RAIN_PIN);
// Buzzer jika air terlalu dekat
if (jarak <= 10) {
tone(BUZZER_PIN, 2000);
} else {
noTone(BUZZER_PIN);
}
// Servo buka jika hujan
if (curahHujan < 500) {
servo.write(0); // buka saluran air
} else {
servo.write(180); // tutup
}
// Indikasi suhu
if (suhu >= 32) {
digitalWrite(LED_HIJAU, HIGH);
digitalWrite(LED_KUNING, LOW);
digitalWrite(LED_MERAH, LOW);
} else if (suhu >= 21 && suhu < 32) {
digitalWrite(LED_HIJAU, LOW);
digitalWrite(LED_KUNING, HIGH);
digitalWrite(LED_MERAH, LOW);
} else {
digitalWrite(LED_HIJAU, LOW);
digitalWrite(LED_KUNING, LOW);
digitalWrite(LED_MERAH, HIGH);
}
// Tampilkan di LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("S:");
lcd.print(suhu, 1);
lcd.print("C H:");
lcd.print(kelembaban, 0);
lcd.print("%");
lcd.setCursor(0, 1);
lcd.print("J:");
lcd.print(jarak);
lcd.print("cm R:");
lcd.print(curahHujan);
// Kirim ke Blynk
Blynk.virtualWrite(V0, jarak);
Blynk.virtualWrite(V1, suhu);
Blynk.virtualWrite(V2, kelembaban);
Blynk.virtualWrite(V3, curahHujan);
delay(2000);
}