📝 ملخص الصفحة
📚 البرنامج الكامل لمشروع القفل الذكي
المفاهيم الأساسية
البرنامج الكامل: الكود النهائي بلغة C++ لمشروع القفل الذكي، والذي يتضمن مكتبات التحكم بالشاشة (LCD) ولوحة المفاتيح (Keypad) ومحرك السيرفو (Servo).
خريطة المفاهيم
```markmap
تمارين برمجة C++ لإنترنت الأشياء
المشروع: إنشاء قفل باب ذكي
البرمجة
#### دالة loop()
##### التحقق من كلمة المرور
###### آلية المقارنة
- مقارنة كل مفتاح مضغوط مع الرقم المقابل في مصفوفة `password` بالتتابع.
- مثال: كلمة مرور مضبوطة "5456" وكلمة مدخلة "5453".
- 5 مقارنة مع 5 (صحيحة)
- 4 مقارنة مع 4 (صحيحة)
- 5 مقارنة مع 5 (صحيحة)
- 3 مقارنة مع 6 (خاطئة) ← كلمة المرور بأكملها خاطئة.
###### استخدام متغير منطقي (Boolean)
- `bool correctPass = true;`: يتم تهيئته على `true`.
- عند اكتشاف أي مفتاح خاطئ، تتغير قيمته إلى `false`.
- بعد انتهاء المقارنة، تشير القيمة `true` إلى صحة المرور، و`false` إلى خطئه.
###### تنفيذ الدالة (مثال كود)
- `for (int i = 0; i < 4; i++) {`
- `buttonPressed = keypad.waitKeyFor();`
- `if(password[i] != buttonPressed){ correctPass = false; }`
- `lcd.setCursor(i, 1);`
- `lcd.print(buttonPressed);`
##### تنفيذ فتح/غلق القفل
###### إذا كانت كلمة المرور صحيحة
- مسح شاشة LCD.
- طباعة رسالة "Correct password!" و "Unlocking...".
- تدوير محرك السيرفو إلى زاوية 180 درجة لفتح القفل.
- الانتظار لمدة 5 ثوانٍ.
- إعادة تدوير محرك السيرفو إلى زاوية 0 درجة لإغلاق القفل.
###### إذا كانت كلمة المرور خاطئة
- مسح شاشة LCD.
- طباعة رسالة "Wrong password!".
#### الإعدادات الأولية (Setup)
##### تضمين المكتبات
- `#include `: مكتبة التحكم بشاشة LCD.
- `#include `: مكتبة التعامل مع لوحة المفاتيح.
- `#include `: مكتبة التحكم بمحرك السيرفو.
##### تعريف المتغيرات والكائنات
- `Adafruit_LiquidCrystal lcd(0);`: إنشاء كائن للتحكم بشاشة LCD.
- `Servo servo;`: إنشاء كائن للتحكم بمحرك السيرفو.
- `const byte numRows = 4;`: عدد صفوف لوحة المفاتيح.
- `const byte numCols = 4;`: عدد أعمدة لوحة المفاتيح.
##### تعيين خرائط المفاتيح والتوصيلات
- `char keymap[numRows][numCols]`: مصفوفة تحدد شكل المفاتيح على اللوحة (من 1 إلى D).
- `byte rowPins[numRows] = {9,8,7,6};`: تحديد منافذ الأردوينو المتصلة بصفوف اللوحة.
- `byte colPins[numCols] = {5,4,3,2};`: تحديد منافذ الأردوينو المتصلة بأعمدة اللوحة.
- `Keypad keypad = Keypad(...);`: تهيئة كائن لوحة المفاتيح باستخدام الخريطة والتوصيلات المحددة.
```
نقاط مهمة
- الصفحة تقدم الكود الكامل النهائي لمشروع القفل الذكي.
- يبدأ الكود بتضمين المكتبات الأساسية اللازمة للتحكم بمكونات المشروع (LCD، Keypad، Servo).
- يتم تعريف خرائط المفاتيح وتوصيلاتها المادية بالأردوينو بشكل واضح في الكود.
- يجب اختيار وضع البرمجة "نص" (Text) في محرر التعليمات البرمجية عند كتابة هذا الكود.
📋 المحتوى المنظم
📖 محتوى تعليمي مفصّل
نوع: محتوى تعليمي
ختامًا، سيبدو البرنامج بأكمله لمشروع القفل الذكي كالآتي:
البرنامج بأكمله Complete Code
نوع: محتوى تعليمي
البرنامج بأكمله Complete Code
نوع: محتوى تعليمي
// C++ code
//
#include <Adafruit_LiquidCrystal.h>
#include <Keypad.h>
#include <Servo.h>
نوع: NON_EDUCATIONAL
اختر وضع البرمجة نص (Text) في محرر التعليمات البرمجية.
نوع: محتوى تعليمي
Adafruit_LiquidCrystal lcd(0);
Servo servo;
نوع: محتوى تعليمي
const byte numRows = 4; //number of rows on the keypad
const byte numCols = 4; //number of columns on the keypad
نوع: محتوى تعليمي
// keymap defines the key pressed according to the rows and columns just as they
// appear on the //keypad
char keymap[numRows][numCols] =
{
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
نوع: محتوى تعليمي
// Code that shows the the keypad connections to the arduino terminals
byte rowPins[numRows] = {9,8,7,6}; //Rows 0 to 3
byte colPins[numCols] = {5,4,3,2}; //Columns 0 to 3
نوع: محتوى تعليمي
// initializes an instance of the Keypad class
Keypad keypad = Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols);
نوع: METADATA
وزارة التعليم
Ministry of Education
2025 - 1447
نوع: METADATA
254
📄 النص الكامل للصفحة
ختامًا، سيبدو البرنامج بأكمله لمشروع القفل الذكي كالآتي:
--- SECTION: البرنامج بأكمله Complete Code ---
البرنامج بأكمله Complete Code
// C++ code
//
#include <Adafruit_LiquidCrystal.h>
#include <Keypad.h>
#include <Servo.h>
اختر وضع البرمجة نص (Text) في محرر التعليمات البرمجية.
Adafruit_LiquidCrystal lcd(0);
Servo servo;
const byte numRows = 4; //number of rows on the keypad
const byte numCols = 4; //number of columns on the keypad
// keymap defines the key pressed according to the rows and columns just as they
// appear on the //keypad
char keymap[numRows][numCols] =
{
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
// Code that shows the the keypad connections to the arduino terminals
byte rowPins[numRows] = {9,8,7,6}; //Rows 0 to 3
byte colPins[numCols] = {5,4,3,2}; //Columns 0 to 3
// initializes an instance of the Keypad class
Keypad keypad = Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols);
وزارة التعليم
Ministry of Education
2025 - 1447
254
🎴 بطاقات تعليمية للمراجعة
عدد البطاقات: 3 بطاقة لهذه الصفحة
في برمجة لوحة المفاتيح (Keypad) باستخدام مكتبة Keypad.h، ما الغرض من المصفوفة ثنائية الأبعاد `keymap`؟
- أ) تخزين حالة كل زر (مضغوط أو غير مضغوط) في الذاكرة.
- ب) تحديد عدد الصفوف والأعمدة في لوحة المفاتيح فقط.
- ج) تحديد الرمز (الحرف) الذي يتم ضغطه وفقاً لموقع الصف والعمود على لوحة المفاتيح كما تظهر عليها.
- د) تحديد أرقام المنافذ (Pins) في الأردوينو المتصلة بلوحة المفاتيح.
الإجابة الصحيحة: c
الإجابة: تحديد الرمز (الحرف) الذي يتم ضغطه وفقاً لموقع الصف والعمود على لوحة المفاتيح كما تظهر عليها.
الشرح: 1. تُستخدم مصفوفة `keymap` لتعيين الرموز (مثل '1', '2', 'A', '#') إلى مواقع محددة على لوحة المفاتيح.
2. يتم تعريفها كصفيف ثنائي الأبعاد بحيث يتوافق الصف الأول والعمود الأول مع الزر الأول في الزاوية العلوية اليسرى.
3. عند الضغط على زر، يبحث البرنامج في هذه المصفوفة باستخدام مؤشرات الصف والعمود لاسترجاع الحرف المقابل.
تلميح: هذه المصفوفة تربط بين الأزرار الفعلية على اللوحة والقيم التي يقرأها البرنامج.
التصنيف: مفهوم جوهري | المستوى: متوسط
في الكود الموضح لبرمجة القفل الذكي، ما الغرض من المصفوفتين `rowPins` و `colPins`؟
- أ) تحديد عدد الصفوف والأعمدة التي يجب على البرنامج مسحها.
- ب) تخزين الرموز المقابلة للأزرار المضغوطة.
- ج) تحديد أرقام المنافذ (Pins) في الأردوينو المتصلة بصفوف وأعمدة لوحة المفاتيح على التوالي.
- د) تحديد سرعة مسح لوحة المفاتيح.
الإجابة الصحيحة: c
الإجابة: تحديد أرقام المنافذ (Pins) في الأردوينو المتصلة بصفوف وأعمدة لوحة المفاتيح على التوالي.
الشرح: 1. تُستخدم `rowPins` لتخزين أرقام المنافذ الرقمية في الأردوينو المتصلة بأسلاك الصفوف الأربعة للوحة المفاتيح.
2. تُستخدم `colPins` لتخزين أرقام المنافذ الرقمية في الأردوينو المتصلة بأسلاك الأعمدة الأربعة للوحة المفاتيح.
3. هذه المعلومات ضرورية لمكتبة Keypad لمسح (Scan) اللوحة والكشف عن الضغطات.
تلميح: هذه المصفوفات تحدد الروابط المادية (الأسلاك) بين الأردوينو ومكون الإدخال.
التصنيف: مفهوم جوهري | المستوى: متوسط
ما هي الخطوة الأولى في تهيئة كائن من فئة `Keypad` في الكود الموضح؟
- أ) تحديد حجم المصفوفتين `rowPins` و `colPins`.
- ب) استدعاء الدالة `makeKeymap()` لإنشاء خريطة المفاتيح من المصفوفة `keymap`.
- ج) تعريف المتغيرات `numRows` و `numCols`.
- د) توصيل لوحة المفاتيح فعلياً بمنافذ الأردوينو.
الإجابة الصحيحة: b
الإجابة: استدعاء الدالة `makeKeymap()` لإنشاء خريطة المفاتيح من المصفوفة `keymap`.
الشرح: 1. لإنشاء كائن (instance) من فئة `Keypad`، يجب استدعاء مُنشئها (constructor).
2. أول معامل مُمرر هو نتيجة استدعاء الدالة `makeKeymap(keymap)`.
3. تقوم `makeKeymap()` بتحويل المصفوفة `keymap` إلى تنسيق تفهمه مكتبة Keypad.
4. المعاملات التالية هي `rowPins`, `colPins`, `numRows`, `numCols`.
تلميح: انظر إلى السطر الذي يبدأ بـ `Keypad keypad = Keypad(...`. ما هو أول معامل (argument) يتم تمريره؟
التصنيف: صيغة/خطوات | المستوى: صعب