#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include "ThingSpeak.h"
const char*ssid = "Wokwi-GUEST";
const char*password ="";
const int myChannelNumber = 2696648;
const char* myAPIKey ="4KGNCFNKL77IQRO7";
const char* server = "api.thingspeak.com";
WiFiClient client;
LiquidCrystal_I2C lcd(0x27,16,2);
LiquidCrystal_I2C lcd2(0x27,16,2);
#define ECHO_PIN 2
#define TRIG_PIN 15
#define buzzer 5
#define ledmerah 12
#define ledhijau 14
#define ledkuning 13
#define sensorPin 34
long duration;
void setup() {
Serial.begin(115200);
pinMode(ledmerah, OUTPUT);
pinMode(ledhijau, OUTPUT);
pinMode(ledkuning, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(buzzer, OUTPUT);
pinMode(sensorPin, INPUT);
lcd.setCursor(0,1);
lcd.init();
lcd.backlight();
lcd2.setCursor(0,1);
lcd2.init();
lcd2.backlight();
WiFi.begin(ssid, password);
Serial.println("Connecting");
while (WiFi.status() != WL_CONNECTED){
delay(500);
Serial.print(".");
}
Serial.println("Wifi connected !");
Serial.println(WiFi.localIP());
WiFi.mode(WIFI_STA);
ThingSpeak.begin(client);
}
void loop() {
lcd.print("Ketinggian Air");
delay(4000);
lcd2.print("Arus Sungai:");
lcd.clear();
lcd2.clear();
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH);
float distance = duration * 0.034 / 2;
float sensorValue = analogRead(sensorPin);
float arus = sensorValue * (5.0/4095); // Konversi nilai sensor menjadi tegangan (0 - 5V)
float waterflow = mapFloat(arus, 0.0, 5.0, 0.0, 200.0); // Konversi tegangan menjadi kecepatan Arus Air (0 - 100 ms)
if(distance >= 300 ) // jika nilai kedalaman lebih dari 300, maka :
{
digitalWrite(ledmerah, HIGH);
digitalWrite(ledhijau, LOW);
digitalWrite(ledkuning, LOW);
lcd.clear();
lcd.print("Tinggi Air:");
lcd.print(distance);
lcd.print(" cm");
lcd.setCursor(0,1);
lcd.print(" Status :");
lcd.print(" BAHAYA");
digitalWrite(buzzer, LOW);
tone(5,800,1000);
delay(2000);
}
else if (distance >= 200 && distance <= 299)
{ // jika nilai kedalaman lebih dari 200 namun kurang dari 300, maka :
digitalWrite(ledmerah, LOW);
digitalWrite(ledhijau, LOW);
digitalWrite(ledkuning, HIGH);
lcd.clear();
lcd.print("Tinggi Air:");
lcd.print(distance);
lcd.print(" cm");
lcd.setCursor(0,1);
lcd.print("Status :");
lcd.setCursor(9,1);
lcd.print(" Siaga");
delay(1000);
lcd.clear();
delay(100);
}
else if (distance <= 199 )
{
digitalWrite(ledmerah, LOW);
digitalWrite(ledhijau, HIGH);
digitalWrite(ledkuning, LOW);
lcd.clear();
lcd.print(" Water Level:");
lcd.print(distance);
lcd.print(" cm");
lcd.setCursor(0,1);
lcd.print(" Status :");
lcd.setCursor(9,1);
lcd.print("Aman");
delay(1000);
lcd.clear();
delay(100);;
}
if (waterflow >= 50 && waterflow <= 75 )
{
digitalWrite(ledmerah, LOW);
digitalWrite(ledhijau, LOW);
digitalWrite(ledkuning, HIGH);
lcd2.clear();
lcd2.print(" Arus:");
lcd2.print(waterflow);
lcd2.print(" m/s");
lcd2.setCursor(0,1);
lcd2.print(" Arus :");
lcd2.setCursor(9,1);
lcd2.print("siaga");
delay(1000);
lcd.clear();
delay(100);
}
else if (waterflow >= 76 )
{
digitalWrite(ledmerah, HIGH);
digitalWrite(ledhijau, LOW);
digitalWrite(ledkuning, LOW);
lcd2.clear();
lcd2.print(" Arus:");
lcd2.print(waterflow);
lcd2.print(" m/s");
lcd2.setCursor(0,1);
lcd2.print(" Arus Air :");
lcd2.setCursor(9,1);
lcd2.print("Bahaya");
digitalWrite(buzzer, LOW);
tone(5,800,1000);
delay(2000);
}
else if (waterflow <= 49 )
{
digitalWrite(ledmerah, LOW);
digitalWrite(ledhijau, HIGH);
digitalWrite(ledkuning, LOW);
lcd2.clear();
lcd2.print(" Arus:");
lcd2.print(waterflow);
lcd2.print(" m/s");
lcd2.setCursor(0,1);
lcd2.print(" Arus Air :");
lcd2.setCursor(9,1);
lcd2.print("Tenang");
delay(1000);
lcd.clear();
delay(100);
}
delay(10);
ThingSpeak.setField(1,distance);
ThingSpeak.setField(2,waterflow);
ThingSpeak.setField(3,ledmerah);
ThingSpeak.setField(4,ledkuning);
ThingSpeak.setField(5,ledhijau);
ThingSpeak.setField(6,buzzer);
int x = ThingSpeak.writeFields(myChannelNumber,myAPIKey);
}
float mapFloat(float x, float in_min, float in_max, float out_min, float out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}