تصميم وبرمجة جهاز ذكي لإنترنت الأشياء - إنترنت الأشياء - ثاني ثانوي
الجزء الأول
1. أسس إنترنت الأشياء
2. إنترنت الأشياء في حياتنا
3. إنشاء تطبيقات إنترنت الأشياء باستخدام الأردوينو
4. إنشاء تطبيق سحابي لإنترنت الأشياء
الجزء الثاني
5 .تطبيقات إنترنت الأشياء المتقدمة
6 .برمجة إنترنت الأشياء باستخدام ++C
7 .الرسائل في إنترنت الأشياء
8. محاكاة شبكة مستشعرات إنترنت الأشياء اللاسلكية
الدرس الثاني تصميم وبرمجة جهاز ذكي لإنترنت الأشيا: إدارة النفايات الذكية Smart Waste Management www.r.edu.sa نظرا للاكتظاظ السكاني قد لا تُجمع ولا تُعالج كميات كبيرة جدًا من النفايات والمخلفات بكفاءة، مما يتسبب في زيادة كمية النفايات في عدة أماكن وتحدث هذه المشكلة بسبب تجاوز سعة حاويات القمامة دون إزالتها في الوقت المناسب لكن باستخدام حاويات النفايات الذكية يمكن أن تُرسل رسائل تنبيهية لإعلام مركبات جميع النفايات بهذه الحاويات كذلك من خلال عمليات تحليل البيانات الملاءمة يمكن استنباط الأفكار حول كيفية تعبئة حاويات النفايات لتحسين العملية برمتها بشكل أكثر كفاءة رسالة EMQX شكل 78 مشروع إدارة التهابات البنكية بالأرمرير وبروتوكول MQTT EMQX رساله ستنشئ في هذا الدرس نموذجا أوليا لحاوية قمامة ذكية تحب متوسط عدد المرات المطلوبة لتصل إلى سعتها الكاملة، سترسل رسالة إلى وسيط (MQTT) كل مرة تستخدم فيها الحاوية. وعندما تمتلئ الحاوية ترسل رسالة أخرى إلى متحكم النظام الذي ينتج التقارير عن الحاوية. تستخدم في هذا المشروع (EMOX ) هو وسيط (MQTT) مفتوح المصدر عالي متحكم أردوينو يمثل حاوية ذكية. وستقوم ببرمجته باستخدام الأداء مع محرك المعالجة الرها بصورة الهوية بروتوكول (Firmata) وبايثون كما ستتخدم منصة (MQTT) يستخدم لدعم تدفق الأحداث بواسطة عدد كثير من حرارة التعليم التوزيع الرسائل أجهزة إنترنت الأشياء.
إدارة النفايات الذكية
274 مكونات وأدوات المشروع Components & Tools for Project الترانزستور الضوئي Phototransistor هو مكون كهربائي يعمل عند تعرضه للضوء، حيث تتدفق كمية متناسبة من التيار العكسي عند سقوط الضوء على المستشعر، وتستخدم أجهزة التراثر ستورات الضوئية على نطاق واسع لاكتشاف وتحويل نبضات الاضاءة إلى إشارات كهربائية. الرهم في المحاكي ومر تحطيطي ترات تور صوتی 79 لير تير مستشعر الإمالة Tilt Sensor يستخدم مستشعر الإمالة لقياس درجة الميل على عدة محاور وتقوم مستشعرات الإمالة بتقييم وضع الميل بالنسبة للجاذبية وتستخدم في تطبيقات مختلفة. حيث تجعل اكتشاف الميل أو الاتجاه أمرا ميسورا. مستنفر الإمالة الوهم في المحاكي رمز تخطيطي حي 710 مستمر الإمالة صرارة التعليم
الترانزستور الضوئي
مستشعر الإمالة
النموذج الأولي باستخدام الأردوينو Arduino Prototype سيراقب متحكم الأردوينو حالة الحاوية، ويجمع بيانات الأحداث المختلفة ويرسلها من خلال بروتوكول (Firmata). سيستخدم مستشعر الإمالة لتسجيل استخدام الحاوية في كل مرة، ومحاكاة حركة غطاء الحاوية، وسيعمل الترانزستور الضوئي كمستشعر عند الوصول إلى حد معين مما يعني أن الحاوية مليئة بالنفايات. ستحتاج إلى المكونات الآتية: . لوحة أردوينو أونو Arduino Unia R3) R3). لوحة تجارب مصغرة Breadboard Small ) . • مستشعر ضوئي (Phototransistor) . مستشعر امالة (Tilt Sensor). • مقاومتان 1 كيلو أوم (12) Two resistors). المكونات المستخدمة في هذا المشروع مستشعر ضوئي مستشعر الإمالة مقاومات OO UND لوحة تحارب مصغرة أردوينو أوتو A3 مرارة التعليم لكل 711 مكونات مشروع المشايات الذكية 275
النموذج الأولي باستخدام الأردوينو
1 الاتصال بوسيط EMO العام Connecting to the EMQX Public Broker سنحتاج أولا إلى تثبيت التطبيق المكتبي MQTTX client . ثم اختبار الاتصال مع وسيط (EMOX) العام. لتثبيت تطبيق Agent MQTTX قم بزيارة موقع الويب /https://mattx.app وقم بتنزيل أحدث إصدار قم بتشغيل المثبت لإكمال عملية التثبيت. ستقوم الآن بفتح البرنامج العميل، وإنشاء اتصال جديد مع وسيط (EMOX) التكوين الاتصال بوسيط EMQX مع MaITX اضغط على در البحث في نظام تشغيل ويندور. وأكت MQTTx 1 افتح تطبيق MQTTx dient اضغط على New Connection اتصال حديد )، لإنشاء اتصال حديد. اكتب اسما للاتصال. على سبيل المثال desktop_connection اضغط على زر Connect / الاتصال . 2 Campe 4 3 وزارة التعليم شار 712 اعداد الاتصال بوسط MOX مع MOTTX 5 276
الاتصال بوسيط EMQX العام
دائرة الأردوينو Arduino Circuit ستبدأ في إنشاء دائرة الأردوينو عن طريق إضافة المكونات المطلوبة داخل مساحة عمل دوائر تفكر كاد. التثبيت المكونات: ابحث عن Arduino Uno RS | لوحة ردولو اوتو من مكتبة Components (المكونات) واسحبها وأجلتها في مساحة العمل 1 ابحت عن Breadboard Small ) لوحة توصيل الدوائر الصغيرة من مكتبة Components المكونات) واسحبها وأطلتها في مساحة العمل 0 ابحث عن Phototransistor (مستشعر الإضاءة الترانزستور الضوني). من مكتبة Components | المكونات ) واسبه وأفلته في مساحة العمل. ابحث عن Tilt Sensor pin (مستشعر الإمالة بأربعة أطراف ) من مكتبة Components (الكونات)، وأسحبه وأطلته في مساحة العمل. ابحث عن Resistor ( المقاومة ) من مكتبة Components ( المكونات ) واسحب الملكين منها وأفلتهما في مساحة العمل 4 2 1 5 3 مراية التعليم لم 713 تنيت مكانات الدائرة
دائرة الأردوينو
OO LIND DO UND 1 3 شكل 714 توصيل المتر الوستي العراق مرارة الي الإمالة 2 اشر 7.45 توصيل ما 5 2 3 التوصيل الترانزستور الضوئي قم بتحصيل طرف Emitter ( الباعث الخاص بالترانزستور الضوني بالطرف التناظري AD في الأردوينو، وغير لون السلك إلى yellow الأصفر) 1 قم بتوصيل الطرف الثاني للمقاومة الواحدة مع العم نفسه الذي تم توصيل باعث الترانزستور الصوتي به، ثم وصل الطرف الأول من المقاومة بالعمود السالب من لوحة الدوائر الصغيرة 2 قم بتوصيل طرف 5 (5 هولت ) للوحة الأردوينو ونو R3 بالعمود الموحد من لوحة التحارب وغير لون السلك إلى Red (الأحمر). 3 قم بتحصيل GND ( الطرف الأرضي ) للوحة الأردوينو أرنو بالعمود السالب للوحة التجارب وغير لون السلك إلى Black | الأسود ) 0 قم بتوصيل طرف المجمع الخاص بالترانزستور الصوتي بالعمود الموجب في لوحة التوصيل المصغرة . التوصيل مستشعر الإمالة: قم بتوصيل الطرف الثاني للمقاومة الأخرى بالطرف الثاني مستشعر الإمالة. قم توصيل الطرف الثاني من مستشعر الامانة بالطرف الرقمي 3 للوحة الأردوينو. وغير لون الا إلى Green ( الأعض) قم بتوصيل الطرف الرابع من مستشعر الإسالة بالعمود الموجب من لوحة الدوائر الصغيرة وغير لون السللد إلى Red الأحمر) . قم بتوصيل الطرف الأولى من المقاومة بالعمود السالب من لوحة الدوائر الصغيرة وغير لون البيلك إلى Black ( الأسود) 9 278
توصيل الترانزستور الضوئي
توصيل مستشعر الإمالة
الدائرة بشكلها النهائي Complete Circuit الممكن 716، الدائرة بصورتها النهائية في تلكر كال صورة الدائرة الفعلية Physical Circuit تمثل هذه الصورة الشكل الذي ستبدو عليه الدائرة. تتصل المكونات بالأطراف الآتية: AO شكل 717 صورة الدالمرة D3 شن 718 توصيل الأطارات بالقصات وزارة التعليم 279
الدائرة بشكلها النهائي
صورة الدائرة الفعلية
برمجة الأردوينو Programming the Arduino ستبدأ بتحميل بروتوكول StandardFirmata من خلال بيئة عمل Arduino IDE لإعداد قناة اتصال بين الأردوينو والبرنامج الذي ستقوم بكتابته بلغة البرمجة بايثون Python افتح PyCharm وقم بتثبيت حزمة paho matt من خلال نظام إدارة الحزم (pip). في PyCharm. افتح الواجهة الطرفية (Terminal) في مجلد عملك. واكتب الأمر الآتي: pip install paho-matt قم بإنشاء ملف باينون جديد باسم matt_arduino.py. ثم في بداية مقطعك البرمجي . ثم قم باستيراد الحزم الآتية: . datetime إنشاء طوابع زمنية للرسائل التي ترسلها . . time التحكم في سير البرنامج. json العمل مع : كاتشات JSON. pyfirmata: التواصل مع لوحة الأردوينو من خلال بروتوكول Firmata • paho.mgtt.client إنشاء عملاء للتواصل مع وسطاء MQTT from datetime import datetime import time import json import pytirmata import paho.mqtt.client as mq أنشئ المتغيرات الآنية التي ستستخدم لعميل MQTT الذي ستنشته، سيكون اسم العميل CLIENT ID. أما MQTT_BROKER فهو عنوان الوسيط العام الذي توفره EMOX الذي ستتصل به ويشير TOPIC إلى اسم الموضوع الذي يشترك فيه العميل يشير PORT إلى منفذ الخادم الافتراضي للاتصال بالوسيط، وختاما فان FLAG_CONNECTED سيستخدم كمتغير إشارة في دالة معالج الأحداث لاحقا # Variables to setup MQTT client CLIENT_ID = "PUBLISHER_01" MQTT_BROKER = "broker.emqx.20" TOPIC = "waste/drops" PORT = 1033 FLAG_CONNECTED = False # ID of the client : Address of the broker # Topic to subscribe to # Default server port # Connection flag 280
برمجة الأردوينو
جدول 3.3 متغيرات الاتصال بوسيط MQTT CLIENT_ID MQTT BROKER TOPIC PORT FLAG CONNECTED اسم صل MaTT الوصف عنوان وسيط MOTT المستهدف. الموضوع الذي يشترك اليه العميل نفط الخاتم المراد الاتصال به. متعبر إشارة المتحقق من اتصال الخادم. أضف الأسطر الأتية، والتي مهمتها تهيئة الاتصال بالأردوينو باستخدام بروتوكول ( Firmata) وكذلك تكوين الأطراف الخاصة بمستشعر الإضاءة ومستشعر الإمالة المستخدمين للحصول على البيانات. board pyfirmata. Arduino( COM4") # Specify communication port = it pyfirmata.util.Iterator(board) # Select the board to connect it.start() #Connect to board # Selecting the sensor pins Light_sensor_pin = board.get_pin( 'a:0:1') tilt_sensor_pan = board.get pin('d:3:1') أنشئ المتغيرات الأتية بالأسماء الآتية: can full وهو وسم يحدد ما إذا كانت حاوية القمامة قد ملئت أم لا. و garbage_drops وهو عداد المتبع عدد مرات الاستخدام التعبئة الحاوية بالكامل. can_full : false # Flag to indicate whether the can is full garbage drops = 0 # Counter for the garbage drops قم بإنشاء الدالة الاتية التي تعيد تعيين متغيري .can_full و garbage_drops في كل مرة تكون فيها الحاوية ممتلئة. وترسل رسالة إلى العميل حول هذا الموضوع. def reset_can( ) : global garbage_drops # Access the garbage_drops variable global can_full garbage drops = 0 can Tull False # Access the can_full variable # Reset the counter to 0 # Clear the can حرارة التعليم 781
متغيرات الاتصال بوسيط MQTT المتغير
قم بإنشاء الدالة الأتية لإرسال رسالة للعميل تفيد بأنه تم استخدام الحاوية. ستقوم أولا بإنشاء متغير باسم timestamp التسجيل الوقت وإنشاء كائن قاموس Dictionary بالخصائص timestamp و garbage_drops و can_full. ستقوم بتحويل هذا القاموس إلى كائن JSON ، لم تشره إلى موضوع المشترك "waste/drops" من خلال العميل def publish_message(); global garbage drops # Access garbage drops variable # Access can full variable global can_full # Create a custom format for the timestamp timestamp str(datetime.now().strftime("%H:%M:%S")) msg_dictionary = ۱۱۹۱ # Creating the JSON object "timestamp": timestamp, "garbage_drops": garbage_drops, "can_Fult ": can_full k النساء تنسيق هاب مع بيانات الوقت. انشاء كائن قاموس ISON لإرال البيانات msg= try: json.dumps(msg_dictionary) # Convert dictionary to 3SON result = client.publish(TOPIC, msg) # Publish message except: print("There was an error while publishing the message") time.sleep(2) قم بإنشاء دالة معالج الأحداث الآتية والتي ستطبع رسالة تأكيد إلى الواجهة الطرقية Terminal حول نجاح الاتصال بالعميل أو فشله، وسيطات الدالة هي وسيطات افتراضية تستخدم تربط هذه الدالة بمعالج الأحداث المناسب الذي توفره مكتبة paho.mattclient def on_connect(client, userdata, Flags, rc): global FLAG CONNECTED # Access the FLAG CONNECTED variable if rt == 0; درات التصليح # If rc is the client comected successfully FLAG_CONNECTED = True print("Connected to MQTT Broker!") else; print("Failed to connect to MQTT Broker!") هذا المتفير برا من خلال مكتبة paha ليظهر حالة الاتصال 282
إنشاء دالة رسالة للعميل ودالة معالج الأحداث
ستقوم في الجزء الرئيس من البرنامج بتهيئة عميل . وربط معالج الأحداث on_connect بالدالة المذكورة أعلاه. ثم الاتصال بوسيط MOTT المحدد والاشراك في الموضوع المحدد. client = Ing.Client(CLIENT_ID) client.on_connect on connect # Initialize an MQTT client # 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 قم بإنشاء التكرار الرئيس للبرنامج. إذا كانت قيمة light_value أقل من 0.200 فستعد الحاوية ممثلة. 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)) str(tilt_value)) print("Tile levels : print("Garbage drops: + str(garbage drops)) سيبدا في شر البيانات عدما تعنى حاوية القمامة التي يكتب عنها في ظروف الإصابة الملحمية # If there is a tilt, add to the counter if (tilt_value == True): garbage drops = 1 # If there is a cilt and the can is full #publish a message and reset the can if (light_value = 0.200); can_full = True publish_message() reset_can publish_message() Ine sleep(1) حرارة التعليم
إنشاء الجزء الرئيس من البرنامج
from datetime import datetime import time import json import pyfirmata import pano.mott.client as mq البرنامج بشكله النهائي Complete Code # Variables to setup MQTT client CLIENT ID="PUBLISHER_01" MOTT BROKER = "broker emqx.io" TOPIC = "waste/drops" PORT = 1883 FLAG CONNECTED - False # ID of the client # Address of the broker # Topic to subscribe to # Default server port # Connection flag board pyfirmata. Arduino( *COM4") # Specify communication port = it pyfirmata.util. Iterator(board) # Select the board to connect # Connect to board it.start() # Selecting the sensor pins Light sensor pin tilt sensor pin board.get_pin( 'a:8:1') board.get_pin('d:3:1') can full =False = #Flag to indicate whether the can is full garbage drops #Counter for the garbage drops def reset_can(): global garbage drops global can full garbage drops = 0 can full False # Access garbage drops variable # Access can full variable # Reset the counter to # Clear the can مراة التعليم 284
البرنامج بشكله النهائي
def publish_message(): global garbage_drops: # Access garbage_drops variable global can_full # Access can full variable # Create a custom format for the timestamp timestamp = str( datetime.now().strftime("%Y-%m-%d %H:%M:%S")) # Creating the dictionary object msg dictionary ( "timestamp": timestamp, "garbage drops: garbage drops.. "can full" can_full } msg = json.dumps (msg dictionary) # Convert dictionary to JSON try: result client.publish(TOPIC, msg) #Publish message except: print("There was an error while publishing the message") time.sleep(2) print("Message sent to the MQTT broker") def on_connect(client, userdata, flags, re): global FLAG CONNECTED # Access the FLAG CONNECTED variable if rc : else: # If rc is 0 the client connected successfully FLAG CONNECTED = True print("Connected to MQTT Broker!") of int "Failed to connect to MQTT Broker!") درات البشم 286
البرنامج بشكله النهائي2
client = mq.Client(CLIENT_ID) client.on connect on connect #Initialize an MQTT client # 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: " print("Tilt levels : print("Garbage drops : + + str(light value)) str(tilt_value)) + 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) 286
البرنامج بشكله النهائي3
اختبار الوسيط Testing the Broker تعد EMQX وسيط MQIT عام لاختيار وتطوير تطبيقات MQTT . تساعد EMOX في تطوير النماذج الأولية لتطبيقات إنترنت الأشياء دون الحاجة إلى وضع البنى التحتية وتطوير الوسيط، ستستخدم عميل MQTTX client للتحقق من نشر الرسائل، ثم ستشى مقطعا برمجيا آخر في بايثون يستقبل الرسائل المنشورة، وينشئ تقارير عن الحاوية، ويحلل البيانات الموجودة في تلك التقارير بعد تحميل مخطط Standard Firmata إلى الأردوينو، نقد تعليمات بايثون وحرك لوحة التجارب لتفعيل مستشعر الإمالة في كل مرة يفعل بها المستشعر، ستزاد عداد النفايات والذي يشير إلى عدد المرات التي تم بها فتح الحاوية افتراضيا لوضع القمامة وعند تفعيل مستشعر الإمالة مع تغطية مستشعر الإضاءة، سينشر البرنامج رسالة مفادها أن الحاوية ممثلثة، ويعيد ضبط عداد النفايات، ستقوم في الدرس الثاني بتحليل البيانات بناء على الرسائل المنشورة لاختبار نشر رسائلك بصورة صحيحة، ستستخدم العميل المكتبي MOTT Agent قبل تنفيد مقاطع بايثون البرمجية ستستخدم عميل MQTTX للاشتراك في موضوع "waste/drops"، سينتظر العميل الآن استلام الرسائل التي تنفر من خلال برنامج بايثون وتوزع من خلال وسيط EMOX العام لاستخدام MQTTX للاشتراك في موضوع المحدد. في قائمة Connections | اتصالات) في تسوية desktop connection (سطح المكتب)، اضغط على زر New Subscription (اشتراك جديد). ے مربع نص Topic الموضوع . أكت " waste/drops 3 اضغط على زر Confirm تأكيدا 1 2 شکل 719 استخدام MQTTX للاعتر الملالي موضوع من براري السليم 3
اختبار الوسيط
288 عرض الرسائل من خلال عميل MQTTX Viewing Messages through the MQTTX Client بعد تنفيذ المقاطع البرمجية في بايثون، وبدء نشر الرسائل، سيتم استقبال الرسائل من خلال العميل المكتبي MQTTX كما يظهر أدناه شكل 7:20 عرض الرسائل من خلال عميل MQFTX
عرض الرسائل من خلال عميل MQTT
1 2 تمرينات أنسى مخططا لشبكة MQTT مع لوحة أردوينو واحدة تعمل كناشر. والنتان تعملات کمسقبلات قدم وصفا الترانزستور الضوئي ومكونات مستمر الامالة وحالات استخدامهما. جراره المـ
أنشئ مخططا لشبكة MQTT مع لوحة أردوينو واحدة تعمل كناشر
قدم وصفا للترانزستور الضوئي ومكونات مستشعر الإمالة وحالات استخدامهما
290 3 قم بتحليل ماهية وسيط EMOX العام ومدى مساهمته لا تطوير تطبيقات النماذج الأولية لانترنت الأشياء. 4 قم بتحديث معالج الحدث لحديث on connect الذي يطيع معلومات التكوين الى وحدة التحكم المقدمة إلى عميل Mart 5 قم بتحديث الدالة (publish message نشر رسالة زمنية timestamp تعرض التاريخ والوقت با كه اسماء وخاصية جديدة تحتوي على معرف العديل. وزارة البيل
قم بتحليل ماهية وسيط EMQX العام
قم بتحديث معالج الحدث
قم بتحديث الدالة
أنتى مقطعا برمجة بلغة دايتون يتيح للمستخدم كتابة الموضوع الذي يريد الاشتراك به، والرسالة التي يريد ارسالها تم نشرها من خلال وسيط EMOX العام. الكثير برنامجلد باستخدام العميل المكتبي MaTT X