#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#include <ESP32Servo.h>
#define DHTPIN 15 // Pin DHT22
#define DHTTYPE DHT22 // Jenis sensor DHT
#define RAIN_PIN 36 // Pin Rain Sensor (analog)
#define SERVO_PIN 13 // Pin Servo
DHT dht(DHTPIN, DHTTYPE);
Servo servo; // Objek Servo
String lastWeatherCondition = ""; // Menyimpan kondisi cuaca sebelumnya
int getStableRainValue() {
int totalValue = 0;
const int sampleCount = 10; // Jumlah sampel untuk rata-rata
for (int i = 0; i < sampleCount; i++) {
totalValue += analogRead(RAIN_PIN);
delay(10);
}
return totalValue / sampleCount; // Rata-rata
}
// Fungsi untuk menghitung curah hujan berdasarkan nilai sensor
float calculateRainfall(int rainValue) {
// Contoh konversi sederhana, sesuaikan dengan hasil kalibrasi Anda
// Misalnya: rainValue 0-4095 -> curah hujan 0-50 mm/jam
float maxAnalogValue = 4095.0;
float maxRainfall = 50.0; // Maksimal curah hujan dalam mm/jam
return (rainValue / maxAnalogValue) * maxRainfall;
}
String determineWeatherCondition(int rainValue, float temperature, float humidity) {
String condition;
if (rainValue > 0) {
// Hujan terdeteksi
condition = "Hujan";
} else {
// Tidak hujan, tentukan berdasarkan suhu dan kelembapan
if (temperature > 30 && humidity < 50) {
condition = "Cerah"; // Suhu tinggi dan kelembapan rendah
} else if (humidity > 75 || (temperature >= 20 && temperature <= 30)) {
condition = "Berawan"; // Kelembapan tinggi atau suhu sedang
}
}
// Hindari perubahan status yang terlalu sering
if (condition != lastWeatherCondition) {
lastWeatherCondition = condition;
}
return lastWeatherCondition;
}
void controlServo(String weatherCondition) {
if (weatherCondition == "Hujan") {
Serial.println("Servo Aktif (Menyeka Sensor Hujan)");
for (int angle = 0; angle <= 180; angle++) {
servo.write(angle); // Gerakkan servo secara bertahap ke posisi 180°
delay(10); // Delay untuk smooth movement
}
for (int angle = 180; angle >= 0; angle--) {
servo.write(angle); // Gerakkan servo kembali ke posisi 0°
delay(10); // Delay untuk smooth movement
}
} else {
servo.write(0); // Pastikan servo berada di posisi awal
Serial.println("Servo Non-Aktif (Posisi: 0 derajat)");
}
}
void setup() {
Serial.begin(115200);
dht.begin();
pinMode(RAIN_PIN, INPUT);
servo.attach(SERVO_PIN); // Hubungkan servo ke pin
servo.write(0); // Inisialisasi servo di posisi awal
Serial.println("Monitoring Cuaca Dimulai...");
}
void loop() {
// Membaca Rain Sensor
int rainValue = getStableRainValue(); // Membaca nilai stabil dari sensor hujan
float rainfall = calculateRainfall(rainValue); // Menghitung curah hujan
// Membaca DHT22
float temperature = dht.readTemperature(); // Suhu dalam Celsius
float humidity = dht.readHumidity(); // Kelembapan dalam %
// Validasi pembacaan sensor
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Gagal membaca dari sensor DHT22!");
delay(2000);
return;
}
// Tentukan kondisi cuaca
String weatherCondition = determineWeatherCondition(rainValue, temperature, humidity);
// Kendalikan Servo berdasarkan kondisi cuaca
controlServo(weatherCondition);
// Tampilkan hasil ke Serial Monitor
Serial.println("=== Kondisi Cuaca ===");
Serial.print("Suhu: ");
Serial.print(temperature);
Serial.println(" °C");
Serial.print("Kelembapan: ");
Serial.print(humidity);
Serial.println(" %");
Serial.print("Rain Sensor Value: ");
Serial.println(rainValue);
Serial.print("Curah Hujan: ");
Serial.print(rainfall);
Serial.println(" mm/jam");
Serial.print("Kondisi Cuaca: ");
Serial.println(weatherCondition);
Serial.println("=====================");
delay(2000);
}