#include <ESP32Servo.h>

// Deklarasi pin
const int rainSensorPin = 13;  // Pin untuk sensor hujan
const int servoPin = 17;       // Pin untuk servo motor
const int ldrPin = 34;         // Pin untuk sensor LDR (analog pin)

// Deklarasi variabel
Servo myServo;
int rainValue;
int lastRainValue = HIGH;      // Inisialisasi dengan HIGH (tidak hujan)
int ldrValue;
const int ldrThreshold = 2500;  // Ambang batas untuk LDR (cerah)
const int cloudThreshold = 2500; // Ambang batas untuk mendeteksi mendung

bool jemuranDiDalam = false;   // Status jemuran (false = di luar, true = di dalam)

void setup() {
  // Inisialisasi pin
  pinMode(rainSensorPin, INPUT);
  myServo.attach(servoPin);

  // Set posisi awal servo
  myServo.write(90);  // 90 derajat: posisi netral (tidak bergerak)
  
  Serial.begin(115200);
}

void loop() {
  // Membaca nilai dari sensor hujan dan LDR
  rainValue = digitalRead(rainSensorPin);
  ldrValue = analogRead(ldrPin);
  
  // Jika hujan terdeteksi dan jemuran masih di luar
  if (rainValue == HIGH && !jemuranDiDalam) {  // Asumsinya LOW ketika hujan
    Serial.println("Hujan terdeteksi! Menarik jemuran ke dalam...");
    myServo.attach(servoPin);  // Sambungkan servo untuk menggerakkan
    myServo.write(180);        // Menggerakkan servo ke posisi 180 derajat (menarik jemuran ke dalam)
    delay(5000);               // Waktu untuk servo mencapai posisi
    myServo.write(90);         // Posisi netral untuk menghentikan motor
    myServo.detach();          // Mematikan servo setelah mencapai posisi
    jemuranDiDalam = true;     // Update status jemuran (sekarang di dalam)
    lastRainValue = LOW;       // Perbarui status hujan terakhir
  }
  // Jika tidak hujan dan mendung, serta jemuran masih di luar
  else if (rainValue == LOW && ldrValue > cloudThreshold && !jemuranDiDalam) {
    Serial.println("Cuaca mendung terdeteksi! Menarik jemuran ke dalam...");
    myServo.attach(servoPin);  // Sambungkan servo untuk menggerakkan
    myServo.write(180);        // Menggerakkan servo ke posisi 180 derajat (menarik jemuran ke dalam)
    delay(5000);               // Waktu untuk servo mencapai posisi
    myServo.write(90);         // Posisi netral untuk menghentikan motor
    myServo.detach();          // Mematikan servo setelah mencapai posisi
    jemuranDiDalam = true;     // Update status jemuran (sekarang di dalam)
    lastRainValue = HIGH;      // Perbarui status terakhir
  }
  // Jika cuaca cerah terdeteksi setelah hujan atau mendung dan jemuran di dalam
  else if (rainValue == LOW && ldrValue <= ldrThreshold && jemuranDiDalam) {
    Serial.println("Cerah terdeteksi. Mengeluarkan jemuran...");
    myServo.attach(servoPin);  // Sambungkan servo untuk menggerakkan
    myServo.write(0);          // Menggerakkan servo ke posisi 0 derajat (mengeluarkan jemuran)
    delay(5000);               // Waktu untuk servo mencapai posisi
    myServo.write(90);         // Posisi netral untuk menghentikan motor
    myServo.detach();          // Mematikan servo setelah mencapai posisi
    jemuranDiDalam = false;    // Update status jemuran (sekarang di luar)
    lastRainValue = LOW;      // Perbarui status hujan terakhir
  }

  // Tampilkan nilai LDR dan status hujan untuk debugging
  Serial.print("Nilai LDR: ");
  Serial.println(ldrValue);
  Serial.print("Status Hujan: ");
  Serial.println(rainValue == HIGH ? "Hujan" : "Tidak Hujan");

  // Tunggu sebentar sebelum membaca ulang
  delay(1000);
}
$abcdeabcde151015202530354045505560fghijfghij
esp:0
esp:2
esp:4
esp:5
esp:12
esp:13
esp:14
esp:15
esp:16
esp:17
esp:18
esp:19
esp:21
esp:22
esp:23
esp:25
esp:26
esp:27
esp:32
esp:33
esp:34
esp:35
esp:3V3
esp:EN
esp:VP
esp:VN
esp:GND.1
esp:D2
esp:D3
esp:CMD
esp:5V
esp:GND.2
esp:TX
esp:RX
esp:GND.3
esp:D1
esp:D0
esp:CLK
rain-sensorBreakout
chip1:VCC
chip1:GND
chip1:DO
chip1:AO
servo1:GND
servo1:V+
servo1:PWM
ldr1:VCC
ldr1:GND
ldr1:DO
ldr1:AO