#define BLYNK_TEMPLATE_ID "TMPL6gFFKdrV0"
#define BLYNK_TEMPLATE_NAME "Hidroponik"
#define BLYNK_AUTH_TOKEN "OFZMtHv8F13skA2NFRuOVQlfmsDOc1sK"
// Tambahkan pustaka Blynk
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
// Deklarasi pin sensor atas
const int sensorAtasPin = 17; // Misalkan pin 2
// Deklarasi pin sensor bawah
const int sensorBawahPin = 16; // Misalkan pin 3
// Deklarasi pin valve untuk menguras
const int valveMengurasPin = 4; // Misalkan pin 5
// Deklarasi pin valve untuk mengisi
const int valveMengisiPin = 2; // Misalkan pin 6
// Variabel untuk menandakan apakah fitur sedang berjalan
bool fiturAktif = false;
// WiFi credentials
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
int sensor1;
int sensor2;
// Inisialisasi Blynk
BlynkTimer timer;
// Fungsi untuk membaca tombol dari Blynk
BLYNK_WRITE(V1) { // Ganti dengan virtual pin yang sesuai
int tombolState = param.asInt();
if (tombolState == 1 && !fiturAktif) {
fiturAktif = true;
// Logika untuk mengatur valve berdasarkan status sensor
while (fiturAktif) {
// Baca status sensor atas
int statusSensorAtas = digitalRead(sensorAtasPin);
// Baca status sensor bawah
int statusSensorBawah = digitalRead(sensorBawahPin);
// Jika kedua sensor mendeteksi air, aktifkan valve untuk menguras
if (statusSensorAtas == HIGH && statusSensorBawah == HIGH) {
digitalWrite(valveMengurasPin, HIGH);
Serial.println("Menguras air...");
Blynk.virtualWrite(V2, "Menguras air..."); // Ganti V2 dengan virtual pin yang sesuai
}
// Jika sensor atas sudah tidak mendeteksi air namun sensor bawah masih mendeteksi air, tetap menguras
else if (statusSensorAtas == LOW && statusSensorBawah == HIGH) {
digitalWrite(valveMengurasPin, HIGH);
Serial.println("Masih menguras air...");
Blynk.virtualWrite(V2, "Masih menguras air..."); // Ganti V2 dengan virtual pin yang sesuai
}
// Jika sensor atas sudah tidak mendeteksi air dan sensor bawah tidak mendeteksi air, matikan penguras
else if (statusSensorAtas == LOW && statusSensorBawah == LOW) {
digitalWrite(valveMengurasPin, LOW);
Serial.println("Air telah terkuras.");
Blynk.virtualWrite(V2, "Air telah terkuras."); // Ganti V2 dengan virtual pin yang sesuai
// Aktifkan pengisian air
digitalWrite(valveMengisiPin, HIGH);
Serial.println("Mengisi air kembali...");
Blynk.virtualWrite(V2, "Mengisi air kembali..."); // Ganti V2 dengan virtual pin yang sesuai
// Tunggu hingga kedua sensor mendeteksi air kembali
while (!(digitalRead(sensorAtasPin) == HIGH && digitalRead(sensorBawahPin) == HIGH)) {
delay(1000); // Tunda 1 detik
}
// Matikan pengisian air setelah kedua sensor mendeteksi air kembali
digitalWrite(valveMengisiPin, LOW);
Serial.println("Pengisian air selesai.");
Blynk.virtualWrite(V2, "Pengisian air selesai."); // Ganti V2 dengan virtual pin yang sesuai
// Nonaktifkan fitur setelah selesai
fiturAktif = false;
}
// Tunda sedikit agar tidak terlalu cepat
delay(1000);
}
}
}
void setup() {
// Inisialisasi Serial Monitor
Serial.begin(9600);
// Inisialisasi Blynk
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
// Set sensor atas sebagai input
pinMode(sensorAtasPin, INPUT);
// Set sensor bawah sebagai input
pinMode(sensorBawahPin, INPUT);
// Set valve untuk menguras sebagai output
pinMode(valveMengurasPin, OUTPUT);
// Set valve untuk mengisi sebagai output
pinMode(valveMengisiPin, OUTPUT);
// Atur timer Blynk
timer.setInterval(1000L, sendSensorData);
}
void loop() {
Blynk.run();
timer.run();
sensor1=digitalRead(sensorBawahPin);
sensor2=digitalRead(sensorAtasPin);
Serial.print("sensor1=");
Serial.println(sensor1);
delay(300);
Serial.print("sensor2=");
Serial.println(sensor2);
delay(300);
}
// Fungsi untuk mengirim data sensor ke Blynk
void sendSensorData() {
int statusSensorAtas = digitalRead(sensorAtasPin);
int statusSensorBawah = digitalRead(sensorBawahPin);
Blynk.virtualWrite(V3, statusSensorAtas); // Ganti V3 dengan virtual pin yang sesuai
Blynk.virtualWrite(V4, statusSensorBawah); // Ganti V4 dengan virtual pin yang sesuai
}