إيقاف البرنامج Break down the Code - كتاب إنترنت الأشياء - الصف 11 - الفصل 1 - المملكة العربية السعودية

الكتاب: كتاب إنترنت الأشياء - الصف 11 - الفصل 1 | المادة: إنترنت الأشياء | المرحلة: الصف 11 | الفصل الدراسي: 1

الدولة: المملكة العربية السعودية | المنهج: المنهج السعودي - وزارة التعليم

الدرس: إيقاف البرنامج Break down the Code

📚 معلومات الصفحة

الكتاب: كتاب إنترنت الأشياء - الصف 11 - الفصل 1 | المادة: إنترنت الأشياء | المرحلة: الصف 11 | الفصل الدراسي: 1

الدولة: المملكة العربية السعودية | المنهج: المنهج السعودي - وزارة التعليم

نوع المحتوى: درس تعليمي

📝 ملخص الصفحة

📚 تحليل كود دالة setup لمشروع القفل الذكي

المفاهيم الأساسية

دالة `setup()`: تُنفذ مرة واحدة عند تشغيل الأردوينو لتهيئة المكونات.

`servo.attach(pin)`: تربط متغير محرك السيرفو بالطرف المحدد (مثال: الطرف 11).

`servo.write(value)`: تكتب قيمة (بالدرجات) لتحديد زاوية عمود محرك السيرفو وتحريكه.

`lcd.begin(cols, rows)`: تهيئ واجهة شاشة LCD وتحدد أبعادها (العرض والارتفاع).

`lcd.setCursor(col, row)`: تحدد موقع مؤشر النص على شاشة LCD (العمود، الصف).

`keypad.waitForKey()`: تستقبل المفتاح المضغوط على لوحة المفاتيح وتعيد قيمته.

خريطة المفاهيم

```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 بالأردوينو (سلك برتقالي)

البرمجة

#### تضمين المكتبات

  • الصيغة العامة: #include
##### مكتبات المشروع الحالي

  • للوحة 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`.
