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

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

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

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

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

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

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

📝 ملخص الصفحة

📚 البرنامج الرئيسي (استكمال)

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

الحلقة الرئيسية (Main Loop): جزء من الكود البرمجي ينفذ بشكل متكرر لقراءة المستشعرات ومعالجة البيانات واتخاذ القرارات.

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

```markmap

7. الرسائل في إنترنت الأشياء

تصميم وبرمجة جهاز ذكي (صفحة 273)

مشروع: إدارة النفايات الذكية

#### المشكلة: اكتظاظ سكاني يؤدي لتراكم النفايات

#### الحل: استخدام حاويات نفايات ذكية

##### ترسل تنبيه عند الامتلاء

##### تحلل البيانات لتحسين العملية

#### التنفيذ: نموذج أولي لحاوية ذكية

##### يحسب متوسط مرات الاستخدام للوصول للسعة الكاملة

##### يرسل رسالة إلى وسيط (MQTT) عند كل استخدام

##### يرسل رسالة عند الامتلاء إلى متحكم النظام

#### التقنيات المستخدمة

##### متحكم أردوينو (Arduino)

##### برمجة باستخدام بروتوكول Firmata ولغة بايثون

##### منصة MQTT (مثل EMQX) لتوزيع الرسائل

مكونات وأدوات المشروع (صفحة 274)

الترانزستور الضوئي (Phototransistor)

#### الوظيفة: كشف الضوء وتحويله لإشارات كهربائية

#### الرمز التخطيطي: رمز ترانزستور مع سهمين باتجاه القاعدة

#### المظهر الفعلي: جسم بلاستيكي صغير بثلاثة أطراف ونافذة شفافة

مستشعر الإمالة (Tilt Sensor)

#### الوظيفة: قياس درجة الميل بالنسبة للجاذبية

#### الرمز التخطيطي: دائرة تحتوي على دوائر صغيرة تمثل آلية الكرة أو الزئبق

#### المظهر الفعلي: مكون مستطيل أسود بثلاثة أطراف

النموذج الأولي باستخدام الأردوينو (صفحة 275)

آلية عمل النموذج

#### مستشعر الإمالة: يسجل حدث الفتح/الإمالة في كل مرة.

#### الترانزستور الضوئي: يعمل كمستشعر عند الوصول إلى حد معين (يعني أن الحاوية مليئة).

المكونات المطلوبة

#### لوحة أردوينو أونو R3

#### لوحة توصيل الدوائر الصغيرة (Breadboard)

#### ترانزستور ضوئي

#### مستشعر إمالة

#### مقاومتان (1 كيلو أوم)

الاتصال ببسيط EMXQ العام (صفحة 276)

خطوات التثبيت والاتصال

#### 1. تثبيت تطبيق MQTTX

##### زيارة موقع: https://mqttx.app/

##### تنزيل أحدث إصدار وتشغيل المثبت

#### 2. تكوين الاتصال بالوسيط (EMQX)

##### فتح تطبيق MQTTX وإنشاء اتصال جديد

##### إدخال بيانات الاتصال:

###### الاسم (Name): مثال: desktop_connection

###### المضيف (Host): mqtt://broker.emqx.io

###### المنفذ (Port): 1883

دائرة الأردوينو (صفحة 277)

تثبيت المكونات

#### 1. لوحة أردوينو أونو R3

#### 2. لوحة توصيل الدوائر الصغيرة (Breadboard)

#### 3. مستشعر الضوء (Phototransistor)

#### 4. مستشعر الإمالة بأربعة أطراف (4-pin Tilt Sensor)

#### 5. مقاومتان (Resistor)

توصيل المكونات (صفحة 278)

توصيل الترانزستور الضوئي

#### 1. الباعث (Emitter) → الطرف التناظري A0 (سلك أصفر)

#### 2. المقاومة: طرف مع الباعث، والطرف الآخر → العمود السالب للوحة

#### 3. 5V من الأردوينو → المقاومة الموجبة للوحة (سلك أحمر)

#### 4. GND من الأردوينو → العمود السالب للوحة (سلك أسود)

#### 5. المجمع (Collector) → العمود الموجب للوحة

توصيل مستشعر الإمالة

#### 1. المقاومة الثانية → الطرف الثاني للمستشعر

#### 2. الطرف الثاني للمستشعر → الطرف الرقمي 3 للأردوينو (سلك أحمر)

#### 3. الطرف الرابع للمستشعر → العمود الموجب للوحة (سلك أحمر)

#### 4. المقاومة: طرف → العمود السالب للوحة (سلك أسود)

الدائرة بشكلها النهائي (صفحة 279)

الشكل النهائي للدائرة

#### شكل 7.16: مخطط تخطيطي للدائرة الكاملة

##### يوضح لوحة أردوينو أونو متصلة بلوحة توصيل

##### يظهر المكونات: مقاومة، LED، ترانزستور

##### يظهر أسلاك التوصيل (أحمر، أصفر، أخضر، أسود، برتقالي)

#### شكل 7.17: صورة فعلية للدائرة

##### تمثل الشكل الحقيقي للدائرة عند بنائها

##### تظهر المكونات نفسها في الواقع

#### شكل 7.18: توصيل الأطراف بالمكونات

##### يوضح كيفية توصيل مكونات محددة بأطراف الأردوينو

##### يظهر مكونًا مربعًا أسود

##### يظهر مكونًا دائريًا موصولًا بالطرف D3

##### يظهر مكونًا دائريًا موصولًا بالطرف A0

برمجة الأردوينو (صفحة 280)

إعداد بيئة البرمجة

#### 1. تشغيل بروتوكول StandardFirmata على الأردوينو

#### 2. تثبيت حزمة paho-mqtt في بايثون

##### الأمر: pip install paho-mqtt

#### 3. إنشاء ملف بايثون جديد (mqtt_arduino.py)

#### 4. استيراد المكتبات المطلوبة

##### datetime: لإنشاء طوابع زمنية

##### time: للتحكم في سير البرنامج

##### json: للعمل مع كائنات JSON

##### pyfirmata: للتواصل مع الأردوينو

##### paho.mqtt.client: لإنشاء عميل MQTT

#### 5. تعريف متغيرات عميل MQTT

##### CLIENT_ID: معرف العميل (مثال: "PUBLISHER_01")

##### MQTT_BROKER: عنوان الوسيط (مثال: "broker.emqx.io")

##### TOPIC: اسم الموضوع (مثال: "waste/drops")

##### PORT: منفذ الخادم الافتراضي (1883)

##### FLAG_CONNECTED: متغير إشارة للاتصال

تهيئة الاتصال وبرمجة المتغيرات (صفحة 281)

تهيئة الاتصال بالأردوينو

#### استخدام مكتبة pyfirmata للاتصال عبر منفذ معين (مثل COM4)

#### تحديد أطراف المستشعرات:

##### مستشعر الإضاءة: الطرف التناظري A0

##### مستشعر الإمالة: الطرف الرقمي 3

إنشاء متغيرات المشروع

#### can_full: متغير منطقي (True/False) يحدد ما إذا كانت الحاوية ممتلئة.

#### garbage_drops: عداد لتتبع عدد مرات الاستخدام (الإمالة).

إنشاء دالة لإعادة التعيين

#### reset_can(): تعيد تعيين متغيري can_full و garbage_drops إلى القيم الافتراضية عند امتلاء الحاوية.

إنشاء رسالة JSON (صفحة 282)

خطوات إنشاء الدالة publish_message()

#### 1. إنشاء متغير timestamp بتنسيق الوقت (مثال: "%H:%M:%S")

#### 2. إنشاء كائن قاموس (Dictionary) يحتوي على:

##### timestamp

##### garbage_drops

##### can_full

#### 3. تحويل القاموس إلى كائن JSON باستخدام json.dumps()

#### 4. نشر الرسالة إلى الموضوع المشترك (مثال: "waste/drops") عبر client.publish()

#### 5. التعامل مع الأخطاء المحتملة أثناء النشر

الاتصال بـ MQTT (صفحة 282)

إنشاء دالة معالج الأحداث on_connect()

#### الوظيفة: إرسال رسالة تأكيد إلى الواجهة الطرفية (Terminal) حول نجاح الاتصال أو فشله.

#### الوسيط rc: يرسل من خلال مكتبة paho ليعرض حالة الاتصال.

##### إذا كان rc == 0: الاتصال ناجح.

##### إذا كان rc != 0: الاتصال فاشل.

البرنامج الرئيسي (صفحة 283)

تهيئة عميل MQTT والاشتراك

#### تهيئة عميل MQTT باستخدام معرف العميل (CLIENT_ID).

#### ربط معالج الأحداث on_connect.

#### الاتصال بالوسيط (MQTT_BROKER) على المنفذ المحدد (PORT).

#### الاشتراك في الموضوع المحدد (TOPIC).

التكرار الرئيسي للبرنامج

#### قراءة قيم المستشعرات (light_value, tilt_value) بشكل مستمر.

#### طباعة القيم المقروءة وعداد القمامة (garbage_drops).

#### زيادة العداد (garbage_drops) عند حدوث إمالة (tilt_value == True).

#### إذا حدثت إمالة وكانت الحاوية ممتلئة (light_value <= 0.200):

##### تعيين can_full = True.

##### نشر رسالة عبر publish_message().

##### إعادة تعيين الحاوية عبر reset_can().

##### نشر رسالة أخرى.

#### الانتظار لمدة ثانية (time.sleep(1)) قبل التكرار التالي.

البرنامج بشكله النهائي (صفحة 284)

الكود الكامل

#### استيراد المكتبات:

##### datetime, time, json, pyfirmata, paho.mqtt.client

#### تعريف متغيرات عميل MQTT:

##### CLIENT_ID, MQTT_BROKER, TOPIC, PORT, FLAG_CONNECTED

#### تهيئة الاتصال بالأردوينو:

##### تحديد منفذ الاتصال (مثل 'COM4')

##### بدء مكرر (Iterator) للوحة

#### تحديد أطراف المستشعرات:

##### light_sensor_pin: الطرف التناظري A0

##### tilt_sensor_pin: الطرف الرقمي 3

#### تعريف متغيرات المشروع:

##### can_full: حالة امتلاء الحاوية

##### garbage_drops: عداد مرات الاستخدام

#### تعريف دالة reset_can():

##### إعادة تعيين garbage_drops = 0

##### إعادة تعيين can_full = False

الكود البرمجي (صفحة 285)

دالة publish_message()

#### الوظيفة: إنشاء ونشر رسالة JSON إلى وسيط MQTT.

#### الخطوات:

##### إنشاء طابع زمني (timestamp) بتنسيق "YYYY-MM-DD HH:MM:SS".

##### إنشاء قاموس يحتوي على: timestamp, garbage_drops, can_full.

##### تحويل القاموس إلى سلسلة JSON.

##### محاولة نشر الرسالة إلى الموضوع (TOPIC) باستخدام client.publish().

##### التعامل مع الأخطاء أثناء النشر.

##### الانتظار لمدة ثانيتين (time.sleep(2)) وطباعة تأكيد الإرسال.

دالة on_connect()

#### الوظيفة: معالج حدث الاتصال بوسيط MQTT.

#### آلية العمل:

##### تستقبل معامل rc الذي يمثل رمز النتيجة.

##### إذا كان rc == 0: الاتصال ناجح، يتم تعيين FLAG_CONNECTED = True.

##### إذا كان rc != 0: الاتصال فاشل.

البرنامج الرئيسي (صفحة 286)

الحلقة الرئيسية (Main Loop)

#### تهيئة عميل MQTT والاشتراك

##### client = mq.Client(CLIENT_ID)

##### client.on_connect = on_connect

##### client.connect(MQTT_BROKER, PORT)

##### client.subscribe(TOPIC, 0)

#### التكرار المستمر (while True)

##### قراءة قيم المستشعرات:

###### light_value = light_sensor_pin.read()

###### tilt_value = tilt_sensor_pin.read()

##### طباعة القيم إذا كانت موجودة.

##### زيادة عداد القمامة (garbage_drops) عند حدوث إمالة (tilt_value == True).

##### التحقق من امتلاء الحاوية (light_value <= 0.200):

###### إذا كانت ممتلئة:

####### تعيين can_full = True.

####### نشر رسالة.

####### إعادة تعيين الحاوية (reset_can()).

##### نشر رسالة في كل تكرار.

##### الانتظار ثانية واحدة (time.sleep(1)).

```

