📚 تحديد المفاتيح وتوصيلها
المفاهيم الأساسية
مصفوفة `keymap`: مصفوفة ثنائية الأبعاد تحدد المفتاح المضغوط وفقًا لموقعه (الصف والعمود) على لوحة المفاتيح، تمامًا كما يظهر عليها.
كائن `Keypad`: كائن يتم إنشاؤه عن طريق استدعاء مُنشئه وتزويده بالوسائط اللازمة (مثل `keymap`، `rowPins`، `colPins`، `numRows`، `numCols`) للتحكم في لوحة المفاتيح.
متغير `password`: متغير من نوع مصفوفة أحرف (`char`) لتخزين كلمة مرور القفل، وهي عبارة عن مجموعة من الأحرف بطول 4.
خريطة المفاهيم
```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)
- مصفوفة ثنائية الأبعاد تحدد شكل لوحة المفاتيح.
```cpp
char keymap[numRows][numCols] =
{
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
```
###### تحديد توصيلات الأطراف (Pins)
```cpp
byte rowPins[numRows] = {9,8,7,6}; //Rows 0 to 3
byte colPins[numCols] = {5,4,3,2}; //Columns 0 to 3
```
###### إنشاء كائن Keypad
```cpp
Keypad keypad = Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols);
```
###### تعريف كلمة المرور
```cpp
char password[4];
```
##### ملاحظة
- قد يتطلب إنشاء الكائن تمرير وسائط إلى المُنشئ (Constructor) لتهيئتها.
```
نقاط مهمة
- يتم إنشاء مصفوفة `keymap` باستخدام الثوابت `numRows` و `numCols` التي تم تعريفها مسبقًا.
- يتم تحديد توصيلات لوحة المفاتيح بالأردوينو عبر مصفوفتي `rowPins` و `colPins`.
- يتم إنشاء كائن `Keypad` عن طريق استدعاء مُنشئه وتزويده بجميع الوسائط اللازمة.
- يتم تعريف متغير `password` كمصفوفة أحرف لتخزين كلمة مرور مكونة من 4 أحرف.