📚 إنشاء حل ذكي لإدارة النفايات
المفاهيم الأساسية
تحليل البيانات: العملية التي يتم فيها جمع البيانات من نظام ذكي (مثل حاوية النفايات) ثم وضع الخطط بناءً عليها.
خريطة المفاهيم
```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)).
اختبار الوسيط (صفحة 287)
الغرض من الاختبار
#### التحقق من نشر الرسائل بشكل صحيح قبل تنفيذ كود بايثون.
#### استخدام عميل MQTTX للاشتراك في موضوع واستقبال الرسائل.
خطوات استخدام MQTTX للاشتراك
#### 1. في تبويبة desktop_connection، اضغط على زر New Subscription.
#### 2. في مربع نص Topic، اكتب "waste/drops".
#### 3. اضغط على زر Confirm.
عرض الرسائل من خلال عميل MQTTX (صفحة 288)
نتيجة تنفيذ البرنامج
#### بعد تنفيذ مقاطع بايثون وبدء نشر الرسائل، يتم استقبالها في عميل MQTTX.
شكل واجهة عميل MQTTX
#### تحتوي على:
##### لوحة Connections مع اتصال desktop_connection.
##### زر New Subscription للاشتراك في مواضيع جديدة.
##### سجل الرسائل المستلمة.
مثال على الرسالة المستلمة
#### Topic: waste/drops
#### QoS: 0
#### Payload (JSON):
##### {"timestamp":"2022-10-03 11:14:54", "garbage_drops":9, "can_filled":false}
تمارين (صفحة 289)
تمرين 1: رسم مخطط
#### المطلوب: إنشاء مخطط لشبكة MQTT مع لوحة أردوينو واحدة تعمل كناشر واثنتان تعملان كمستقبلات.
#### أداة المساعدة: شبكة تفصيلية (Grid) مرفقة للرسم.
تمرين 2: الوصف والمكونات
#### المطلوب: تقديم وصف للترانزستور الضوئي ومكونات مستشعر الإمالة وحالات استخدامها.
تمارين تطبيقية (صفحة 290)
تمرين 3: تحليل وسيط EMQX العام
#### المطلوب: تحليل ماهية وسيط EMQX العام ومدى مساهمته في تطوير تطبيقات النماذج الأولية لإنترنت الأشياء.
تمرين 4: تحديث معالج الحدث on_connect
#### المطلوب: تحديث معالج الحدث on_connect ليطبع معلومات التكوين إلى وحدة التحكم المقدمة إلى عميل MQTT.
تمرين 5: تحديث دالة publish_message
#### المطلوب: تحديث دالة publish_message لنشر رسالة زمنية تعرض التاريخ والوقت بأكملهما، وخاصية جديدة تحتوي على معرف العميل.
تمارين تطبيقية (صفحة 291)
تمرين 6: إنشاء برنامج نشر مخصص
#### المطلوب: إنشاء مقطع برمجي بلغة بايثون يتيح للمستخدم كتابة:
##### الموضوع الذي يريد الاشتراك به.
##### الرسالة التي يريد إرسالها.
#### الاختبار: استخدام العميل المكتبي MQTT X لاختبار البرنامج.
إدارة النفايات الذكية وتحليل البيانات (صفحة 292)
تحليل البيانات
#### جمع البيانات من النموذج الأولي
##### البيانات: ترسل من حاوية النفايات الذكية عبر بروتوكول MQTT.
##### الهدف: وضع الخطط بناءً على البيانات المجمعة.
إنشاء برامج تحليل البيانات
#### ملف mqtt_receiver.py
##### الوظيفة: الاشتراك في موضوع MQTT وجمع الرسائل.
##### المخرجات: حفظ البيانات في ملف JSON.
#### ملف data_analysis.ipynb
##### الوظيفة: قراءة البيانات من ملف JSON وتحليلها.
##### العملية: يقرأ البيانات، يكتب النتائج، يجمع المعلومات.
تدفق البيانات في النظام
#### وسيط MQTT: نقطة تمرير الرسائل بين الحاوية وبرامج التحليل.
#### ملف JSON: وسيط تخزين للبيانات المجمعة قبل تحليلها.
```
نقاط مهمة
- هذا الدرس هو استكمال للدرس السابق، حيث يتم الانتقال من مرحلة جمع البيانات إلى مرحلة تحليلها.
- يتم إنشاء برنامجين: `mqtt_receiver.py` لجمع الرسائل وحفظها، و `data_analysis.ipynb` لقراءة البيانات المحفوظة وتحليلها.
- تدفق البيانات: حاوية النفايات الذكية → وسيط MQTT → `mqtt_receiver.py` → ملف JSON → `data_analysis.ipynb`.