الدرس الثاني تصميم وبرمجة جهاز ذكي لإنترنت الأشياء (١)
انظر إلى الشكل: تدور فكرة الدرس حول إدارة النفايات بذكاء، فعندما تزيد كميات القمامة في الأماكن وتتجاوز الحاويات سعتها دون إزالة في الوقت المناسب، تتكدس المخلفات. لحل هذه المشكلة، سنستخدم حاويات ذكية ترسل رسائل تنبيهية عبر وسيط يدعم تدفق الأحداث، مثل بروتوكول MQTT، لتخبر شركات جمع النفايات بضرورة التفريغ. سنبني نموذجاً أولياً باستخدام لوحة أردوينو لبرمجة حاوية ذكية ترسل تقارير عن حالتها عند الامتلاء عبر بروتوكول Firmata ولغة بايثون.
يقوم هذا الدرس على بناء نموذج لحاوية نفايات ذكية باستخدام لوحة أوردوينو وتنكاركاد، بهدف مراقبة امتلاء الحاوية وحساب عدد مرات الاستخدام وإرسال التقارير عبر الإنترنت. يعتمد النظام على مستشعرين رئيسيين وهما الترانزستور الضوئي لقياس الضوء ومحاكاة حركة الغطاء، ومستشعر الإمالة لقياس زاوية الميل. يتم ربط هذه المكونات ببرنامج بايثون عبر بروتوكول Firmata، واستخدام وسيط MQTT لتوزيع الرسائل وإرسال التنبيهات إلى منصة عامة مثل EMQX. فمثلاً، عندما يصل الترانزستور الضوئي إلى حد معين ويكتشف ميل الحاوية، يرتفع عداد garbage_drops بمقدار وحدة واحدة، وتُرسل رسالة فورية عبر الكائن البرمجي تحتوي على الوقت الحالي وحالة الامتلاء ليتم معالجتها وعرضها للمستخدم.
الفكرة الأساسية
بناء نموذج عملي لحاوية نفايات ذكية تجمع بيانات الأحداث وتراقب سعتها باستخدام لوحة أوردوينو ومستشعرات ضوئية وإمالة، ثم تربطها ببروتوكول الاتصال MQTT لإرسال رسائل فورية وتنبيهات تفيد بأن الحاوية قد تم استخدامها أو امتلت.
الشرح
تتطلب عملية بناء نظام إنترنت الأشياء هذا تجهيز الأجهزة البرمجية والقطع الإلكترونية معاً. أولاً، يتم استخدام لوحة Arduino Uno R3 مع لوحة توصيل الدوائر الصغيرة، ومستشعرين أساسيين وهما الترانزستور الضوئي ومستشعر الإمالة. الترانزستور الضوئي هو مكون كهربائي يتغير التيار العكسي فيه بتناسب مع كمية الضوء الساقط عليه، ويستخدم في المشروع كمستشعر ضوئي يصل إلى حد معين ليعني أن الحاوية مليئة بالنفايات، كما يستخدم لمحاكاة حركة غطاء الحاوية. أما مستشعر الإمالة فيقوم بتقييم وضع الميل بالنسبة للجاذبية على عدة محاور لاكتشاف الميل أو الاتجاه. يتم توصيل هذه المكونات بأطراف الأوردوينو، حيث يتصل الترانزستور الضوئي بالطرف التناظري A0، ومستشعر الإمالة بالطرف الرقمي D3، مع استخدام مقاومين بقيمة .
ثانياً، للجانب البرمجي، يتم استخدام لغة البايثون في بيئة عمل PyCharm مع تثبيت حزمة إدارة الحزم paho-mqtt عبر الأمر pip install paho-mqtt، واستيراد مكتبات datetime للوقت، وtime للتحكم، وjson للتعامل مع كائنات JSON، وpyfrmata للاتصال بلوحة الأوردوينو عبر بروتوكول Firmata، وpaho.mqtt.client لإنشاء عملاء للاتصال مع وسطاء MQTT. يتم تعريف متغيرات الاتصال مثل CLIENT_ID لاسم العميل، وMQTT_BROKER لعنوان الوسيط مثل broker.emqx.io، وTOPIC لموضوع الاشتراك مثل waste/drops، وPORT لمنفذ الخادم وهو 1883، وFLAG_CONNECTED كمتغير إشارة للتحقق من الاتصال. ثم تُنشأ دوال مثل reset_can لتصفير العدادات، وpublish_message لإنشاء قاموس يحتوي على الوقت وحالة الامتلاء والعدادات وتحويله إلى كائن JSON ونشره، ودالة on_connect لمعالجة أحداث النجاح والفشل للاتصال عندما يكون رمز الاستجابة rc مساوياً للصفر.
مثال محلول خطوة بخطوة
- لإنشاء كائن JSON لإرسال البيانات، يتم كتابة الكود البرمجي الذي يسجل وقت الحدث الحالي باستخدام datetime، ثم إنشاء قاموس باسم msg_dictionary على النحو الآتي:
timestamp = str(datetime.now().strftime("%H:%M:%S"))
msg_dictionary = {
"timestamp": timestamp,
"garbage_drops": garbage_drops,
"can_full": can_full
}
- يتم تحويل هذا القاموس إلى سلسلة نصية بصيغة JSON باستخدام الدالة json.dumps وتخزينها في متغير باسم msg:
msg = json.dumps(msg_dictionary)
- يتم نشر هذه الرسالة إلى الموضوع المشترك waste/drops من خلال العميل عبر الأمر:
result = client.publish(TOPIC, msg)
أخطاء شائعة
- نسيان تثبيت حزمة paho-mqtt في بيئة PyCharm قبل محاولة استيرادها في ملف البايثون، مما يؤدي إلى ظهور خطأ في الاستيراد.
- الخطأ في توصيل أطراف الترانزستور الضوئي أو مستشعر الإمالة بالأطراف الخاطئة في لوحة الأوردوينو (مثل توصيل الطرف التناظري برقمي أو العكس).
- إغفال تغيير منفذ الاتصال PORT أو كتابة عنوان وسيط MQTT الخاطئ MQTT_BROKER، مما يمنع نجاح الاتصال بالخادم ويجعل المتغير rc لا يساوي الصفر.
- عدم تفعيل بروتوكول Firmata على لوحة الأوردوينو عبر بيئة عمل Arduino IDE قبل تشغيل كود بايثون، مما يتسبب في فشل التواصل بين اللوحة والبرنامج.
سؤالان للتدريب مع الإجابة
السؤال الأول: ما هو المكون المستخدم في المشروع لقياس درجة الميل على عدة محاور وتقييم وضع الميل بالنسبة للجاذبية؟ الإجابة: مستشعر الإمالة (Tilt Sensor).
السؤال الثاني: ما هي الوظيفة الأساسية لمتغير TOPIC في إعدادات الاتصال بوسيط MQTT؟ الإجابة: يشير إلى اسم الموضوع الذي سيشترك فيه العميل لاستقبال وإرسال البيانات والرسائل الخاصة بحالة الحاوية.