#include <ESP32Servo.h>
// --- الأرجل (Pins) ---
#define LDR_PIN 34 // حساس الضوء
#define BUTTON_PIN 27 // زر التحكم اليدوي
#define SERVO_PIN 13 // محرك الستارة
Servo myServo;
// --- الإعدادات ---
int threshold = 2000; // قيمة الضوء الفاصلة
bool manualMode = false; // هل المستخدم ضغط الزر؟
bool isOpen = false; // حالة الستارة الحالية
void setup() {
Serial.begin(115200);
pinMode(BUTTON_PIN, INPUT_PULLUP); // الزر
myServo.attach(SERVO_PIN);
myServo.write(0); // نبدأ بإغلاق الستارة
Serial.println("النظام جاهز..");
}
void loop() {
// 1. قراءة الحساسات
int lightValue = analogRead(LDR_PIN);
bool buttonPressed = (digitalRead(BUTTON_PIN) == LOW);
// 2. التحكم اليدوي (له الأولوية كما في الصورة)
if (buttonPressed) {
manualMode = true; // تفعيل الوضع اليدوي بمجرد الضغط
isOpen = !isOpen; // اعكس الحالة (إذا فاتحة سكرها والعكس)
if (isOpen) moveServo(180, "فتح يدوي");
else moveServo(0, "إغلاق يدوي");
delay(500); // تأخير بسيط لمنع تكرار الضغطة
}
// 3. الوضع التلقائي (يعمل فقط إذا لم نضغط الزر يدويًا)
if (!manualMode) {
if (lightValue < threshold && !isOpen) {
moveServo(180, "صباح الخير - فتح تلقائي");
isOpen = true;
}
else if (lightValue >= threshold && isOpen) {
moveServo(0, "ليل هادئ - إغلاق تلقائي");
isOpen = false;
}
}
// طباعة القيمة كل ثانية للمراقبة
static unsigned long lastPrint = 0;
if (millis() - lastPrint > 1000) {
Serial.print("إضاءة الغرفة: "); Serial.println(lightValue);
lastPrint = millis();
}
}
// وظيفة تحريك المحرك مع رسالة توضيحية (تمنع الحركة الزائدة)
void moveServo(int angle, String message) {
Serial.println(">> " + message);
myServo.write(angle);
delay(1000); // وقت للمحرك لكي يصل للزاوية
}