#include <ESP32Servo.h> // Menggunakan pustaka Servo
#define SERVO_PIN 13 // Pin untuk servo
#define LDR_PIN 34 // Pin untuk LDR
#define LED_PIN 4 // Pin untuk LED
#define THRESHOLD 400 // Threshold untuk LDR
#define BUTTON_PIN 15 // Pin untuk tombol
#define SERVO_OPEN_POS 0 // Posisi servo terbuka
#define SERVO_CLOSED_POS 90 // Posisi servo tertutup
#define LED_ON_DURATION 500 // Durasi LED menyala dan servo bergerak (dalam milidetik)
Servo myServo; // Membuat objek servo
bool isServoAtClosed = true; // Status posisi servo
bool isServoMoving = false; // Status untuk mengetahui apakah servo sedang bergerak
unsigned long buttonPressTime = 0; // Waktu saat tombol ditekan
void setup() {
Serial.begin(115200); // Inisialisasi komunikasi serial
pinMode(LDR_PIN, INPUT); // Set LDR sebagai input
pinMode(LED_PIN, OUTPUT); // Set LED sebagai output
pinMode(BUTTON_PIN, INPUT_PULLUP); // Set tombol sebagai input
myServo.attach(SERVO_PIN); // Menghubungkan servo ke pin yang ditentukan
myServo.write(SERVO_CLOSED_POS); // Mengatur posisi awal servo di 90 derajat (tertutup)
}
void loop() {
// Cek status tombol
int buttonState = digitalRead(BUTTON_PIN);
// Cek apakah tombol ditekan (transisi dari HIGH ke LOW)
if (buttonState == LOW && !isServoMoving) {
// Servo bergerak ke posisi terbuka dan LED menyala
myServo.write(SERVO_OPEN_POS); // Servo bergerak ke posisi 0 derajat (terbuka)
digitalWrite(LED_PIN, HIGH); // Nyalakan LED saat servo terbuka
buttonPressTime = millis(); // Simpan waktu saat tombol ditekan
isServoMoving = true; // Update status servo sedang bergerak
delay(50); // Debouncing
}
// Jika servo sedang bergerak, matikan LED dan kembalikan servo setelah durasi tertentu
if (isServoMoving && (millis() - buttonPressTime >= LED_ON_DURATION)) {
digitalWrite(LED_PIN, LOW); // Matikan LED
myServo.write(SERVO_CLOSED_POS); // Kembalikan servo ke posisi tertutup
isServoMoving = false; // Update status servo tidak bergerak
}
// Baca nilai LDR
int ldrValue = analogRead(LDR_PIN); // Baca nilai LDR
Serial.print("LDR Value: "); // Print label
Serial.println(ldrValue); // Tampilkan nilai LDR
// Kontrol servo berdasarkan nilai LDR
if (ldrValue < THRESHOLD && isServoAtClosed) {
// Jika cahaya di bawah threshold dan servo tertutup, buka servo
myServo.write(SERVO_OPEN_POS); // Servo bergerak ke posisi 0 derajat (terbuka)
digitalWrite(LED_PIN, HIGH); // Nyalakan LED saat servo terbuka
isServoAtClosed = false; // Update status servo
} else if (ldrValue >= THRESHOLD && !isServoAtClosed) {
// Jika cahaya di atas threshold dan servo terbuka, tutup servo
myServo.write(SERVO_CLOSED_POS); // Servo bergerak ke posisi 90 derajat (tertutup)
digitalWrite(LED_PIN, LOW); // Matikan LED saat servo tertutup
isServoAtClosed = true; // Update status servo
}
delay(100); // Delay untuk stabilitas pembacaan
}