#define BLYNK_TEMPLATE_ID "TMPL601XHdtLr"
#define BLYNK_TEMPLATE_NAME "Pemantauan Cuaca"
#define BLYNK_AUTH_TOKEN "qjlFMKG1qQPLpeo7MFG6PjOUETalEQYM"
#define BLYNK_PRINT Serial
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include "DHT.h"
#include <Servo.h>
// WiFi credentials
const char* ssid = "Tselhome-1923";
const char* password = "xxxxxxx3";
// DHT Sensor configuration
#define DHTPIN 4
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
// Soil sensor configuration
#define SoilSensor 34 // Pin analog ESP32
#define POMPA 2
#define LED_POMPA 13
// Rain sensor configuration
#define RainSensor 35 // Pin analog ESP32
#define THRESHOLD_RAIN 500 // Threshold for detecting rain
// Servo configuration
Servo atapServo;
#define SERVO_PIN 25
#define SERVO_OPEN_ANGLE 90 // Angle to open the roof
#define SERVO_CLOSE_ANGLE 0 // Angle to close the roof
// LCD I2C configuration
LiquidCrystal_I2C lcd(0x27, 16, 2); // Adjust the I2C address (0x27) if needed
float kelembabanTanah;
float thresholdKelembapan = 40.0;
char auth[] = BLYNK_AUTH_TOKEN;
BlynkTimer timer;
bool isHujan = false;
// Function to send DHT sensor data
void sendSensorData() {
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Blynk.virtualWrite(V0, t); // Temperature to virtual pin V0
Blynk.virtualWrite(V1, h); // Humidity to virtual pin V1
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" °C");
Serial.print("Humidity: ");
Serial.print(h);
Serial.println(" %");
}
// Function to read soil moisture
void readSoilMoisture() {
int hasilPembacaan = analogRead(SoilSensor);
kelembabanTanah = (100 - ((hasilPembacaan / 4095.00) * 100));
Serial.print("Persentase Kelembaban Tanah = ");
Serial.print(kelembabanTanah);
Serial.println("%");
Blynk.virtualWrite(V2, kelembabanTanah);
if (kelembabanTanah < thresholdKelembapan) {
digitalWrite(POMPA, LOW); // Turn on pump
digitalWrite(LED_POMPA, HIGH); // Turn on LED
Serial.println("Pompa Menyala");
Blynk.virtualWrite(V3, "ON");
sendNotification();
} else {
digitalWrite(POMPA, HIGH); // Turn off pump
digitalWrite(LED_POMPA, LOW); // Turn off LED
Serial.println("Pompa Mati");
Blynk.virtualWrite(V3, "OFF");
}
}
// Function to check rain status and control the roof
void checkRain() {
int rainValue = analogRead(RainSensor);
Blynk.virtualWrite(V4, rainValue); // Send rain value to virtual pin V4
Serial.print("Rain Sensor Value: ");
Serial.println(rainValue);
if (rainValue < THRESHOLD_RAIN) {
Serial.println("Hujan terdeteksi! Menutup atap.");
atapServo.write(SERVO_CLOSE_ANGLE);
Blynk.virtualWrite(V5, "CLOSE");
isHujan = true;
} else {
Serial.println("Tidak ada hujan. Membuka atap.");
atapServo.write(SERVO_OPEN_ANGLE);
Blynk.virtualWrite(V5, "OPEN");
isHujan = false;
}
}
// Function to display data on LCD
void displayLCD() {
lcd.clear();
// Line 1: Temp & Humidity
float t = dht.readTemperature();
float h = dht.readHumidity();
lcd.setCursor(0, 0);
lcd.print("T:");
lcd.print(t, 1);
lcd.print("C H:");
lcd.print(h, 1);
lcd.print("%");
// Line 2: Rain & Pump Status
lcd.setCursor(0, 1);
lcd.print("Rain:");
lcd.print(isHujan ? "Yes" : "No ");
lcd.print(" P:");
lcd.print(digitalRead(POMPA) == LOW ? "ON" : "OFF");
}
// Function to send notification
void sendNotification() {
Blynk.notify("Kelembaban tanah rendah! Pompa menyala.");
}
// Function to update soil moisture threshold from Blynk
BLYNK_WRITE(V6) {
thresholdKelembapan = param.asFloat();
Serial.print("Threshold Kelembaban Tanah diubah menjadi: ");
Serial.println(thresholdKelembapan);
}
void setup() {
Serial.begin(115200);
Blynk.begin(auth, ssid, password);
pinMode(POMPA, OUTPUT);
pinMode(LED_POMPA, OUTPUT);
dht.begin();
atapServo.attach(SERVO_PIN);
// Initialize servo position
atapServo.write(SERVO_OPEN_ANGLE);
// Initialize LCD
lcd.init();
lcd.backlight();
// Set timers
timer.setInterval(5000L, sendSensorData); // DHT sensor every 5 seconds
timer.setInterval(10000L, readSoilMoisture); // Soil moisture every 10 seconds
timer.setInterval(3000L, checkRain); // Rain sensor every 3 seconds
timer.setInterval(2000L, displayLCD); // Update LCD every 2 seconds
}
void loop() {
Blynk.run();
timer.run();
}