// BLYNK, identitas device
#define BLYNK_TEMPLATE_ID "TMPL69kEQwPBP"
#define BLYNK_TEMPLATE_NAME "Self Watering System ESP32 and Soil Moisture"
#define BLYNK_AUTH_TOKEN "iFBv4P2fzFR5mXdUeb74u-H5Dh9s0jZT"
//library
#include <BlynkSimpleEsp32.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>
#include "DHT.h"
// BLYNK, ssid, pass, token
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// Deklarasi PIN yang akan digunakan
// Pin lcd i2c (20x4)
#define SDA_PIN 18
#define SCL_PIN 19
#define SOIL_SENSOR_PIN 34 // Soil sensor
#define LED_RED_PIN 2 // lcd red
#define LED_BLUE_PIN 4 // lcd blue
#define SERVO_PIN 15 // Servo
#define SENSOR_POWER_PIN 21 // Pin power soil sensor
const int relay1 = 17; // Fan Cooler lcd (Cyan)
const int relay2 = 16; // Heat lamp lcd (Lime)
// DHT22, DHT Type
#define DHTPIN 5
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
int relayOFF = HIGH; // Relay nyala
int relayON = LOW; // Relay mati
// lcd Identification
BlynkTimer timer;
LiquidCrystal_I2C lcd(0x27, 20, 4);
Servo servo;
void setup() {
// Kode ini akan dijalankan sekali
// Menyalakan DHT22
Serial.begin(9600); //membaca di serial monitor
dht.begin();
// Setting pin relay menjadi output
Serial.begin(115200);
pinMode(relay1, OUTPUT);
pinMode(relay2, OUTPUT);
// Kalibrasi cooler dan heater
digitalWrite(relay1, relayON);
digitalWrite(relay2, relayON);
// Setting pin led menjadi output
pinMode(LED_RED_PIN, OUTPUT);
pinMode(LED_BLUE_PIN, OUTPUT);
pinMode(SENSOR_POWER_PIN, OUTPUT);
// Inisialisasi untuk memastikan sensor OFF
digitalWrite(SENSOR_POWER_PIN, LOW);
// Setting pin LCD
Wire.begin(SDA_PIN, SCL_PIN);
Serial.begin(115200);
Serial.println("Hello, start configuration!");
// Setting servo pin
servo.attach(SERVO_PIN);
servo.write(0);
// Inisialisasi lcd
lcd.init();
lcd.backlight();
//BLYNK, mulai koneksi ke blynk
Blynk.begin(auth, ssid, pass);
timer.setInterval(2500L, sendSensor);
}
// BLYNK, syncron data terakhir saat koneksi tersambung
BLYNK_CONNECTED() {
Blynk.syncAll();
}
// BLYNK, mendapat input dr blynk lewat datastream V0
BLYNK_WRITE(V0) {
int saklar=param.asInt();
digitalWrite(SENSOR_POWER_PIN, saklar);
}
String createMessage() {
float moisture = analogRead(SOIL_SENSOR_PIN);
float mois = moisture-1680;
float soilmois = mois/1940*100;
String msg = "";
if(soilmois < 60.00) {
msg = "KERING";
digitalWrite(LED_RED_PIN, HIGH);
digitalWrite(LED_BLUE_PIN, LOW);
servo.write(0);
Blynk.virtualWrite(V2, "Air terlalu sedikit, tambahkan air");
} else if( soilmois > 80.00) {
msg = "BASAH";
digitalWrite(LED_RED_PIN, HIGH);
digitalWrite(LED_BLUE_PIN, LOW);
servo.write(90);
Blynk.virtualWrite(V2, "Air terlalu banyak, hentikan penyiraman air");
} else {
msg = "BAIK";
digitalWrite(LED_RED_PIN, LOW);
digitalWrite(LED_BLUE_PIN, LOW);
servo.write(0);
Blynk.virtualWrite(V2, "Air dalam kondisi baik");
}
return msg;
}
void sendSensor() {
int activeSensor = digitalRead(SENSOR_POWER_PIN);
String message = "";
if(activeSensor == 1) {
message = createMessage();
Serial.println("Keadaan: "+message);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Soil: ");
lcd.print(message);
Blynk.virtualWrite(V1, message);
delay(1000);
} else {
message = "Sensor Mati";
lcd.clear();
lcd.print(message);
Blynk.virtualWrite(V1, message);
Blynk.virtualWrite(V2, message);
digitalWrite(LED_RED_PIN, HIGH);
digitalWrite(LED_BLUE_PIN, LOW);
servo.write(0);
delay(1000);
digitalWrite(LED_RED_PIN, LOW);
}
delay(1000);
}
void loop() {
// BLYNK, menjalankan blynk
Blynk.run();
timer.run();
sendSensor();
//membaca kelembaban dalam data float, variabel h
float h = dht.readHumidity();
//membaca temperatur dalam data float, variabel t
float t = dht.readTemperature();
//membaca temperatur farenheit dengan mengubah temperatur celcius melalui program dibawah
float f = dht.readTemperature(true);
// pengecekan ulang bila suhu yang dibaca salah dan dilakukan pengulangan
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
// Hitung indeks panas dalam Fahrenheit (default)
float hif = dht.computeHeatIndex(f, h);
// Hitung indeks panas dalam Celcius (isFahreheit = false)
float hic = dht.computeHeatIndex(t, h, false);
delay(100);
Serial.print(F("Humidity: "));
Serial.print(h);
Serial.print(F("% Temperature: "));
Serial.print(t);
Serial.print(F("°C "));
Serial.print(f);
Serial.print(F("°F Heat index: "));
Serial.print(hic);
Serial.print(F("°C "));
Serial.print(hif);
Serial.println(F("°F"));
//tampilan di serial monitor
if (t > 28.00) {
// Jika suhu melebihi batas atas, matikan perangkat
digitalWrite(relay1, relayON);
digitalWrite(relay2, relayOFF);
delay(10);
} else if (t < 24.00) {
// Jika suhu kurang dari batas bawah, hidupkan perangkat
digitalWrite(relay1, relayOFF);
digitalWrite(relay2, relayON);
delay(10);
} else {
digitalWrite(relay1, relayOFF);
digitalWrite(relay2, relayOFF);
}
//tampilan dalam peraga lcd beruapa humidity (h) pada baris 1, trmperatur dalan celcius (t) pada baris 2, heat index hic pada baris 3
lcd.setCursor(0, 1); //menentukan baris dan kolom
lcd.print(F("Humidity: "));
lcd.print(h);
lcd.print(F("%"));
lcd.setCursor(0,2);
lcd.print(F("Temp: "));
lcd.print(t);
lcd.print(F(" C "));
lcd.setCursor(0,3);
lcd.print(F("HeatIndex: "));
lcd.print(hic);
lcd.print(F(" C"));
delay(2000); // Kecepatan untuk mengulang program dalam ms
}