// مشروع الخزانة الذكية باستخدام الأردوينو
// فتح باب الخزانة تلقائياً عند اقتراب اليد باستخدام حساس Ultrasonic
// وتحريك الباب بسلاسة باستخدام محرك Servo
// إعداد المهندس / أحمد درويش
#include <Servo.h>
// تعريف منافذ حساس المسافة Ultrasonic
#define TRIG_PIN A4
#define ECHO_PIN A5
// تعريف منفذ محرك السيرفو
#define SERVO_PIN 3
// تعريف منفذ مصباح LED
#define LED_PIN 13
// تعريف زوايا السيرفو (مغلق ومفتوح)
#define CLOSED_ANGLE 0
#define OPEN_ANGLE 90 // يمكن تعديل هذه الزاوية حسب الحاجة لفتح الباب
// تعريف المسافة التي عندها تفتح الخزانة (بالسنتيمتر)
#define DISTANCE_THRESHOLD 50
Servo myServo; // إنشاء كائن سيرفو للتحكم بالمحرك
void setup() {
Serial.begin(9600); // بدء الاتصال التسلسلي لعرض البيانات
// تهيئة منافذ حساس المسافة
pinMode(TRIG_PIN, OUTPUT); // منفذ الإرسال كخرج
pinMode(ECHO_PIN, INPUT); // منفذ الاستقبال كدخل
// تهيئة منفذ LED
pinMode(LED_PIN, OUTPUT); // منفذ LED كخرج
// ربط كائن السيرفو بالمنفذ المحدد
myServo.attach(SERVO_PIN);
myServo.write(CLOSED_ANGLE); // التأكد من أن السيرفو في وضع الإغلاق عند البدء
digitalWrite(LED_PIN, LOW); // التأكد من أن LED مطفأ عند البدء
}
void loop() {
// قياس المسافة باستخدام حساس Ultrasonic
long duration, distanceCm; // متغيرات لتخزين مدة الموجة والمسافة
// إرسال نبضة قصيرة من منفذ TRIG لتشغيل الحساس
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// قياس مدة عودة الموجة من منفذ ECHO
duration = pulseIn(ECHO_PIN, HIGH);
// حساب المسافة بناءً على سرعة الصوت (340 متر/ثانية أو 0.034 سم/ميكروثانية)
distanceCm = duration * 0.034 / 2; // القسمة على 2 لأن الموجة ذهبت وعادت
Serial.print("Distance: ");
Serial.print(distanceCm);
Serial.println(" cm");
// التحقق مما إذا كانت المسافة أقل من العتبة المحددة
if (distanceCm < DISTANCE_THRESHOLD && distanceCm > 0) {
// إذا كانت اليد قريبة، افتح باب الخزانة وشغل LED
myServo.write(OPEN_ANGLE); // تحريك السيرفو لزاوية الفتح
digitalWrite(LED_PIN, HIGH); // تشغيل LED
delay(5000); // انتظر 5 ثوانٍ (يمكن تعديل المدة)
} else {
// إذا كانت اليد بعيدة، أغلق باب الخزانة وأطفئ LED
myServo.write(CLOSED_ANGLE); // تحريك السيرفو لزاوية الإغلاق
digitalWrite(LED_PIN, LOW); // إطفاء LED
}
delay(100); // تأخير قصير قبل القراءة التالية للحساس
}