نقاط مهمة

  • الحلقة الرئيسية `while True` تجعل البرنامج يعمل بشكل مستمر.
  • يتم قراءة قيم المستشعرات (`light_value`, `tilt_value`) في كل تكرار.
  • يتم زيادة عداد `garbage_drops` فقط عندما تكون قيمة `tilt_value` تساوي `True` (أي حدثت إمالة).
  • شرط امتلاء الحاوية هو `light_value <= 0.200`، وعند تحققه يتم نشر رسالة وإعادة تعيين الحاوية.
  • يتم نشر رسالة في نهاية كل تكرار بغض النظر عن الحالة.

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

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

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

client = mq.Client(CLIENT_ID) # Initialize an MQTT client client.on_connect = on_connect # Bind the on_connect event handler client.connect(MQTT_BROKER, PORT) # Connect to the specified MQTT broker client.subscribe(TOPIC, 0) # Subscribe to the specified topic while True: # Get sensor values light_value = light_sensor_pin.read() tilt_value = tilt_sensor_pin.read() if (light_value is not None) and (tilt_value is not None): print("Light levels : " + str(light_value)) print("Tilt levels : " + str(tilt_value)) print("Garbage drops : " + str(garbage_drops)) # If there is a tilt, add 1 to the counter if (tilt_value == True): garbage_drops += 1 # If there is a tilt and the can is filled # publish a message and reset the can if (light_value <= 0.200): can_full = True publish_message() reset_can() publish_message() time.sleep(1)

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

