#define BLYNK_TEMPLATE_ID "TMPLCoU0l-9s"
#define BLYNK_DEVICE_NAME "Level Air"
#define BLYNK_AUTH_TOKEN "7CrZi1fn7YQf9WZX2Z0lCHrhrRzTvL5Y"
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
char auth[] = "7CrZi1fn7YQf9WZX2Z0lCHrhrRzTvL5Y";
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
int Trig_Pin = 14;
int echo_Pin = 26;
int lev_air;
long durasiSerial = 0;
long jedaSerial = 100;
const int Pin_Water_Level_1 = 5;
int Water_Level_1 = 0;
const int Pin_Water_Level_2 = 18;
int Water_Level_2 = 0;
const int Pin_Water_Level_3 = 19;
int Water_Level_3 = 0;
const int Pin_OFF_Alarm = 12;
int OFF_Alarm = 0 ;
const int Alarm = 27;
const int Pilot_Lamp_Hijau = 33;
const int Pilot_Lamp_Merah = 25;
const int Pompa = 32;
int x=0;
int Level_1 = LOW;
long currentMillis = 0;
long previousMillis = 0;
int interval = 1000;
const int Pin_flow_sensor = 17;
long currentMillis2 = 0;
long previousMillis2 = 0;
int interval2 = 1000;
float calibrationFactor = 4.5;
volatile byte pulseCount;
byte pulse1Sec = 0;
float flowRate;
unsigned int flowMilliLitres;
void IRAM_ATTR pulseCounter()
{
pulseCount++;
}
void setup()
{
// Debug console
Serial.begin(9600);
lcd.init();
lcd.backlight();
pinMode(Trig_Pin, OUTPUT);
pinMode(echo_Pin, INPUT);
Blynk.begin(auth, ssid, pass);
pinMode (Pin_Water_Level_1, INPUT_PULLUP);
pinMode (Pin_Water_Level_2, INPUT_PULLUP);
pinMode (Pin_Water_Level_3, INPUT_PULLUP);
pinMode (Pin_OFF_Alarm, INPUT_PULLUP);
pinMode (Alarm, OUTPUT);
pinMode (Pilot_Lamp_Hijau, OUTPUT);
pinMode (Pilot_Lamp_Merah, OUTPUT);
pinMode (Pompa, OUTPUT);
pinMode(Pin_flow_sensor, INPUT_PULLUP);
pulseCount = 0;
previousMillis2 = 0;
previousMillis = 0;
attachInterrupt(digitalPinToInterrupt(Pin_flow_sensor), pulseCounter, FALLING);
LCD();
}
void loop()
{
if (Blynk.connected()) {
Blynk.run();
cek_level();
if (millis()- durasiSerial > jedaSerial)
{
ukur_jarak();
ukur_flow();
durasiSerial = millis();
}
}
}
BLYNK_CONNECTED() {
Blynk.syncAll();
}
void LCD() //individu
{
lcd.setCursor(0, 0);
lcd.print("Level Air : ");
lcd.setCursor(14, 0);
lcd.print("");
lcd.setCursor(17, 0);
lcd.print("cm");
lcd.setCursor(0, 1);
lcd.print("Debit : ");
lcd.setCursor(8, 1);
//lcd.print(flowRate);
lcd.setCursor(15, 1);
lcd.print("L/min");
lcd.setCursor(0, 2);
lcd.print("--------------------");
lcd.setCursor(0, 3);
lcd.print("1 ");
lcd.setCursor(8, 3);
lcd.print("2 ");
lcd.setCursor(16, 3);
lcd.print("3 ");
}
void cek_level()
{
Water_Level_1 = digitalRead(Pin_Water_Level_1);
Water_Level_2 = digitalRead(Pin_Water_Level_2);
Water_Level_3 = digitalRead(Pin_Water_Level_3);
OFF_Alarm = digitalRead(Pin_OFF_Alarm);
Serial.print(Water_Level_1);
Serial.print(Water_Level_2);
Serial.println(Water_Level_3);
String sts = String(Water_Level_1)+String(Water_Level_2)+String(Water_Level_3);
//Serial.print("String = ");
//Serial.println(sts);
int sts1 = sts.toInt();
//Serial.print("Int = ");
//Serial.println(sts);
switch (sts1) {
case 111:
// statements
Blynk.virtualWrite(V2, 1);
Blynk.virtualWrite(V1, 1);
Blynk.virtualWrite(V0, 1);
digitalWrite(Pilot_Lamp_Hijau, HIGH);
digitalWrite(Pilot_Lamp_Merah, LOW);
digitalWrite(Alarm, LOW);
lcd.setCursor(18, 3);
lcd.print("ON");
lcd.setCursor(10, 3);
lcd.print("ON");
lcd.setCursor(2, 3);
lcd.print("ON");
digitalWrite(Pompa, LOW);
//lcd.setCursor(14, 0);
//lcd.print("OFF");
Serial.println("Kondisi Level 3");
delay(10);
break;
case 11:
// statements
Blynk.virtualWrite(V2, 0);
Blynk.virtualWrite(V1, 1);
Blynk.virtualWrite(V0, 1);
digitalWrite(Pilot_Lamp_Hijau, HIGH);
digitalWrite(Pilot_Lamp_Merah, LOW);
digitalWrite(Alarm, LOW);
lcd.setCursor(18, 3);
lcd.print(" ");
lcd.setCursor(10, 3);
lcd.print("ON");
lcd.setCursor(2, 3);
lcd.print("ON");
//lcd.setCursor(14, 0);
//lcd.print("OFF");
x=1;
Serial.println("Kondisi Level 2 - Level 3");
delay(10);
break;
case 1:
// statements
Blynk.virtualWrite(V2, 0);
Blynk.virtualWrite(V1, 0);
Blynk.virtualWrite(V0, 1);
digitalWrite(Pilot_Lamp_Hijau, HIGH);
digitalWrite(Pilot_Lamp_Merah, LOW);
lcd.setCursor(18, 3); lcd.print(" ");
lcd.setCursor(10, 3); lcd.print(" ");
lcd.setCursor(2, 3); lcd.print("ON");
digitalWrite(Pompa, HIGH);
//lcd.setCursor(14, 0); lcd.print(" ON");
Serial.println("Kondisi Level 1 - Level 2");
Alarm_Button();
if(x==1){
digitalWrite(Alarm, LOW);
}else {
digitalWrite(Alarm, HIGH);
}
delay(10);
break;
case 0:
// statements
Blynk.virtualWrite(V2, 0);
Blynk.virtualWrite(V1, 0);
Blynk.virtualWrite(V0, 0);
digitalWrite(Pilot_Lamp_Hijau, LOW);
digitalWrite(Pilot_Lamp_Merah, HIGH);
digitalWrite(Alarm, HIGH);
lcd.setCursor(18, 3); lcd.print(" ");
lcd.setCursor(10, 3); lcd.print(" ");
lcd.setCursor(2, 3); lcd.print(" ");
digitalWrite(Pompa, HIGH);
//lcd.setCursor(14, 0); lcd.print(" ON");
Serial.println("Kondisi Kosong");
x=0;
delay(10);
break;
default:
// statements
break;
}
}
void Alarm_Button() //individu
{
if (OFF_Alarm == LOW) {
x = 1;
Serial.println("Alarm OFF");
delay(200);
}
}
BLYNK_WRITE (V3) {
if (param.asInt() == HIGH) {
x = 1;
Serial.println("Alarm OFF");
delay(200);
}
}
float ukur_flow(){
currentMillis2 = millis();
if (currentMillis2 - previousMillis2 > interval2) {
pulse1Sec = pulseCount;
pulseCount = 0;
// flowRate = 12.9;
flowRate = ((1000.0 / (currentMillis2 - previousMillis2)) * pulse1Sec) / calibrationFactor;
previousMillis2 = currentMillis2;
flowMilliLitres = (flowRate / 60) * 1000;
}
//------------------------------------
Serial.print("Flow "); Serial.println(flowRate);
Serial.println();
Serial.println();
Blynk.virtualWrite(V4, flowRate);
delay(10);
return (flowRate);
}
void ukur_jarak(){
int pulse, inches, cm;
digitalWrite(Trig_Pin,LOW);
delayMicroseconds(2);
digitalWrite(Trig_Pin, HIGH);
delayMicroseconds(10);
digitalWrite(Trig_Pin, LOW);
pulse = pulseIn(echo_Pin, HIGH);
cm = pulse * 0.034 / 2;
inches = cm * 2.54;
//Serial.print("Jarak (cm) : ");
//Serial.println(cm);
//Serial.print("Jarak (inch) : ");
//Serial.println(inches);
lev_air = 60 - cm ;
Blynk.virtualWrite(V5, lev_air);
Serial.println(cm);
lcd.setCursor(13, 0);
lcd.print(lev_air);
delay(10);
}