الدرس الثاني برمجة الأردوينو في البايثون
انظر إلى بداية الدرس الثاني عن برمجة الأردوينو في البايثون، حيث نبدأ مشروع الحديقة الذكية. المنصة السحابة هنا هي خادم مركزي على الإنترنت يجمع البيانات باستمرار. انظر إلى المكونات في الأسفل: لوحة أردوينو أونو، لوحة توصيل الدوائر الصغيرة، مستشعر رطوبة التربة، مستشعر درجات الحرارة، ومحرك تيار مستمر. سنقوم بمحاكاة هذه الدائرة أولاً عبر برنامج تينكركاد لنراقب الحرارة والرطوبة ونشغل نظام الري عند الحاجة، ثم ننتقل إلى التنفيذ الحقيقي بنفس التوصيلات.
يقوم هذا الدرس على بناء مشروع الحديقة الذكية باستخدام لوحة أردوينو أونو ومكتبة بايفيرماتا لتوصيل الأردوينو بلغة بايثون. تتضمن الفكرة قراءة بيانات مستشعر درجة الحرارة ومستشعر رطوبة التربة عبر الأطراف التناظرية، ثم معالجة هذه القيم بصيغ رياضية دقيقة لتحويلها إلى درجات مئوية ونسب مئوية. عند تجاوز حرارة الجو 24.0 درجة واصخفاض رطوبة التربة عن 40 بالمئة، يرسل البرنامج إشارة رقمية عبر الطرف الرقمي 3 لتشغيل محرك التيار المستمر مدة 5 ثوان لعملية الري الآلي. يعتمد المشروع على حلقة تكرار لا نهائية تفحص القراءات باستمرار وتطبع تقارير بيئية دورية على الواجهة الطرفية لتأكيد استقرار النظام وسلامة الاتصال السحابي.
الفكرة الأساسية
تقوم الفكرة على ربط العالم الفيزيائي بالعالم البرمجي عبر بناء مشروع الحديقة الذكية. نستخدم لوحة أردوينو أونو مع لوحة توصيل الدوائر الصغيرة ومستشعرات للحرارة ورطوبة التربة ومحرك تيار مستمر، ونتحكم بها جميعاً عن طريق لغة بايثون باستخدام مكتبة pyfirmata التي تجسر العقل البرمجي بالأجهزة المادية.
الشرح
نبدأ أولا باستدعاء مكتبات بايثون الأساسية مثل import pyfirmata و import time. ثم نعرف منفذ الاتصال مثل communication_port = 'COM4' ونحدد أطراف التوصيل لكل عنصر: محرك التيار المستمر على الطرف الرقمي 3 عبر board.get_pin('d:3:o')، ومستشعر الحرارة TMP على الطرف التناظري 2 عبر board.get_pin('a:2:i')، ومستشعر رطوبة التربة على الطرف التناظري 4 عبر board.get_pin('a:4:i'). بعد ذلك نعد اتصال Iterator لنضمن استقبال البيانات بلا توقف.
عند القراءة، تردنا قيم خام غير معالجة من الأطراف التناظرية، ولذلك نمررها عبر صيغ رياضية محددة. لتحويل قراءة مستشعر الحرارة إلى جهد ثم إلى درجة مئوية نطبق الآتي: نحول القراءة إلى رقم عشري ونضربها في 1000، ثم نقسم الناتج على 1024 ونضربه في 5 لنحصل على الجهد، ثم نطرح 0.5 ونضرب الناتج في 100 لنصل إلى درجة الحرارة المئوية الفعليّة. أما مستشعر رطوبة التربة فنحسب نسبته بالصيغة: (1.0 - float(moisture_value)) * 100. نتحقق دائما ان القيم ليس فيها فراغ عبر شرط عدم التساوي مع None، ثم نقارنها بالشروط المطلوبة للري.
مثال محلول خطوة بخطوة
لو قرأ مستشعر الحرارة قيمة خام تؤدي إلى جهد مقداره 0.74 فولت، فكيف نحسب درجة الحرارة؟ الخطوة الأولى: نأخذ الجهد 0.74 ونطرح منه 0.5 فيصبح الناتج 0.24. الخطوة الثانية: نضرب الناتج 0.24 في 100 لنحصل على درجة الحرارة النهائية وهي 24.0 درجة مئوية. الخطوة الثالثة: إذا كانت رطوبة التربة المقروءة تساوي 0.35، فنطبق صيغة الرطوبة: (1.0 - 0.35) * 100 لتصبح النسبة المئوية للرطوبة 65 بالمئة. الخطوة الرابعة: بما أن الحرارة 24.0 والرطوبة ليست أقل من أو تساوي 40 بالمئة، فلن يتفعل الري في هذه اللحظة، ويستمر البرنامج في فحص القراءات كل 10 ثوان.
أخطاء شائعة
- نسيان بدء الاتصال مع اللوحة عبر أمر it.start() مما يؤدي إلى عدم استجابة الحساسات.
- كتابة رمز الطرف بشكل خاطئ، مثل كتابة 'd' بدلا من 'a' للأطراف التناظرية أو العكس.
- إغفال التحقق من القيم الفارغة قبل إجراء العمليات الحسابية، مما يسبب توقف البرنامج عند استقبال بيانات غير صالحة من المستشعرات.
سؤالان للتدريب مع الإجابة
السؤال الأول: لماذا نحتاج إلى معالجة قيم إشعار مستشعر الحرارة بصيغة رياضية تحتوي على القسمة على 1024 والضرب في 5؟ الإجابة: لأن الأطراف التناظرية في الأردوينو تقرأ إشارة الجهد على شكل أرقام خام تتراوح بين 0 و 1023 بناء على جهد مرجعي قدره 5 فولت، والمعادلة تحول هذه الأرقام الخام إلى قيم جهد حقيقية ثم إلى درجات مئوية.
السؤال الثاني: ما وظيفة دالة time.sleep(5) داخل دالة تشغيل محرك الري water_plant؟ الإجابة: وظيفتها إيقاف تنفيذ البرنامج مؤقتا لمدة 5 ثوان ليبقى محرك التيار المستمر يعمل ويضخ المياه خلال هذه المدة قبل أن يرسل البرنامج أمر الإيقاف.