client = mq.Client(CLIENT_ID) # Initialize an MQTT client client.on_connect = on_connect # Bind the on_connect event handler client.connect(MQTT_BROKER, PORT) # Connect to the specified MQTT broker client.subscribe(TOPIC, 0) # Subscribe to the specified topic while True: # Get sensor values light_value = light_sensor_pin.read() tilt_value = tilt_sensor_pin.read() if (light_value is not None) and (tilt_value is not None): print("Light levels : " + str(light_value)) print("Tilt levels : " + str(tilt_value)) print("Garbage drops : " + str(garbage_drops)) # If there is a tilt, add 1 to the counter if (tilt_value == True): garbage_drops += 1 # If there is a tilt and the can is filled # publish a message and reset the can if (light_value <= 0.200): can_full = True publish_message() reset_can() publish_message() time.sleep(1)

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

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

في الكود البرمجي المذكور، ما الإجراء الذي يتم تنفيذه عند اكتشاف ميل في سلة المهملات (tilt_value == True)؟

  • أ) يتم نشر رسالة فورية عبر الـ MQTT.
  • ب) يتم إعادة ضبط السلة (reset_can) تلقائياً.
  • ج) يتم زيادة عداد القمامة (garbage_drops) بمقدار 1.
  • د) يتم إيقاف تشغيل جميع المستشعرات.

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

