#include <LiquidCrystal.h>
#include <Keypad.h>
#include <Servo.h>
/* Display */
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
/* Keypad setup */
const byte KEYPAD_ROWS = 4;
const byte KEYPAD_COLS = 4;
byte rowPins[KEYPAD_ROWS] = {5, 4, 3, 2};
byte colPins[KEYPAD_COLS] = {A3, A2, A1, A0};
char keys[KEYPAD_ROWS][KEYPAD_COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, KEYPAD_ROWS, KEYPAD_COLS);
/* Servo setup */
Servo lockServo;
const int SERVO_PIN = 6;
/* LED and Buzzer Pins */
const int RED_LED = A4; // المنفذ الموصول بـ LED الأحمر
const int GREEN_LED = A5; // المنفذ الموصول بـ LED الأخضر
const int BUZZER_PIN = 13; // المنفذ الموصول بـ Buzzer
/* Variables */
const String PASSWORD = "1234"; // الرقم السري
String inputPassword = ""; // لتخزين المدخل من لوحة المفاتيح
bool isLocked = true; // حالة القفل: true مغلق، false مفتوح
bool readyToLock = false; // حالة تأكيد الإغلاق بعد الضغط على نجمة
bool alarmActive = false; // حالة المنبه (Buzzer)
bool stopAlarmReady = false; // تجهيز إيقاف الإنذار
void showSplashScreen() {
lcd.clear();
lcd.print(" Safe Lock System");
delay(1500);
}
void updateLEDs() {
if (alarmActive) {
// تشغيل وضع الإنذار
digitalWrite(GREEN_LED, LOW); // إطفاء LED الأخضر دائمًا في وضع الإنذار
unsigned long currentMillis = millis();
if (currentMillis / 500 % 2 == 0) {
digitalWrite(RED_LED, HIGH);
} else {
digitalWrite(RED_LED, LOW);
}
} else {
// تحديث الـLED بناءً على حالة القفل
if (isLocked) {
digitalWrite(RED_LED, HIGH); // تشغيل LED الأحمر دائمًا عند الإغلاق
digitalWrite(GREEN_LED, LOW); // إطفاء LED الأخضر
} else {
digitalWrite(RED_LED, LOW); // إطفاء LED الأحمر عند الفتح
digitalWrite(GREEN_LED, HIGH); // تشغيل LED الأخضر
}
noTone(BUZZER_PIN); // تأكد من إطفاء النغمة إذا لم يكن الإنذار نشطًا
}
}
void openLock() {
lockServo.write(90); // فتح القفل
isLocked = false;
alarmActive = false; // تأكد من إطفاء الإنذار إذا كان نشطًا
updateLEDs(); // تحديث حالة الـLED
lcd.clear();
lcd.print("Access Granted");
delay(2000);
lcd.clear();
lcd.print("Locker Open");
}
void closeLock() {
lockServo.write(0); // إغلاق القفل
isLocked = true;
updateLEDs(); // تحديث حالة الـLED
lcd.clear();
lcd.print("Locker Closed");
delay(2000);
lcd.clear();
lcd.print("Enter Password");
}
void activateAlarm() {
alarmActive = true; // تفعيل الإنذار
stopAlarmReady = false; // إعادة ضبط حالة الإيقاف
lcd.clear();
lcd.print("Wrong Password!");
// إصدار نغمة الإنذار
unsigned long startTime = millis();
while (alarmActive && (millis() - startTime < 3000)) { // تشغيل الإنذار لمدة 3 ثوانٍ
tone(BUZZER_PIN, 1000); // تردد 1000 هرتز
digitalWrite(RED_LED, HIGH);
delay(200); // تشغيل النغمة والـLED
noTone(BUZZER_PIN);
digitalWrite(RED_LED, LOW);
delay(200); // إيقاف النغمة والـLED
}
noTone(BUZZER_PIN); // تأكد من إطفاء النغمة بعد انتهاء الإنذار
alarmActive = false;
lcd.clear();
lcd.print("Enter Password");
}
void stopAlarm() {
alarmActive = false; // إطفاء الإنذار
noTone(BUZZER_PIN); // إيقاف النغمة
updateLEDs(); // تحديث حالة الـLED
lcd.clear();
lcd.print("Alarm Stopped");
delay(2000);
lcd.clear();
lcd.print("Enter Password");
}
void setup() {
lcd.begin(16, 2);
lockServo.attach(SERVO_PIN);
lockServo.write(0); // بدء القفل مغلقًا
pinMode(RED_LED, OUTPUT); // تهيئة LED الأحمر كمخرج
pinMode(GREEN_LED, OUTPUT); // تهيئة LED الأخضر كمخرج
pinMode(BUZZER_PIN, OUTPUT); // تهيئة الـBuzzer كمخرج
noTone(BUZZER_PIN); // تأكد من إطفاء الـBuzzer عند البداية
updateLEDs(); // تحديث حالة الـLED عند البداية
showSplashScreen();
lcd.clear();
lcd.print("Enter Password");
}
void loop() {
char key = keypad.getKey();
if (key) {
if (key == '#') {
if (stopAlarmReady && alarmActive) { // إيقاف الإنذار
stopAlarm();
} else if (inputPassword == PASSWORD && isLocked) { // فتح القفل
openLock();
} else if (readyToLock && !isLocked) { // إغلاق القفل
closeLock();
} else if (inputPassword != PASSWORD && inputPassword.length() > 0) { // إصدار إنذار عند إدخال رقم خاطئ
activateAlarm();
}
inputPassword = ""; // إعادة ضبط الإدخال
} else if (key == '*') {
if (!isLocked) {
readyToLock = true; // تجهيز الإغلاق
lcd.clear();
lcd.print("Press # to Lock");
}
} else if (key == 'A') {
stopAlarmReady = true; // تجهيز إيقاف الإنذار
lcd.clear();
lcd.print("Press # to Stop");
} else {
// تخزين المدخلات وعرضها على الشاشة
inputPassword += key;
lcd.setCursor(inputPassword.length() - 1, 1);
lcd.print('*'); // عرض نجوم بدلًا من الرقم الحقيقي
}
}
updateLEDs(); // تحديث الـLEDs في كل دورة
}