#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPL6kigsaFWS"
#define BLYNK_TEMPLATE_NAME "hidroponik"
#define BLYNK_AUTH_TOKEN "B-UTKJqeAwTeK2-YBGLHnGA2OkCT8WU5"
#define PIN_RELAY_POMPA 12
#define PIN_RELAY_POMPA_IN 13
#define PIN_PH 35
#define PIN_TDS 34
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <DHTesp.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
DHTesp dhtSensor;
BlynkTimer timer;
LiquidCrystal_I2C lcd(0x27, 20, 4);
const int DHT_PIN = 14;
const int TRIGGER_PIN = 15;
const int ECHO_PIN = 2;
int isPumpOn = 0;
void sendSensorData() {
TempAndHumidity data = dhtSensor.getTempAndHumidity();
lcd.setCursor(0, 0);
lcd.print("Temperature: ");
lcd.setCursor(15, 0);
lcd.print(data.temperature);
lcd.setCursor(0,1);
lcd.print("Humidity: ");
lcd.setCursor(15, 1);
lcd.print(data.humidity);
Blynk.virtualWrite(V1, data.temperature);
Blynk.virtualWrite(V2, data.humidity);
int ph = analogRead(PIN_PH);
int konversiPh = ph * 14 / 4095;
int tds = analogRead(PIN_TDS);
int konversiTds = tds * 3000 / 4095;
lcd.setCursor(0, 2);
lcd.print("PH: ");
lcd.setCursor(6, 2);
lcd.print(konversiPh);
lcd.setCursor(11,2);
lcd.print("TDS: ");
lcd.setCursor(16, 2);
lcd.print(konversiTds);
Blynk.virtualWrite(V3, konversiTds);
Blynk.virtualWrite(V4, konversiPh);
digitalWrite(TRIGGER_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
int distance = duration * 0.0343 / 2;
lcd.setCursor(11, 3);
if (distance < 10) {
digitalWrite(PIN_RELAY_POMPA_IN, LOW);
lcd.print("PUMP2:OFF");
} else if (distance > 150) {
digitalWrite(PIN_RELAY_POMPA_IN, HIGH);
lcd.print("PUMP2:ON ");
}
lcd.setCursor(0, 3);
if (isPumpOn == 1) {
lcd.print("PUMP1:ON ");
} else {
lcd.print("PUMP1:OFF");
}
}
BLYNK_WRITE (V0) {
isPumpOn = param.asInt();
lcd.setCursor(6, 3);
if (isPumpOn == 1) {
digitalWrite(PIN_RELAY_POMPA, HIGH);
lcd.print("ON ");
Blynk.virtualWrite(V0, HIGH);
} else {
digitalWrite(PIN_RELAY_POMPA, LOW);
lcd.print("OFF");
Blynk.virtualWrite(V0, LOW);
}
}
void setup() {
lcd.init();
lcd.backlight();
lcd.setCursor(7, 0);
lcd.print("Sistem");
lcd.setCursor(3, 1);
lcd.print("IoT Hidroponik");
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
pinMode(PIN_RELAY_POMPA, OUTPUT);
pinMode(PIN_RELAY_POMPA_IN, OUTPUT);
pinMode(PIN_PH, INPUT);
pinMode(PIN_TDS, INPUT);
pinMode(TRIGGER_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
Blynk.begin(auth, ssid, pass);
lcd.clear();
timer.setInterval(1000, sendSensorData);
}
void loop() {
Blynk.run();
timer.run();
}