#include <ESP32Servo.h>
// --- تعريف دبابيس (Pins) المحركات (L298N) ---
const int IN1 = 26;
const int IN2 = 27;
const int IN3 = 14;
const int IN4 = 12;
// --- تعريف دبابيس الحساسات والقطع ---
const int TRIG_PIN = 5;
const int ECHO_PIN = 18;
const int PIR_PIN = 19;
const int RELAY_PIN = 4; // هذا سيمثل الريلاي ومصباح الـ UV
const int SERVO_PIN = 13;
Servo myServo;
void setup() {
Serial.begin(115200);
// إعداد دبابيس المحركات كمخرجات
pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT);
// إعداد دبابيس الحساسات
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(PIR_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT); // الريلاي
// إعداد السيرفو
myServo.attach(SERVO_PIN);
myServo.write(90); // توجيه السيرفو للأمام
Serial.println("System Starting... Warming up PIR sensor");
delay(2000); // إعطاء وقت لحساس الحركة ليبدأ
}
void loop() {
// 1. قراءة حساس الحركة (الأمان أولاً)
int pirState = digitalRead(PIR_PIN);
if (pirState == HIGH) {
// تم اكتشاف إنسان! إيقاف الروبوت وإطفاء مصباح التعقيم
digitalWrite(RELAY_PIN, LOW); // إطفاء الـ UV
stopMotors();
Serial.println("⚠️ تحذير: تم اكتشاف حركة إنسان! إيقاف الروبوت ومصباح UV.");
delay(1000);
return; // إيقاف إكمال باقي الأوامر حتى يغادر الشخص
} else {
// لا يوجد أحد، الروبوت يعمل بأمان
digitalWrite(RELAY_PIN, HIGH); // تشغيل الـ UV
// 2. قراءة المسافة لتجنب العوائق
long distance = getDistance();
Serial.print("المسافة: ");
Serial.print(distance);
Serial.println(" سم");
// إذا كان هناك عائق أقرب من 25 سم
if (distance > 0 && distance < 25) {
stopMotors();
Serial.println("عائق أمامنا! جاري البحث عن مسار...");
// النظر لليسار
myServo.write(180);
delay(500);
long distLeft = getDistance();
// النظر لليمين
myServo.write(0);
delay(1000);
long distRight = getDistance();
// العودة للمنتصف
myServo.write(90);
delay(500);
// اتخاذ القرار: الاتجاه نحو المساحة الأكبر
if (distLeft > distRight) {
Serial.println("الدوران لليسار");
turnLeft();
delay(500);
} else {
Serial.println("الدوران لليمين");
turnRight();
delay(500);
}
} else {
// الطريق سالك
moveForward();
}
}
delay(100);
}
// --- دوال مساعدة ---
// دالة لقياس المسافة
long getDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH, 30000);
if (duration == 0) return 999;
return duration * 0.034 / 2;
}
// دوال الحركة
void moveForward() {
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
}
void stopMotors() {
digitalWrite(IN1, LOW); digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW); digitalWrite(IN4, LOW);
}
void turnLeft() {
digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
}
void turnRight() {
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);
}