📚 أوامر دالة loop في مشروع القفل الذكي
المفاهيم الأساسية
دالة `loop()`: الدالة الرئيسية التي يتم تنفيذ أوامرها بشكل متكرر في مشروع القفل الذكي.
خريطة المفاهيم
```markmap
تمارين برمجة C++ لإنترنت الأشياء
المشروع: إنشاء قفل باب ذكي
المكونات المستخدمة
- لوحة أردوينو أونو R3 (Arduino Uno R3)
- لوحة مفاتيح (مقياس 4x4)
#### توصيل لوحة المفاتيح
##### خطوات التوصيل
###### الصف الأول: الطرف الرقمي 9
###### الصف الثاني: الطرف الرقمي 8
###### الصف الثالث: الطرف الرقمي 7
###### الصف الرابع: الطرف الرقمي 6
- توصيل أعمدة لوحة المفاتيح
###### العمود الأول: الطرف الرقمي 5
###### العمود الثاني: الطرف الرقمي 4
###### العمود الثالث: الطرف الرقمي 3
###### العمود الرابع: الطرف الرقمي 2
##### ملاحظة
- تغيير لون جميع أسلاك التوصيل إلى الأخضر (green)
- شاشة LCD مقاس 16x2 (I2C)
#### توصيل شاشة LCD
##### خطوات التوصيل
- توصيل الطرف GND (الأرضي) لشاشة LCD بطرف GND (الأرضي) الخاص بالأردوينو (سلك أسود)
- توصيل طرف Power (الطاقة) لشاشة LCD بالطرف 5V (فولت) بالأردوينو (سلك أحمر)
- توصيل طرف SDA لشاشة LCD بطرف SDA بالأردوينو (سلك أخضر)
- توصيل طرف SCL لشاشة LCD بطرف SCL بالأردوينو (سلك أصفر)
- محرك سيرفو مصغر (Micro Servo)
#### توصيل محرك السيرفو المصغر
##### خطوات التوصيل
- توصيل الطرف GND (الأرضي) للمحرك بطرف GND (الأرضي) بالأردوينو (سلك أسود)
- توصيل طرف Power (الطاقة) للمحرك بالطرف 5V (فولت) بالأردوينو (سلك أحمر)
- توصيل طرف Signal (الإشارة) للمحرك بالطرف الرقمي 11 بالأردوينو (سلك برتقالي)
البرمجة
#### تضمين المكتبات
##### مكتبات المشروع الحالي
- للوحة LCD: #include
- للوحة المفاتيح: #include
- للمحرك المؤازر: #include
#### إنشاء الكائنات
- كائن لشاشة LCD.
- كائن للمحرك المؤازر (Servo motor).
- كائن للوحة المفاتيح.
##### كائن محرك السيرفو المصغر
###### الأمر: Servo servo;
- `Servo`: نوع الكائن.
- `servo`: اسم الكائن الفعلي المستخدم.
- لا يحتاج إلى معاملات للتهيئة.
##### كائن شاشة LCD
###### الأمر: Adafruit_LiquidCrystal lcd(0);
- `Adafruit_LiquidCrystal`: نوع الكائن.
- `lcd`: اسم الكائن.
- `(0)`: معامل التهيئة (عنوان الأردوينو الابتدائي، 0 افتراضياً).
##### كائن لوحة المفاتيح
###### تهيئة الأبعاد
- الأمر: const byte numRows = 4;
- الأمر: const byte numCols = 4;
- `numRows`: عدد الصفوف (4).
- `numCols`: عدد الأعمدة (4).
###### تحديد مصفوفة المفاتيح (keymap)
- مصفوفة ثنائية الأبعاد تحدد شكل لوحة المفاتيح.
#### دالة setup()
##### تهيئة محرك السيرفو
- `servo.attach(11);`: ربط السيرفو بالطرف 11.
- `servo.write(0);`: ضبط زاوية السيرفو على 0 درجة.
##### تهيئة شاشة LCD وتعيين كلمة المرور
- `lcd.begin(16, 2);`: تهيئة شاشة LCD ذات 16 عمود وصفين.
- `lcd.setCursor(0, 0);`: تحديد موقع الكتابة في العمود 0، الصف 0.
- `lcd.print("Set 4 character");`: طباعة "Set 4 character" على الصف الأول.
- `lcd.setCursor(0, 1);`: تحديد موقع الكتابة في العمود 0، الصف 1.
- `lcd.print("password:");`: طباعة "password:" على الصف الثاني.
##### استقبال كلمة المرور من لوحة المفاتيح
- حلقة `for` لتخزين 4 أحرف.
- `password[i] = keypad.waitForKey();`: استقبال حرف وتخزينه في مصفوفة `password`.
#### دالة loop()
##### عرض رسالة الطلب
- `lcd.clear();`: مسح شاشة LCD.
- `lcd.setCursor(0, 0);`: تحديد موقع الكتابة في العمود 0، الصف 0.
- `lcd.print("Enter password:");`: طباعة "Enter password:" على الشاشة.
##### التحقق من كلمة المرور
- إنشاء متغير منطقي `correctPass` وضبطه على `true`.
- إنشاء متغير `buttonPressed` لتخزين المفتاح المضغوط.
- استخدام حلقة `for` لفحص 4 أزرار.
- `buttonPressed = keypad.waitKey();`: انتظار ضغط مفتاح وتخزينه.
- مقارنة كل مفتاح مع الرقم المقابل في مصفوفة `password`.
- إذا كان المفتاح غير مطابق، يتم ضبط `correctPass` على `false`.
- `lcd.setCursor(i, 1);`: تحديد موقع طباعة المفتاح المضغوط على الصف الثاني.
- `lcd.print(buttonPressed);`: طباعة المفتاح المضغوط على الشاشة.
- `delay(1000);`: تأخير لمدة ثانية واحدة.
##### تنفيذ الإجراء عند صحة المرور
- إذا كان `correctPass` يساوي `true`، يتم مسح شاشة LCD باستخدام `lcd.clear();`.
```
نقاط مهمة
- وظيفة دالة `loop()` هي تنفيذ أوامر التحقق من كلمة المرور بشكل متكرر.
- يتم استخدام حلقة `for` لمقارنة 4 أزرار مضغوطة مع كلمة المرور المخزنة.
- إذا كانت جميع الأزرار صحيحة، يتم مسح الشاشة كإجراء أولي.