// ============================================================
// المشروع: نظام ذكي لإدارة مواقف السيارات
// الطالبة: Student 1 (تجهيز النظام الأساسي وشاشة LCD)
// التاريخ: 2026
// ============================================================
// ======== 1. المكتبات الأساسية ========
#include <Wire.h> // مكتبة I2C للتواصل مع LCD
#include <LiquidCrystal_I2C.h> // مكتبة شاشة LCD
// ======== 2. تعريف المنافذ (Pins) ========
// ملاحظة: 5V و GND على Breadboard (مشتركة للجميع)
// شاشة LCD (تستخدم I2C عبر A4 و A5 تلقائياً)
#define LCD_ADDRESS 0x27 // جربي 0x27 أو 0x3F
// Student 2 - Ultrasonic + Servo
#define TRIG_PIN 8
#define ECHO_PIN 9
#define SERVO_PIN 6
// Student 3 - RFID
#define SS_PIN 10
#define RST_PIN 5
// SCK=13, MOSI=11, MISO=12 (منافذ SPI ثابتة)
// Student 4 - IR Sensors + LEDs
#define IR_PARKING_1 2
#define IR_PARKING_2 3
#define IR_PARKING_3 4
#define IR_PARKING_4 A2
#define WARNING_LED A3 // LED تحذير
// Student 5 - LDR + MQ-2 + Buzzer
#define LDR_PIN A0
#define MQ2_PIN A1
#define BUZZER_PIN 7
// ======== 3. المتغيرات الرئيسية ========
const int TOTAL_SPOTS = 4; // عدد المواقف الكلي
int availableSpots = TOTAL_SPOTS; // المواقف المتاحة
bool parkingStatus[TOTAL_SPOTS] = {false, false, false, false}; // حالة كل موقف
// بيانات المستخدمين
String currentUserID = ""; // معرف المستخدم الحالي
int currentUserSpot = -1; // رقم موقف المستخدم
bool isUserInside = false; // هل المستخدم داخل الموقف؟
// قاعدة بيانات المستخدمين
String authorizedCards[4] = {"Card1", "Card2", "Card3", "Card4"};
String cardOwners[4] = {"User1", "User2", "User3", "User4"};
int defaultSpots[4] = {0, 1, 2, 3}; // الموقف الافتراضي لكل مستخدم
// ======== 4. إعداد شاشة LCD ========
LiquidCrystal_I2C lcd(LCD_ADDRESS, 16, 2); // شاشة 16x2
// ============================================================
// دالة الإعداد (setup)
// تعمل مرة واحدة عند تشغيل النظام
// ============================================================
void setup() {
// ---------- 4.1 تهيئة المنافذ ----------
// Student 2
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(SERVO_PIN, OUTPUT);
// Student 3 (RFID) - المنافذ الخاصة
pinMode(SS_PIN, OUTPUT);
pinMode(RST_PIN, OUTPUT);
// SPI منافذ (SCK, MOSI, MISO) تُهيأ تلقائياً
// Student 4
pinMode(IR_PARKING_1, INPUT);
pinMode(IR_PARKING_2, INPUT);
pinMode(IR_PARKING_3, INPUT);
pinMode(IR_PARKING_4, INPUT);
pinMode(WARNING_LED, OUTPUT);
// Student 5
pinMode(LDR_PIN, INPUT);
pinMode(MQ2_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
// ---------- 4.2 تشغيل شاشة LCD ----------
lcd.init(); // تهيئة الشاشة
lcd.backlight(); // تشغيل الإضاءة الخلفية
lcd.clear(); // مسح أي نص قديم
// ---------- 4.3 عرض رسالة البداية ----------
lcd.setCursor(0, 0);
lcd.print("Parking System");
lcd.setCursor(0, 1);
lcd.print("Welcome!");
delay(3000); // انتظر 3 ثواني
// ---------- 4.4 عرض الحالة الأولية ----------
updateLCD();
}
// ============================================================
// الدالة الرئيسية (loop)
// تتكرر باستمرار
// ============================================================
void loop() {
updateLCD(); // تحديث الشاشة
delay(500); // تحديث كل نصف ثانية
}
// ============================================================
// دوال مساعدة (Helper Functions)
// ============================================================
// ---------- دالة تحديث شاشة LCD ----------
void updateLCD() {
lcd.clear(); // مسح الشاشة
// السطر الأول: عدد المواقف المتاحة
lcd.setCursor(0, 0);
lcd.print("Available: ");
lcd.print(availableSpots);
lcd.print("/");
lcd.print(TOTAL_SPOTS);
// السطر الثاني: حالة النظام
lcd.setCursor(0, 1);
if (availableSpots == 0) {
lcd.print("Parking FULL!");
} else {
lcd.print("Welcome!");
}
}