#define BLYNK_TEMPLATE_ID "ID"
#define BLYNK_TEMPLATE_NAME "NAME"
#define BLYNK_AUTH_TOKEN "TOKEN"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
#define DHTPIN 2
#define SOIL_PIN 34
#define RELAY_PIN 4
#define PIN_VIR_SUHU V0
#define PIN_VIR_HUMY V1
#define PIN_VIR_SOIL V2
#define PIN_VIR_MODE V3
#define PIN_VIR_RELAY V4
#define PIN_VIR_THRESHOLD V5
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);
BlynkTimer timer;
bool autoMode = false;
bool statusRelay = false;
int moistureThreshold = 50;
int soilPercent = 0;
BLYNK_WRITE(PIN_VIR_MODE) {
autoMode = param.asInt();
}
BLYNK_WRITE(PIN_VIR_RELAY) {
if (!autoMode) {
statusRelay = param.asInt();
digitalWrite(RELAY_PIN, statusRelay ? HIGH : LOW);
Blynk.virtualWrite(PIN_VIR_RELAY, statusRelay);
} else {
Blynk.virtualWrite(PIN_VIR_RELAY, digitalRead(RELAY_PIN) == HIGH ? 1 : 0);
}
}
BLYNK_WRITE(PIN_VIR_THRESHOLD) {
moistureThreshold = param.asInt();
}
void readSensors() {
float t = dht.readTemperature();
float h = dht.readHumidity();
int soilAnalog = analogRead(SOIL_PIN);
soilPercent = map(soilAnalog, 4095, 0, 0, 100);
if (soilPercent < 0) soilPercent = 0;
if (soilPercent > 100) soilPercent = 100;
if (isnan(t) || isnan(h)) {
Serial.println("Gagal membaca sensor DHT!");
return;
}
if (autoMode) {
if (soilPercent < moistureThreshold) {
digitalWrite(RELAY_PIN, HIGH);
Blynk.virtualWrite(PIN_VIR_RELAY, 1);
statusRelay = 1;
} else {
digitalWrite(RELAY_PIN, LOW);
Blynk.virtualWrite(PIN_VIR_RELAY, 0);
statusRelay = 0;
}
}
Blynk.virtualWrite(PIN_VIR_SUHU, t);
Blynk.virtualWrite(PIN_VIR_HUMY, h);
Blynk.virtualWrite(PIN_VIR_SOIL, soilPercent);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("S:"); lcd.print(t, 1); lcd.print("C H:"); lcd.print(h, 0); lcd.print("%");
lcd.setCursor(0, 1);
lcd.print("M:"); lcd.print(soilPercent); lcd.print("% ");
lcd.print(autoMode ? "AUTO R:" : "MAN R:");
lcd.print(statusRelay ? "ON" : "OFF");
}
void setup() {
Serial.begin(115200);
pinMode(RELAY_PIN, OUTPUT);
dht.begin();
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Connecting WiFi.");
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("WiFi Connected!");
delay(2000);
timer.setInterval(2000L, readSensors);
}
void loop() {
Blynk.run();
timer.run();
}