#define BLYNK_TEMPLATE_ID "TMPL6yzApDBeF"
#define BLYNK_TEMPLATE_NAME "Hidroponik Arduino"
#define BLYNK_AUTH_TOKEN "2kuSwBGrbSW9sG3GU4NzaqUwjKUpIJ3t"
#define BLYNK_PRINT Serial
#define lampuRGBPin 27
#define LDR_PIN 34
#define TRIG_PIN 5
#define ECHO_PIN 18
#include "DHTesp.h"
#include <LiquidCrystal_I2C.h>
#define I2C_ADDR 0x27
#define LCD_COLUMNS 20
#define LCD_LINES 4
#define phUpPin 14
#define phDownPin 12
#define pompaNutrisiAPin 13
#define pompaNutrisiBPin 16
#define pompaAirBersihPin 4
#define pompaPembuanganPin 15
#define lampuPin 19
#define pompaSirkulasiAir 26
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <DHTesp.h>
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
bool autoMode = false;
const int DHT_PIN = 17;
DHTesp dhtSensor;
BlynkTimer timer;
long duration;
float distanceCm;
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
void sendAllData() {
sendSensor();
sendUltrasonicData();
sendLDRData();
sendPHData();
sendTDSData();
}
void sendLDRData() {
int ldrValue = analogRead(LDR_PIN);
Blynk.virtualWrite(V10, ldrValue);
Serial.print("LDR Value: ");
Serial.println(ldrValue);
}
void sendUltrasonicData() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH);
distanceCm = duration * 0.034 / 2;
Blynk.virtualWrite(V9, distanceCm);
Serial.print("Jarak: ");
Serial.print(distanceCm);
Serial.println(" cm");
}
void sendSensor() {
TempAndHumidity data = dhtSensor.getTempAndHumidity();
Blynk.virtualWrite(V11, data.temperature);
Blynk.virtualWrite(V12, data.humidity);
}
void sendTDSData() {
int kelarutan = analogRead(32);
int kelarutanMapped = map(kelarutan, 0, 4095, 0, 1000);
Blynk.virtualWrite(V1, kelarutanMapped);
Serial.print("TDS: ");
Serial.println(kelarutanMapped);
}
void sendPHData() {
int keasaman = analogRead(33);
float phValue = map(keasaman, 0, 4095, 0, 1400) / 100.0;
Blynk.virtualWrite(V2, phValue);
Serial.print("pH: ");
Serial.println(phValue);
}
void setup() {
Serial.begin(9600);
pinMode(lampuRGBPin, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LDR_PIN, INPUT);
pinMode(33, INPUT);
pinMode(32, INPUT);
pinMode(phUpPin, OUTPUT);
pinMode(phDownPin, OUTPUT);
pinMode(pompaNutrisiAPin, OUTPUT);
pinMode(pompaNutrisiBPin, OUTPUT);
pinMode(pompaAirBersihPin, OUTPUT);
pinMode(pompaPembuanganPin, OUTPUT);
pinMode(lampuPin, OUTPUT);
pinMode(pompaSirkulasiAir, OUTPUT);
autoMode = false;
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
lcd.init();
lcd.backlight();
Blynk.begin(auth, ssid, pass);
timer.setInterval(1000L, sendAllData);
digitalWrite(phUpPin, LOW);
digitalWrite(phDownPin, LOW);
digitalWrite(pompaNutrisiAPin, LOW);
digitalWrite(pompaNutrisiBPin, LOW);
digitalWrite(pompaAirBersihPin, LOW);
digitalWrite(pompaPembuanganPin, LOW);
digitalWrite(lampuPin, LOW);
digitalWrite(pompaSirkulasiAir, HIGH);
Blynk.virtualWrite(V15, 1);
}
BLYNK_WRITE(V3) {
int phUpState = param.asInt();
if (phUpState == 1) {
digitalWrite(phUpPin, HIGH);
Serial.println("pH Up ON");
} else {
digitalWrite(phUpPin, LOW);
Serial.println("pH Up OFF");
}
}
BLYNK_WRITE(V4) {
int phDownState = param.asInt();
if (phDownState == 1) {
digitalWrite(phDownPin, HIGH);
Serial.println("pH Down ON");
} else {
digitalWrite(phDownPin, LOW);
Serial.println("pH Down OFF");
}
}
BLYNK_WRITE(V5) {
int pompaAState = param.asInt();
if (pompaAState == 1) {
digitalWrite(pompaNutrisiAPin, HIGH);
Serial.println("Pompa Nutrisi A ON");
} else {
digitalWrite(pompaNutrisiAPin, LOW);
Serial.println("Pompa Nutrisi A OFF");
}
}
BLYNK_WRITE(V6) {
int pompaBState = param.asInt();
if (pompaBState == 1) {
digitalWrite(pompaNutrisiBPin, HIGH);
Serial.println("Pompa Nutrisi B ON");
} else {
digitalWrite(pompaNutrisiBPin, LOW);
Serial.println("Pompa Nutrisi B OFF");
}
}
BLYNK_WRITE(V7) {
int pompaAirBersihState = param.asInt();
if (pompaAirBersihState == 1) {
digitalWrite(pompaAirBersihPin, HIGH);
Serial.println("Pompa Air Bersih ON");
} else {
digitalWrite(pompaAirBersihPin, LOW);
Serial.println("Pompa Air Bersih OFF");
}
}
BLYNK_WRITE(V8) {
int pompaPembuanganState = param.asInt();
if (pompaPembuanganState == 1) {
digitalWrite(pompaPembuanganPin, HIGH);
Serial.println("Pompa Pembuangan ON");
} else {
digitalWrite(pompaPembuanganPin, LOW);
Serial.println("Pompa Pembuangan OFF");
}
}
BLYNK_WRITE(V0) {
int lampuState = param.asInt();
if (lampuState == 1) {
digitalWrite(lampuPin, HIGH);
Serial.println("Lampu Tanaman ON");
} else {
digitalWrite(lampuPin, LOW);
Serial.println("Lampu Tanaman OFF");
}
}
BLYNK_WRITE(V13) {
int tombolState = param.asInt();
if (tombolState == 1) {
autoMode = true;
} else {
autoMode = false;
}
}
BLYNK_WRITE(V15) {
int pompaSirkulasi = param.asInt();
if (pompaSirkulasi == 1) {
digitalWrite(pompaSirkulasiAir, HIGH);
} else {
digitalWrite(pompaSirkulasiAir, LOW);
}
}
void prosesOtomatis() {
if (autoMode) {
Serial.println("Mode otomatis ON");
digitalWrite(lampuRGBPin, HIGH);
} else {
digitalWrite(phUpPin, LOW);
digitalWrite(phDownPin, LOW);
digitalWrite(pompaNutrisiAPin, LOW);
digitalWrite(pompaNutrisiBPin, LOW);
digitalWrite(pompaAirBersihPin, LOW);
digitalWrite(pompaPembuanganPin, LOW);
digitalWrite(lampuPin, LOW);
Serial.println("Mode otomatis OFF");
digitalWrite(lampuRGBPin, LOW);
}
}
void loop() {
Blynk.run();
timer.run();
TempAndHumidity data = dhtSensor.getTempAndHumidity();
Serial.println("Temp: " + String(data.temperature, 1) + "°C");
Serial.println("Humidity: " + String(data.humidity, 1) + "%");
Serial.println("---");
prosesOtomatis();
lcd.setCursor(0, 0);
lcd.print(String(data.temperature, 1) + "\xDF" + "C ");
lcd.setCursor(0, 1);
lcd.print(String(data.humidity, 1) + "% ");
}