الدرس الثاني تصميم وبرمجة جهاز ذكي لإنترنت الأشياء (٢)
انظر إلى الصندوق البرمجي العلوي، حيث يتم إنشاء عميل بروتوكول الاتصال عبر السطر الأول بتعريف المتغير client، ثم في السطر الثاني ربط معالج الأحداث عبر دالة on_connect، وبعدها في السطر الثالث يتم الاتصال بالوسيط عبر تحديد عنوانه ورقم المنفذ، وأخيراً الاشتراك في الموضوع المطلوب. في الصندوق السفلي، انظر إلى حلقة التكرار while True التي تعمل بلا توقف لقراءة قيم المستشعرات؛ حيث تُقرأ قيمة مستشعر الإضاءة وتخزن في light_value وقيمة مستشعر الإمالة في tilt_value. يطبع البرنامج هذه القيم للاختبار، ثم يفحص شرط الإمالة فإذا تحقق يزيد العداد بواحدة، وإذا انخفضت الإضاءة عن 0.200 تصبح الحوية ممتلئة بالرمز can_full = True، ويتم استدعاء دالة نشر الرسالة ودالة إعادة الضبط.
يقوم هذا الدرس على بناء وتصميم جهاز ذكي لإنترنت الأشياء يمثل حاوية قمامة ذكية باستخدام لغة البايثون ولوحة الأاردوينو ووسيط MQTT. تعتمد الفكرة على قراءة قيم المستشعرات مثل مستشعر الضوء ومستشعر الإمالة لمعرفة عدد مرات سقوط النفايات وما إذا كانت الحوية ممتلئة عندما تنخفض قيمة الضوء عن 0.200، ثم نشر هذه البيانات عبر الوسيط لكي يستقبلها العميل المكتبي MQTTX. تتضمن البرمجة إعداد مكتبة pyfirmata للاتصال باللوحة، وإنشاء دالة reset_can لتصفير العدادات، ودالة publish_message لتغليف البيانات في قاموس وتحويلها إلى صيغة JSON ثم إرسالها عبر الدالة client.publish. يختبر الطالب النظام عبر ربط العميل المكتبي بالموضوع المحدد waste/drops لمراقبة الرسائل والوقت وحالة الحاوية بشكل مباشر، مما يعطي تطبيقاً عملياً متكاملاً لربط الأجهزة المادية بالشبكات السحابية.
الفكرة الأساسية
بناء نظام ذكي لإنترنت الأشياء يراقب حالة حاوية القمامة عبر قراءة مستشعر الإمالة لحساب عدد مرات سقوط النفايات، ومستشعر الضوء لكشف ما إذا كانت الحاوية مظلمة بما يكفي للدلالة على امتلاء الحاوية، ثم إرسال هذه البيانات عبر وسيط MQTT لتظهر فوراً على العميل المكتبي MQTX في جهاز الكمبيوتر.
الشرح
يعتمد البرنامج على لغة البايثون بالتكامل مع لوحة الأاردوينو عبر مكتبة pyfirmata. يتم تهيئة الاتصال باللوحة وتحديد منافذ المستشعرات، حيث يقرأ البرنامج مستشعر الضوء light_sensor_pin ومستشعر الإمالة tilt_sensor_pin داخل حلقة تكرارية مستمرة while True. إذا كانت قيمة الإمالة صحيحة، يرتفع عداد النفايات garbage_drops بمقدار واحد. وإذا انخفضت قيمة الضوء عن القيمة 0.200 في نفس وقت حدوث الإمالة، يتحول متغير الحاوية الممتلئة can_full إلى القيمة True. يتم بعد ذلك استدعاء دالة publish_message لإنشاء قاموس يحتوي على طابع زمني ورقم النفايات وحالة الحاوية، ثم تحويله إلى صيغة JSON ونشره عبر الموضوع waste/drops باستخدام وسيط MQTT العام. يتيح برنامج MQTTX المكتبي متابعة هذه الرسائل لحظياً عن طريق الاشتراك في نفس الموضوع.
مثال محلول خطوة بخطوة
إذا كانت قيمة مستشعر الضوء المستلمة عبر البايثون تساوي 0.150 وكانت قيمة مستشعر الإمالة تساوي True، فخطوات التنفيذ هي كالتالي:
- يدخل البرنامج حلقة التكرار while True ويقرأ قيم المستشعرات.
- يتحقق الشرط الأول: هل الإمالة تساوي True؟ نعم، إذن يزداد عداد النفايات garbage_drops بمقدار واحد.
- يتحقق الشرط الثاني: هل قيمة الضوء أقل من أو تساوي 0.200؟ بما أن 0.150 أقل من 0.200، يتحقق الشرط.
- يتغير متغير can_full إلى القيمة True للدلالة على أن الحاوية ممتلئة.
- يتم استدعاء دالة publish_message لتجهيز رسالة JSON تحتوي على الوقت الحالي وعدد النفايات وحالة الامتلاء.
- تُنشر الرسالة عبر الوسيط إلى الموضوع waste/drops لتظهر في برنامج MQTTX على الشاشة.
- يتم استدعاء دالة reset_can لتصفير العدادات وإعادة الحاوية إلى وضعها الطبيعي.
أخطاء شائعة
- نسيان إضافة الأمر it.start() بعد تعريف المؤرخ لربط اللوحة، مما يمنع قراءة بيانات المستشعرات.
- كتابة اسم الموضوع topic بشكل مختلف بين برنامج البايثون ومربع نص الاشتراك في العميل المكتبي، مما يمنع ظهور الرسائل.
- عدم استخدام الدالة global داخل الدوال عند محاولة تعديل المتغيرات العامة مثل garbage_drops وcan_full.
سؤالان للتدريب مع الإجابة
السؤال الأول: متى يعتبر النظام أن حاوية القمامة ممتلئة وتحتاج إلى نشر رسالة الامتلاء؟ الإجابة: عندما تكون قيمة مستشعر الضوء أقل من أو تساوي 0.200 بالتزامن مع تفعيل مستشعر الإمالة. السؤال الثاني: ما هي المكتبة المستخدمة في البايثون للتعامل مع لوحة الأاردوينو وقراءة منافذها في هذا التطبيق؟ الإجابة: مكتبة pyfirmata.