الإجابة: يتم زيادة عداد القمامة (garbage_drops) بمقدار 1.

الشرح: 1. يقرأ البرنامج قيمة مستشعر الميل (tilt_value). 2. إذا كانت القيمة تساوي `True`، فهذا يعني أن السلة قد مالت (تم إلقاء نفايات). 3. عند تحقق هذا الشرط، يتم زيادة قيمة المتغير `garbage_drops` (عداد القمامة) بمقدار 1 لتسجيل الحادثة.

تلميح: ما المتغير الذي يتغير قيمته عند حدوث الميل؟

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

في برنامج مراقبة سلة المهملات باستخدام إنترنت الأشياء، ما الشرط الذي يؤدي إلى نشر رسالة (publish) وإعادة ضبط السلة (reset_can)؟

  • أ) عندما تكون قيمة مستشعر الميل (tilt_value) تساوي `True`.
  • ب) عندما تكون قيمة مستشعر الضوء (light_value) أكبر من 0.200.
  • ج) عندما تكون قيمة مستشعر الضوء (light_value) أقل من أو تساوي 0.200.
  • د) عندما يصل عداد القمامة (garbage_drops) إلى قيمة 10.

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

الإجابة: عندما تكون قيمة مستشعر الضوء (light_value) أقل من أو تساوي 0.200.

الشرح: 1. يقرأ البرنامج قيمة مستشعر الضوء (light_value). 2. إذا كانت القيمة أقل من أو تساوي 0.200، فهذا يعني أن مستوى الضوء منخفض جداً، مما يشير إلى امتلاء السلة. 3. عند تحقق هذا الشرط، يتم تعيين متغير `can_full` إلى `True`، ثم استدعاء دالة `publish_message()` لإرسال رسالة، ودالة `reset_can()` لإعادة ضبط عداد السلة.

تلميح: فكر في الشرط الذي يحدد أن السلة ممتلئة.

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

ما الغرض من استدعاء الدالة `publish_message()` في نهاية حلقة `while True` في الكود البرمجي؟

  • أ) لإعادة تشغيل اتصال العميل MQTT بالوسيط (broker).
  • ب) لطباعة بيانات المستشعرات على شاشة وحدة التحكم فقط.
  • ج) لإعادة ضبط عداد القمامة (garbage_drops) إلى الصفر.
  • د) لنشر بيانات المستشعرات بشكل دوري إلى الوسيط (broker) MQTT.

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

الإجابة: لنشر بيانات المستشعرات بشكل دوري إلى الوسيط (broker) MQTT.

الشرح: 1. تقوم حلقة `while True` بتشغيل البرنامج بشكل مستمر. 2. في نهاية كل تكرار للحلقة (بعد قراءة المستشعرات ومعالجة الشروط)، يتم استدعاء `publish_message()`. 3. تهدف هذه الدالة إلى إرسال القراءات الحالية من المستشعرات (مثل `light_value`, `tilt_value`, `garbage_drops`) إلى الوسيط MQTT الذي اشترك فيه العميل مسبقاً، مما يسمح للأنظمة الأخرى بالاطلاع على البيانات.

تلميح: فكر في وظيفة الـ MQTT في إنترنت الأشياء لنقل البيانات.

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