#define BLYNK_TEMPLATE_ID "TMPL6FCNi7q7s"
#define BLYNK_TEMPLATE_NAME "PERINGATAN DINI HUJAN IOT DAN SISTEM CERDAS"
#define BLYNK_AUTH_TOKEN "Ne1vnUgOBh1_PG0LQIh4u24Zwj1ZerVg"
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <Ultrasonic.h>
// Blynk auth token
char auth[] = "Ne1vnUgOBh1_PG0LQIh4u24Zwj1ZerVg";
// WiFi credentials
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// Define ultrasonic sensor pins
#define TRIG_PIN 2
#define ECHO_PIN 15
Ultrasonic ultrasonic(TRIG_PIN, ECHO_PIN);
int potPin = 34; // Potentiometer pin
float waterLevel = 0.0; // Water level variable
int rainIntensity = 0; // Rain intensity variable
BlynkTimer timer;
void setup() {
// Debug console
Serial.begin(115200);
// Blynk connection
Blynk.begin(auth, ssid, pass);
// Timer to call sensor data and logic function
timer.setInterval(2000L, readSensorsAndUpdateLogic);
}
void loop() {
Blynk.run();
timer.run();
}
void readSensorsAndUpdateLogic() {
// Read water level from ultrasonic sensor
float distance = ultrasonic.read();
waterLevel = 15.0 - (distance / 100.0); // Assuming the river depth is 15 meters
// Read rain intensity from potentiometer
rainIntensity = analogRead(potPin);
rainIntensity = map(rainIntensity, 0, 4095, 0, 100); // Convert to percentage
// Simple fuzzy logic evaluation
float floodRisk = calculateFloodRisk(waterLevel, rainIntensity);
// Determine if there is a flood warning
bool floodWarning = floodRisk > 50.0; // Set threshold for flood warning
if (floodWarning) {
Blynk.logEvent("warning", "Potensi Banjir Terdeteksi!");
}
// Send data to Blynk
Blynk.virtualWrite(V1, waterLevel);
Blynk.virtualWrite(V2, rainIntensity);
Blynk.virtualWrite(V3, floodRisk);
// Print data to Serial Monitor
Serial.print("Water Level: ");
Serial.print(waterLevel);
Serial.print(" meters, Rain Intensity: ");
Serial.print(rainIntensity);
Serial.print("%, Flood Risk: ");
Serial.println(floodRisk);
}
float calculateFloodRisk(float waterLevel, int rainIntensity) {
float floodRisk = 0.0;
if (waterLevel < 5) {
if (rainIntensity < 20) {
floodRisk = 10.0; // Low risk
} else if (rainIntensity < 60) {
floodRisk = 30.0; // Medium risk
} else {
floodRisk = 50.0; // High risk
}
} else if (waterLevel < 10) {
if (rainIntensity < 20) {
floodRisk = 30.0; // Medium risk
} else if (rainIntensity < 60) {
floodRisk = 50.0; // High risk
} else {
floodRisk = 70.0; // Very high risk
}
} else {
if (rainIntensity < 20) {
floodRisk = 50.0; // High risk
} else if (rainIntensity < 60) {
floodRisk = 70.0; // Very high risk
} else {
floodRisk = 90.0; // Extreme risk
}
}
return floodRisk;
}