//AGUNG DWI PRADHANA
//203510274
// Definisi informasi koneksi Blynk
#define BLYNK_TEMPLATE_ID "TMPL62omLaGio"
#define BLYNK_TEMPLATE_NAME "Agung"
#define BLYNK_AUTH_TOKEN "ZbuzCk2zxYfHSWvl1FLCLzJBXLwwz4ZE"
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <ESP32Servo.h> // Library untuk kontrol servo
// Definisi pin untuk sensor dan output
#define Echo 4
#define Trig 15
#define Merah 27
#define Kuning 14
#define Hijau 12
#define Buzzer 21
const int ServoPin = 5; // Pin untuk servo
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
BlynkTimer timer;
Servo kran; // Objek untuk mengontrol servo
float jarak = 0;
void setup() {
Serial.begin(115200); // Inisialisasi serial dan koneksi BlynK
Blynk.begin(auth, ssid, pass);
// Inisialisasi pin
pinMode(Trig, OUTPUT);
pinMode(Echo, INPUT);
pinMode(Merah, OUTPUT);
pinMode(Kuning, OUTPUT);
pinMode(Hijau, OUTPUT);
pinMode(Buzzer, OUTPUT);
// Menghubungkan dan inisialisasi servo
kran.attach(ServoPin); // Menghubungkan servo ke pin yang ditentukan
kran.write(180); // Mengatur servo ke posisi tertutup saat awal
delay(15);
timer.setInterval(2000L, kirim_blynk); // Mengatur interval pengiriman data ke Blynk
}
void output_jarak() { // Fungsi untuk mengontrol servo,led,buzzer berdasarkan kondisi air
if (jarak > 110) {
Serial.println("Air Full");
digitalWrite(Hijau, HIGH);
digitalWrite(Kuning, LOW);
digitalWrite(Merah, LOW);
kran.write(180); // Tutup servo jika air penuh
delay(500);
noTone(Buzzer); // Menghentikan bunyi buzzer jika air full
} else if (jarak > 31 && jarak < 95) {
Serial.println("Air Sedang");
digitalWrite(Kuning, HIGH);
digitalWrite(Hijau, LOW);
digitalWrite(Merah, LOW);
kran.write(0); // Buka servo jika air sedang
delay(500);
noTone(Buzzer); // Menghentikan bunyi buzzer jika air sedang
} else if (jarak < 30) {
Serial.println("Air Habis!");
digitalWrite(Merah, HIGH);
digitalWrite(Kuning, LOW);
digitalWrite(Hijau, LOW);
kran.write(0); // Buka servo jika air habis
delay(500);
tone(Buzzer, 2000); // Menghasilkan bunyi jika air habis
}
}
void kirim_blynk() { // Fungsi untuk mengirim data ke Blynk berdasarkan kondisi air
Blynk.virtualWrite(V0, jarak);
if (jarak > 110) {
Blynk.virtualWrite(V1, 1);
Blynk.virtualWrite(V2, 0);
Blynk.virtualWrite(V3, 0);
Blynk.virtualWrite(V4, 0);
} else if (jarak >= 31 && jarak <= 95) {
Blynk.virtualWrite(V1, 0);
Blynk.virtualWrite(V2, 1);
Blynk.virtualWrite(V3, 0);
Blynk.virtualWrite(V4, 1);
} else if (jarak < 30) {
Blynk.virtualWrite(V1, 0);
Blynk.virtualWrite(V2, 0);
Blynk.virtualWrite(V3, 1);
Blynk.virtualWrite(V4, 1);
}
}
void loop() {
digitalWrite(Merah, LOW);
digitalWrite(Kuning, LOW);
digitalWrite(Hijau, LOW);
digitalWrite(Trig, LOW);
delayMicroseconds(2);
digitalWrite(Trig, HIGH);
delayMicroseconds(10);
digitalWrite(Trig, LOW);
long duration = pulseIn(Echo, HIGH);
jarak = duration * 0.034 / 2 + 1;
Serial.print("Jarak: ");
Serial.print(jarak);
Serial.println(" cm");
output_jarak();
Blynk.run(); // Menjalankan Blynk dan timer
timer.run();
delay(1000); // Delay untuk pengukuran jarak
}