/* Program Sistem Siram Tanaman */
#define BLYNK_TEMPLATE_ID "TMPL6mUN6D0Q4"
#define BLYNK_TEMPLATE_NAME "Tes IoT"
#define BLYNK_AUTH_TOKEN "-lYeOsu1GWrB1YWs8mbO2AjGnhVtFqbp"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <ESP32Servo.h>
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
/* WiFi */
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
/* Timer */
BlynkTimer timer;
/* PIN */
#define SERVO1_PIN 18
#define SERVO2_PIN 19
#define LDR_PIN 35
#define DHT_PIN 15
#define SOIL1_PIN 32
#define SOIL2_PIN 34
/* Sensor */
#define DHTTYPE DHT22
DHT dht(DHT_PIN, DHTTYPE);
/* LCD */
LiquidCrystal_I2C lcd(0x27, 20, 4);
/* Servo */
Servo servo1;
Servo servo2;
/* Variabel Global */
float suhu, kelembaban, lux;
int soil1, soil2;
/* ---------------------------------------------------------------------- */
/* Kirim data sensor ke Blynk */
/* ---------------------------------------------------------------------- */
void sendToBlynk() {
Blynk.virtualWrite(V8, suhu);
Blynk.virtualWrite(V7, kelembaban);
Blynk.virtualWrite(V1, soil1);
Blynk.virtualWrite(V2, soil2);
Blynk.virtualWrite(V3, lux);
}
/* ---------------------------------------------------------------------- */
/* Baca semua sensor + CETAK SERIAL */
/* ---------------------------------------------------------------------- */
void readSensors() {
// DHT
suhu = dht.readTemperature();
kelembaban = dht.readHumidity();
// Soil moisture (0–4095 → %)
soil1 = map(analogRead(SOIL1_PIN), 4095, 0, 0, 100);
soil2 = map(analogRead(SOIL2_PIN), 4095, 0, 0, 100);
// LDR (Lux)
int adc = analogRead(LDR_PIN);
lux = map(adc, 4095, 0, 0, 2000);
// Kontrol servo
bool pump1_on = soil1 > 70;
bool pump2_on = soil2 > 70;
servo1.write(pump1_on ? 180 : 0);
servo2.write(pump2_on ? 180 : 0);
// --- CETAK KE SERIAL (PRINT LOG LENGKAP) ---
Serial.println("===== DATA SENSOR =====");
Serial.print("Suhu : "); Serial.print(suhu); Serial.println(" C");
Serial.print("Hum : "); Serial.print(kelembaban); Serial.println(" %");
Serial.print("Tanah 1 : "); Serial.print(soil1);
Serial.print("% | Pump1: "); Serial.println(pump1_on ? "ON" : "OFF");
Serial.print("Tanah 2 : "); Serial.print(soil2);
Serial.print("% | Pump2: "); Serial.println(pump2_on ? "ON" : "OFF");
Serial.print("Lux: "); Serial.print(lux); Serial.print(" | Kategori: ");
if (lux < 300) Serial.println("Malam");
else if (lux < 900) Serial.println("Pagi/Sore");
else Serial.println("Siang");
// Suhu kategori
Serial.print("Kategori Suhu: ");
if (suhu < 20) Serial.println("Dingin");
else if (suhu < 30) Serial.println("Normal");
else Serial.println("Panas");
// Hum kategori
Serial.print("Kategori Hum : ");
if (kelembaban < 40) Serial.println("Kering");
else if (kelembaban < 70) Serial.println("Normal");
else Serial.println("Lembab");
Serial.println("========================\n");
}
/* ---------------------------------------------------------------------- */
/* Update LCD tanpa flicker */
/* ---------------------------------------------------------------------- */
void updateLCD() {
lcd.clear();
// ==== STATUS TANAH 1 ====
String pump1 = (soil1 > 70) ? "ON" : "OFF";
lcd.setCursor(0, 0);
lcd.print("T1:");
lcd.print(soil1);
lcd.print("% ");
lcd.print(pump1);
// ==== STATUS TANAH 2 ====
String pump2 = (soil2 > 70) ? "ON" : "OFF";
lcd.setCursor(11, 0);
lcd.print("T2:");
lcd.print(soil2);
lcd.print("% ");
lcd.print(pump2);
// ==== KATEGORI CAHAYA ====
String kategoriCahaya;
if (lux < 300) kategoriCahaya = "Malam";
else if (lux < 900) kategoriCahaya = "Pagi/Sore";
else kategoriCahaya = "Siang";
lcd.setCursor(0, 1);
lcd.print("Lux:");
lcd.print(lux);
lcd.print(" ");
lcd.print(kategoriCahaya);
// ==== KATEGORI SUHU ====
String kategoriSuhu;
if (suhu < 20) kategoriSuhu = "Dingin";
else if (suhu < 30) kategoriSuhu = "Normal";
else kategoriSuhu = "Panas";
lcd.setCursor(0, 2);
lcd.print("Suhu:");
lcd.print(suhu);
lcd.print("C ");
lcd.print(kategoriSuhu);
// ==== KATEGORI KELEMBABAN ====
String kategoriH;
if (kelembaban < 40) kategoriH = "Kering";
else if (kelembaban < 70) kategoriH = "Normal";
else kategoriH = "Lembab";
lcd.setCursor(0, 3);
lcd.print("Hum:");
lcd.print(kelembaban);
lcd.print("% ");
lcd.print(kategoriH);
}
/* ---------------------------------------------------------------------- */
/* Setup */
/* ---------------------------------------------------------------------- */
void setup() {
Serial.begin(115200);
dht.begin();
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
lcd.init();
lcd.backlight();
servo1.attach(SERVO1_PIN);
servo2.attach(SERVO2_PIN);
lcd.setCursor(0,0);
lcd.print("Sistem Monitoring");
lcd.setCursor(0,1);
lcd.print("Tanaman Berbasis IoT");
lcd.setCursor(0,2);
lcd.print("(SISMOTANI) oleh:");
lcd.setCursor(0,3);
lcd.print("Made Santo Gitakarma");
delay(4000);
lcd.clear();
// Timer setiap 1 detik
timer.setInterval(1000L, readSensors);
timer.setInterval(1500L, updateLCD);
timer.setInterval(2000L, sendToBlynk);
}
/* ---------------------------------------------------------------------- */
/* Loop */
/* ---------------------------------------------------------------------- */
void loop() {
Blynk.run();
timer.run();
}
Soil Moisture
Sensor 1
Soil Moisture
Sensor 2
Photoresistor
(LDR)
Suhu dan Kelembaban
Udara (Sensor DHT22)
Motor DC Pompa Air
Penyiram Tanaman 1
Motor DC Pompa Air
Penyiram Tanaman 2