```

نقاط مهمة

  • دالة `setup()` تُنفذ مرة واحدة فقط عند بدء التشغيل، بينما دالة `loop()` تُنفذ باستمرار.
  • يجب استدعاء `lcd.begin()` قبل أي أمر آخر خاص بمكتبة LCD.
  • يتم استخدام `lcd.setCursor()` لتحديد موقع النص قبل طباعته على الشاشة.
  • الدالة `keypad.waitForKey()` تنتظر حتى يقوم المستخدم بالضغط على مفتاح ما.

📋 المحتوى المنظم

📖 محتوى تعليمي مفصّل

إيقاف البرنامج Break down the Code

نوع: محتوى تعليمي

إيقاف البرنامج Break down the Code

نوع: محتوى تعليمي

في هذه المرحلة يكون برنامج الإعداد قد اكتمل. وكما تم التوضيح في الدرس الأول، فإن وحدة التحكم في الأردوينو تنفذ دالة ()setup مرة واحدة فقط عند تشغيلها، ثم تنفذ دالة ()loop بصورة مستمرة. دعونا الآن نوقف البرنامج.

التعليمات البرمجية لدالة ()setup هي:

نوع: محتوى تعليمي

التعليمات البرمجية لدالة ()setup هي:

نوع: محتوى تعليمي

void setup() { //servo setup servo.attach(11); servo.write(0); //lcd setup and password set lcd.begin(16, 2); lcd.setCursor(0, 0); lcd.print("Set 4 character"); lcd.setCursor(0, 1); lcd.print("password:"); for(int i = 0; i < 4; i++) { password[i] = keypad.waitForKey(); } }

تستخدم دالتي servo من مكتبة Servo كما يلي:

نوع: محتوى تعليمي

تستخدم دالتي servo من مكتبة Servo كما يلي:

نوع: محتوى تعليمي

servo.attach(11) ترفق متغیر Servo بالطرف 11.

نوع: محتوى تعليمي

تستخدم servo.write(0) لكتابة قيمة إلى servo. في هذه الحالة تكتب القيمة 0، وتتحكم في عمود الحركة وفقًا لذلك. يحدد هذا زاوية العمود في محرك سيرفو القياسي (بالدرجات)، ثم يحرك العمود إلى هذا الاتجاه.

تستخدم بعد ذلك ثلاث دوال لمكتبة Adafruit_LiquidCrystal كالآتي:

نوع: محتوى تعليمي

تستخدم بعد ذلك ثلاث دوال لمكتبة Adafruit_LiquidCrystal كالآتي:

نوع: محتوى تعليمي

تهيئ lcd.begin(col,row) واجهة شاشة LCD، وتحدد أبعاد الشاشة (العرض والارتفاع). يجب استدعاء هذه الدالة ()begin قبل أي أوامر أخرى خاصة بمكتبة LCD. وسيطات هذه الدالة هي: cols، وهي عدد الأعمدة الموجودة في الشاشة. rows، وهي عدد الصفوف الموجودة في الشاشة. ولأن شاشة LCD المستخدمة 16x2، فيمكن إعطاء الدالة الوسيطات 16 = col و 2 = row وبالتالي تكون صياغتها (16.2) lcd.begin.

الدالة الآتية هي:

نوع: محتوى تعليمي

الدالة الآتية هي:

نوع: محتوى تعليمي

تقوم دالة lcd.setCursor(col,row) بتحديد الموقع الذي سيعرض فيه النص المكتوب على شاشة LCD. لعرض عبارة "Set 4 character password" (تعيين كلمة مرور مكونة من 4 أحرف)، فأنت بحاجة إلى كلا الصفين لشاشة LCD. ستعرض في الصف الأول عبارة "Set 4 character" وفي الصف الثاني ستعرض عبارة "password". للقيام بذلك، عليك استدعاء الدالة بالصيغة (0, 0) lcd.setCursor() قبل عرض العبارة الأولى، ثم استدعاء الدالة مرة أخرى بالصيغة (0, 1) lcd.setCursor() لعرض العبارة الثانية.

الجزء الأخير من البرمجة في دالة ()setup هو

نوع: محتوى تعليمي

الجزء الأخير من البرمجة في دالة ()setup هو

نوع: محتوى تعليمي

تستدعي الدالة ()keypad.waitForKey والتي ستتعرف على المفتاح الذي تم الضغط عليه، وتخزنه في مصفوفة password (كلمة المرور).

نوع: محتوى تعليمي

تكرار for الذي يخزن كلمة مرور تتكون من 4 أحرف يكتبها المستخدم على لوحة المفاتيح، في متغير [4]password. للقيام بذلك، تستخدم دالة مكتبة لوحة المفاتيح:

نوع: METADATA

وزارة التعليم Ministry of Education 2025 - 1447

🔍 عناصر مرئية

التعليمات البرمجية لدالة ()setup هي:

A block of C++ code for an Arduino setup function, including servo and LCD initialization, and a loop for password input.

servo.attach(11)

A blue rectangular callout box explaining the 'servo.attach(11)' line of code. An arrow points from this box to the 'servo.attach(11);' line in the main code block.

servo.write(0)

A blue rectangular callout box explaining the 'servo.write(0)' line of code. An arrow points from this box to the 'servo.write(0);' line in the main code block.

lcd.begin(col,row)

A blue rectangular callout box explaining the 'lcd.begin(col,row)' function. An arrow points from this box to the 'lcd.begin(16, 2);' line in the main code block.

lcd.setCursor(col,row)

A blue rectangular callout box explaining the 'lcd.setCursor(col,row)' function. Arrows point from this box to the 'lcd.setCursor(0, 0);' and 'lcd.setCursor(0, 1);' lines in the main code block.

keypad.waitForKey()

A blue rectangular callout box explaining the 'keypad.waitForKey()' function. An arrow points from this box to the 'password[i] = keypad.waitForKey();' line in the main code block.

📄 النص الكامل للصفحة

--- SECTION: إيقاف البرنامج Break down the Code --- إيقاف البرنامج Break down the Code في هذه المرحلة يكون برنامج الإعداد قد اكتمل. وكما تم التوضيح في الدرس الأول، فإن وحدة التحكم في الأردوينو تنفذ دالة ()setup مرة واحدة فقط عند تشغيلها، ثم تنفذ دالة ()loop بصورة مستمرة. دعونا الآن نوقف البرنامج. --- SECTION: التعليمات البرمجية لدالة ()setup هي: --- التعليمات البرمجية لدالة ()setup هي: void setup() { //servo setup servo.attach(11); servo.write(0); //lcd setup and password set lcd.begin(16, 2); lcd.setCursor(0, 0); lcd.print("Set 4 character"); lcd.setCursor(0, 1); lcd.print("password:"); for(int i = 0; i < 4; i++) { password[i] = keypad.waitForKey(); } } --- SECTION: تستخدم دالتي servo من مكتبة Servo كما يلي: --- تستخدم دالتي servo من مكتبة Servo كما يلي: servo.attach(11) ترفق متغیر Servo بالطرف 11. تستخدم servo.write(0) لكتابة قيمة إلى servo. في هذه الحالة تكتب القيمة 0، وتتحكم في عمود الحركة وفقًا لذلك. يحدد هذا زاوية العمود في محرك سيرفو القياسي (بالدرجات)، ثم يحرك العمود إلى هذا الاتجاه. --- SECTION: تستخدم بعد ذلك ثلاث دوال لمكتبة Adafruit_LiquidCrystal كالآتي: --- تستخدم بعد ذلك ثلاث دوال لمكتبة Adafruit_LiquidCrystal كالآتي: تهيئ lcd.begin(col,row) واجهة شاشة LCD، وتحدد أبعاد الشاشة (العرض والارتفاع). يجب استدعاء هذه الدالة ()begin قبل أي أوامر أخرى خاصة بمكتبة LCD. وسيطات هذه الدالة هي: cols، وهي عدد الأعمدة الموجودة في الشاشة. rows، وهي عدد الصفوف الموجودة في الشاشة. ولأن شاشة LCD المستخدمة 16x2، فيمكن إعطاء الدالة الوسيطات 16 = col و 2 = row وبالتالي تكون صياغتها (16.2) lcd.begin. --- SECTION: الدالة الآتية هي: --- الدالة الآتية هي: تقوم دالة lcd.setCursor(col,row) بتحديد الموقع الذي سيعرض فيه النص المكتوب على شاشة LCD. لعرض عبارة "Set 4 character password" (تعيين كلمة مرور مكونة من 4 أحرف)، فأنت بحاجة إلى كلا الصفين لشاشة LCD. ستعرض في الصف الأول عبارة "Set 4 character" وفي الصف الثاني ستعرض عبارة "password". للقيام بذلك، عليك استدعاء الدالة بالصيغة (0, 0) lcd.setCursor() قبل عرض العبارة الأولى، ثم استدعاء الدالة مرة أخرى بالصيغة (0, 1) lcd.setCursor() لعرض العبارة الثانية. --- SECTION: الجزء الأخير من البرمجة في دالة ()setup هو --- الجزء الأخير من البرمجة في دالة ()setup هو تستدعي الدالة ()keypad.waitForKey والتي ستتعرف على المفتاح الذي تم الضغط عليه، وتخزنه في مصفوفة password (كلمة المرور). تكرار for الذي يخزن كلمة مرور تتكون من 4 أحرف يكتبها المستخدم على لوحة المفاتيح، في متغير [4]password. للقيام بذلك، تستخدم دالة مكتبة لوحة المفاتيح: وزارة التعليم Ministry of Education 2025 - 1447 --- VISUAL CONTEXT --- **CODE_BLOCK**: التعليمات البرمجية لدالة ()setup هي: Description: A block of C++ code for an Arduino setup function, including servo and LCD initialization, and a loop for password input. Context: This code block demonstrates the setup function for an Arduino project, initializing a servo motor, an LCD screen, and handling password input from a keypad. **DIAGRAM**: servo.attach(11) Description: A blue rectangular callout box explaining the 'servo.attach(11)' line of code. An arrow points from this box to the 'servo.attach(11);' line in the main code block. Context: Explains that the 'servo.attach(11)' command connects the Servo variable to pin 11 on the Arduino. **DIAGRAM**: servo.write(0) Description: A blue rectangular callout box explaining the 'servo.write(0)' line of code. An arrow points from this box to the 'servo.write(0);' line in the main code block. Context: Explains that 'servo.write(0)' writes a value (0 in this case) to the servo, controlling its shaft angle in degrees and moving it to that direction. **DIAGRAM**: lcd.begin(col,row) Description: A blue rectangular callout box explaining the 'lcd.begin(col,row)' function. An arrow points from this box to the 'lcd.begin(16, 2);' line in the main code block. Context: Explains that 'lcd.begin(col,row)' initializes the LCD screen interface, setting its dimensions (width and height). It details the 'col' and 'row' parameters for a 16x2 LCD, leading to the example 'lcd.begin(16, 2)'. **DIAGRAM**: lcd.setCursor(col,row) Description: A blue rectangular callout box explaining the 'lcd.setCursor(col,row)' function. Arrows point from this box to the 'lcd.setCursor(0, 0);' and 'lcd.setCursor(0, 1);' lines in the main code block. Context: Explains that 'lcd.setCursor(col,row)' sets the position for text display on the LCD. It provides an example of displaying a two-line password prompt using 'lcd.setCursor(0, 0)' and 'lcd.setCursor(0, 1)'. **DIAGRAM**: keypad.waitForKey() Description: A blue rectangular callout box explaining the 'keypad.waitForKey()' function. An arrow points from this box to the 'password[i] = keypad.waitForKey();' line in the main code block. Context: Explains that the 'keypad.waitForKey()' function detects which key on the keypad was pressed and stores it in the 'password' array.

🎴 بطاقات تعليمية للمراجعة

عدد البطاقات: 5 بطاقة لهذه الصفحة

ما الغرض من دالة `servo.attach(11)` في برمجة الأردوينو باستخدام مكتبة Servo؟

  • أ) لتعيين زاوية دوران محرك السيرفو إلى 11 درجة.
  • ب) لربط متغير Servo بالطرف الرقمي 11 على لوحة الأردوينو.
  • ج) لتهيئة شاشة LCD وإرفاقها بالطرف 11.
  • د) لوقف تنفيذ البرنامج حتى يتم الضغط على مفتاح في لوحة المفاتيح.

الإجابة الصحيحة: b

الإجابة: لربط متغير Servo بالطرف الرقمي 11 على لوحة الأردوينو.

الشرح: 1. دالة `attach()` من مكتبة Servo تستخدم لتوصيل محرك السيرفو بلوحة الأردوينو. 2. الرقم الموجود بين القوسين (مثل 11) يحدد رقم الطرف الرقمي (Digital Pin) الذي سيتم توصيل إشارة التحكم بالسيرفو عليه. 3. في هذا المثال، `servo.attach(11)` تربط كائن السيرفو بالطرف رقم 11.

تلميح: تتعلق هذه الدالة بتوصيل المكون المادي (السيرفو) باللوحة.

التصنيف: تعريف | المستوى: سهل

ما وظيفة دالة `servo.write(0)` في برمجة الأردوينو؟

  • أ) تكتب القيمة 0 إلى شاشة LCD في العمود الأول.
  • ب) توقف تنفيذ دالة `loop()` مؤقتًا لمدة 0 ثانية.
  • ج) تكتب القيمة 0 إلى محرك السيرفو، مما يحرك عموده إلى الزاوية 0 درجة.
  • د) تهيئ لوحة المفاتيح للبدء في قراءة الإدخال.

الإجابة الصحيحة: c

الإجابة: تكتب القيمة 0 إلى محرك السيرفو، مما يحرك عموده إلى الزاوية 0 درجة.

الشرح: 1. دالة `write()` من مكتبة Servo ترسل إشارة إلى محرك السيرفو. 2. القيمة المرسلة (مثل 0) تمثل الزاوية المطلوبة بالدرجات لمحرك السيرفو القياسي. 3. عند تنفيذ `servo.write(0)`، يتحرك عمود (شافت) محرك السيرفو إلى الموضع المقابل للزاوية 0 درجة.

تلميح: تتحكم هذه الدالة في موضع محرك السيرفو.

التصنيف: تعريف | المستوى: سهل

ما الغرض من استدعاء الدالة `lcd.begin(16, 2)` عند استخدام شاشة LCD مع الأردوينو؟

  • أ) لبدء تشغيل محرك السيرفو المتصل بالطرفين 16 و 2.
  • ب) لتعيين مؤشر الكتابة على شاشة LCD إلى العمود 16 والصف 2.
  • ج) لتهيئة واجهة شاشة LCD وتحديد أبعادها بأنها 16 عمودًا وصفين.
  • د) لقراءة 16 حرفًا من لوحة المفاتيح وتخزينها في صفين.

الإجابة الصحيحة: c

الإجابة: لتهيئة واجهة شاشة LCD وتحديد أبعادها بأنها 16 عمودًا وصفين.

الشرح: 1. دالة `begin()` من مكتبة Adafruit_LiquidCrystal مسؤولة عن تهيئة الاتصال بين الأردوينو وشاشة LCD. 2. الوسيطتان (16 و 2) تحددان أبعاد الشاشة: عدد الأعمدة (العرض) وعدد الصفوف (الارتفاع). 3. يجب استدعاء `lcd.begin()` قبل أي أمر آخر خاص بعرض النصوص أو التحكم في الشاشة.

تلميح: هذه الدالة تحدد حجم الشاشة ويجب استدعاؤها قبل أي أوامر أخرى للـ LCD.

التصنيف: مفهوم جوهري | المستوى: متوسط

كيف تضمن عرض سطرين من النص على شاشة LCD 16x2 باستخدام دالة `lcd.setCursor()`؟

  • أ) بكتابة النص كاملاً ثم استخدام `lcd.split(2)` لتقسيمه إلى سطرين.
  • ب) باستدعاء الدالة مرة واحدة فقط: `lcd.setCursor(0, 2)`.
  • ج) باستدعاء الدالة مرتين: أولاً `lcd.setCursor(0, 0)` للصف الأول، ثم `lcd.setCursor(0, 1)` للصف الثاني.
  • د) باستخدام حلقة `for` لطباعة كل حرف في موقع عشوائي.

الإجابة الصحيحة: c

الإجابة: باستدعاء الدالة مرتين: أولاً `lcd.setCursor(0, 0)` للصف الأول، ثم `lcd.setCursor(0, 1)` للصف الثاني.

الشرح: 1. دالة `setCursor(col, row)` تحدد موقع بداية الكتابة على شاشة LCD. 2. الوسيط الأول `col` يمثل رقم العمود (يبدأ من 0). 3. الوسيط الثاني `row` يمثل رقم الصف (يبدأ من 0). 4. لعرض نص في الصف الأول (أعلى)، نستخدم `row = 0`. 5. لعرض نص في الصف الثاني (أسفل)، نستخدم `row = 1`. 6. مثال: `lcd.setCursor(0, 0)` ثم `lcd.print("السطر الأول")`، ثم `lcd.setCursor(0, 1)` ثم `lcd.print("السطر الثاني")`.

تلميح: تتحكم الدالة في موقع مؤشر الكتابة على الشاشة. الصفوف تبدأ عدها من الصفر.

التصنيف: صيغة/خطوات | المستوى: متوسط

ما الذي تقوم به الدالة `keypad.waitForKey()` في سياق برمجة لوحة المفاتيح مع الأردوينو؟

  • أ) ترسل إشارة إلى لوحة المفاتيح لإضاءة جميع المفاتيح.
  • ب) تتحقق مما إذا كانت لوحة المفاتيح متصلة بالطرف الصحيح.
  • ج) تنتظر حتى يقوم المستخدم بالضغط على مفتاح ما على لوحة المفاتيح، ثم تُرجع قيمة ذلك المفتاح.
  • د) تقرأ تلقائيًا تسلسلًا من 4 مفاتيح مخزن مسبقًا.

الإجابة الصحيحة: c

الإجابة: تنتظر حتى يقوم المستخدم بالضغط على مفتاح ما على لوحة المفاتيح، ثم تُرجع قيمة ذلك المفتاح.

الشرح: 1. دالة `waitForKey()` هي جزء من مكتبة برمجة لوحة المفاتيح (Keypad). 2. وظيفتها الأساسية هي الانتظار (Blocking) حتى يتم الضغط على أي مفتاح في لوحة المفاتيح المتصلة. 3. بمجرد الضغط على مفتاح، تقوم الدالة بإرجاع (Return) قيمة ذلك المفتاح (كحرف أو رقم) يمكن تخزينها في متغير.

تلميح: هذه الدالة توقف التنفيذ مؤقتًا بانتظار إدخال من المستخدم.

التصنيف: تعريف | المستوى: سهل