//Blynk token dari app
#define BLYNK_TEMPLATE_ID "TMPL6pyq5up-9"
#define BLYNK_TEMPLATE_NAME "Water Level Monitoring for Tank"
#define BLYNK_AUTH_TOKEN "BfUYBZf2KUduFNL5g_Anut6-CuU8Vt-p"
//Library untuk akses blynk
#include <Wire.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
BlynkTimer timer;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
//Library LCD I2C
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
//Konfigurasi pin ESP32
#define trig 25
#define echo 26
#define LEDMERAH 16
#define LEDORANGE 17
#define LEDKUNING 5
#define LEDHIJAU 18
#define RELAY 14
//Nilai ketinggian air
float duration_us, distance;
int MaxLevel = 200;
int Level1 = (MaxLevel * 75) / 100;
int Level2 = (MaxLevel * 50) / 100;
int Level3 = (MaxLevel * 25) / 100;
int Level4 = (MaxLevel * 10) / 100;
void setup()
{
Serial.begin(115200);
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
lcd.init();
lcd.backlight();
pinMode(echo, INPUT);
pinMode(trig, OUTPUT);
pinMode(LEDMERAH, OUTPUT);
pinMode(LEDORANGE, OUTPUT);
pinMode(LEDKUNING, OUTPUT);
pinMode(LEDHIJAU, OUTPUT);
pinMode(RELAY, OUTPUT);
lcd.setCursor(0, 0);
lcd.print("System");
lcd.setCursor(0, 1);
lcd.print("Loading..");
delay(4000);
lcd.clear();
}
void ultrasonic()
{
digitalWrite(trig, LOW);
delayMicroseconds(10);
digitalWrite(trig, HIGH);
duration_us = pulseIn(echo, HIGH);
distance = 0.017 * duration_us;
Serial.println(distance);
//Menampilkan data level air di blynk
int blynkDistance = (distance - MaxLevel) * -1;
if (distance <= MaxLevel)
{
Blynk.virtualWrite(V0, blynkDistance);
}
else
{
Blynk.virtualWrite(V0, 0);
}
//Level air di LCD dan Output 4 LED
lcd.setCursor(0,0);
lcd.print("WLevel:");
if (Level1 <= distance)
{
lcd.setCursor(8,0);
lcd.print("VERY LOW");
digitalWrite(LEDMERAH, HIGH);
digitalWrite(LEDORANGE, LOW);
digitalWrite(LEDKUNING, LOW);
digitalWrite(LEDHIJAU, LOW);
}
else if (Level2 <= distance && Level1 > distance)
{
lcd.setCursor(8,0);
lcd.print("LOW");
lcd.print(" ");
digitalWrite(LEDMERAH, HIGH);
digitalWrite(LEDORANGE, HIGH);
digitalWrite(LEDKUNING, LOW);
digitalWrite(LEDHIJAU, LOW);
}
else if (Level3 <= distance && Level2 > distance)
{
lcd.setCursor(8,0);
lcd.print("MEDIUM");
lcd.print(" ");
digitalWrite(LEDMERAH, HIGH);
digitalWrite(LEDORANGE, HIGH);
digitalWrite(LEDKUNING, HIGH);
digitalWrite(LEDHIJAU, LOW);
}
else if (Level4 <= distance && Level3 > distance)
{
lcd.setCursor(8,0);
lcd.print("HIGH");
lcd.print(" ");
digitalWrite(LEDMERAH, HIGH);
digitalWrite(LEDORANGE, HIGH);
digitalWrite(LEDKUNING, HIGH);
digitalWrite(LEDHIJAU, HIGH);
}
}
//ON OFF Relay di blynk
BLYNK_WRITE(V1)
{
bool Relay = param.asInt();
if (Relay == 1)
{
digitalWrite(RELAY, LOW);
lcd.setCursor(0,1);
lcd.print("Motor is ON ");
}
else
{
digitalWrite(RELAY, HIGH);
lcd.setCursor(0,1);
lcd.print("Motor is OFF");
}
}
void loop()
{
ultrasonic();
Blynk.run();
}