في هذا الدرس، سنتعلّم كيف نستخدم الأردينو لبناء محطة طقس لاسلكيّة ،فسنتسخدم الحسّاس DHT22  لقياس الحرارة والرطوبة في الخارج ، ثمّ نرسل هذه البيانات إلى الوحدة الداخليّة عن طريق وحدتي الإرسال  NRF24L01 ، وسنتسخدم أيضا الحساس DHT22 مع الوحدة الداخليّة لقياس الحرارة والرطوبة في الداخل، وللحدّ من استخدام الطاقة سنستخدم وحدة الوقت الحقيقيّ RTC ،DS3231 للمحافظة على معياريّة الوقت عند وضع الأردوينو في وضع الخمول، وبعد الانتهاء من هذا كلّه ،سنعرض البيانات النهائيّة على شاشة OLED 0.96” OLED .

 

مخطّط دائرة التحكّم بالطقس باستخدام الأردينو

لنلقي نظرة سريعة على مخطط الدائرة ؛لنفهم كيف يعمل هذا المشروع ؛ولنتعرف على مكوناته وطريقه توصيلهم ببعض وبالأردوينو.

 

ومن الشكل السابق نجد كلّا ًمن وحدة الوقت الحقيقي، وشاشة OLED يتصلان مع الأردوينو باستخدام بروتوكول الاتّصال I2C ،حيث يتصلان بالأرجل  التناظرية  4  5 للوحة الأردينو من النوع نانو، ونلاحظ أيضا أنّنا وضعنا مُكثّف بجانب وحدة الإرسال  NRF24L01  ،وذلك للحفاظ على استقراريّة مصدر الكهرباء الداخل إليه. وهناك أيضا مقاومة رافعة pull up متّصلة بالحساس  DHT22 ،حتى يتسنّي له قراءة القيم المطلوبة بطريقة صحيحة.

بالنسبة لمصدر القدرة الكهربيّة، فإنّنا نستخدم مزوّد قدرةٍ فرقُ جهده 12V DC للوحدة الداخليّة، بينما نستخدم للوحدة الخارجية بطاريات ليثيوم جهدها 7.5 فولت ،وهي كافية لتشغيل الوحدة الخارجيّة لـ 10 أيام إذا ما وضعنا الأردوينو في وضع الخمول لفترات مناسبة؛ ففي هذا الوضع يستهلك الأردوينو تياراً كهربياً لا يتجاوز 7 مللي أمبير.

تصميم اللوحة المطبوعة

تتميّز الدوائر المنفّذة علي اللوحات المطبوعة باستقراريّة عملها مقارنة بلوحات التجارب، وسنستخدم لهذا المشروع الأداة EasyEDA المتوفّرة على الشبكة مجاناً، وسنحتاج تصميماً واحداً فقط ؛فكلّا ًمن الوحدة الداخليّة والخارجيّة يتشابهان في العتاد الإلكتروني، ويختلفان في الكود المحمّل على الأردوينو في كلّ منهما.

بعد أن ننهي التصميم نقوم بتصدير ملفّات Gerber file ،حيث نقوم بطباعتها ونصنع اللوحة يدويّاً أو نرسلها إلي أحد مصنّعي اللوحات المطبوعة ؛عند الانتهاء من تصميم اللوحة المطبوعة نأتي لمرحلة وضع العناصر عليها ،ومن ثم لحامها.

وعوضاً عن لحام العناصر الإلكترونية مباشرة في اللوحة ،فإنّنا نقوم أوّلا ًبلحام رأس السنون pin header ؛حتى نتمكّن من إدخال العناصر الإلكترونيّة ،وإزالتها بسهولة دون إتلافها.

يتبقّي لنا بعد ذلك لحام المكثّف والمقاومة الرافعة. وبعد الانتهاء من عملية اللّحام ندخل العناصر الإلكترونيّة في  السنون.

لنقم الآن بصنع الحاوية التي ستضمّ مكوّنات المشروع ،وسنستخدم خشب فيبر MDF سمكه 8 مللي ،ونقوم بقصّه إلى الشكل المطلوب باستخدام منشار الطاولة القرصيّ.

لا ننسى أن نصنع فتحة جانبيّة في الحاوية؛ حتى يتسنى للهواء الدخول إلى الحساسات للحصول على درجة الحرارة والرطوبة بدقّة، فنستخدم المثقاب والمبرد لعمل فتحات في الأسطح الجانبيّة لكلّ من الحاوية الداخليّة والخارجيّة.

ونقوم بعمل فتحة في الجهة الأماميّة لنضع بها شاشة OLED، ولتزيين الجبهة الأماميّة للحاوية نستخدم إطاراً من الألمنيوم.

بعد ذلك، نلصق أجزاء الحاوية بالغراء، ثم نقوم بتثبيتها بالشدّادات حتى تجف ،ويمكننا الاستعانة ببعض البراغي.

الآن أصبح لدينا حاويتان جاهزتان لنضع المكوّنات الإلكترونيّة بداخلها، لكن قبل ذلك نقوم بدهنها بأيّ لون نريده، وقد استخدمنا اللون الأبيض للحاوية الخارجيّة والأسود للداخليّة.

نصل مفتاحاً كهربائيّاً بسلك إلى الحاوية الداخليّة من الناحية الخلفية ؛للتحكم في مصدرها الكهربي، بينما نكتفي بمجرد سلك للتحكّم بالحاوية الخارجيّة.

وبذلك نكون قد انتهينا من بناء محطة الطقس اللاسلكيّة باستخدام الأردوينو، علينا الآن أن نبرمج الأردوينو حتى يقوم بالمهمّة المطلوبة.

 

برمجة الأردينو كمتحكّم في محطة الطقس اللاسلكيّة

هاهو الكود المستخدَم في وحدة الطقس الخارجيّة

الكود البرمجي : التحميل هنا

شرح الكود:

تتمثّل وظيفة الوحدة الخارجيّة ،في الحصول على حالة الطقس، ثم إرسالها لاسلكيّاً إلى الوحدة الداخليّة؛ لذلك فإنّنا نحتاج إلى إدراج المكتبات المتعلّقة بذلك كـ  RF22 , DHT ،وكذلك مكتبة توفير الطاقة، حتى نستطيع وضع الأردوينو في وضع الخمول.

بعد ذلك نقوم بتعريف الأشياء الضرورية المتعلّقة بتلك المكتبات كرقم الأرجل التي ستوصَل بتلك الوحدات ،ثم نقوم بإنشاء منفذ الاتّصال اللاسلكيّ ونحدد عنوانه في جزء( setup).

في دالّة (loop)، نبدأ أوّلاً بقراءة قيم الحرارة والرطوبة من الحسّاس DHT22 ،وتأتي هذه البيانات في صورة منفصلة، وبصيغة أعداد صحيحة integer ، فنقوم بدمجها، وتحويلها إلى متغيّر نصيّ string ،ومن ثم وضعها في مصفوفة الحروف theChar ،وبعد ذلك نستدعي الدالّة radio.read لإرسال هذه البيانات إلى الوحدة الداخليّة.

وللتأكد من أنّ عملية الإرسال ستتمّ بطريقة صحيحة ،نقوم بإرسالها 3 مرّات ،وبذلك نتغلّب على المشكلة التي تنشأ من احتماليّة انشغال وحدة الاستقبال أثناء إرسال البيانات.

وبعد الانتهاء من عملية الإرسال، نقوم بوضع الأردوينو في وضع الخمول لفترة زمنيّة محدّدة ؛وذلك تقليلاً لاستهلاك الطاقة والحفاظ على عمر البطارية أكبر فترة ممكنة.

لنأتي الآن إلي الكود المحمَّل على وحدة الطقس الداخليّة .

الكود البرمجي : التحميل هنا

كما تلاحظ فإنّنا أدرجنا المكتبات المستخدمة في الوحدة الخارجيّة، بالإضافة إلى مكتبة وحدة الوقت الحقيقيّ DS3231 ،ومكتبة التحكّم في عرض OLED ،وهي مكتبة   U8G2

وكالمرة السابقة نقوم أيضا بتعريف المتغيّرات المتعلّقة بتلك المكتبات .الجديد هنا أنّنا نعرف القيم المستخدمة في عرض الرموز المتعلّقة بدرجة الحرارة والرطوبة على شاشة OLED ،وتكون على صيغة bitmap كما في الكود التالي .

الكود البرمجي : التحميل هنا

لعلك تتساءل كيف يمكننا إنشاء تلك القيم الغريبة والمعقَّدة، بالطبع لن نكتبها يدويّا ًبل سنستخدم برنامج GIMP ،وهو برنامج مفتوح المصدر لإنشاء الصور التي نريدها، ثم نقوم بتصديرها في صيغة xmb .

وبذلك يمكننا فتح الملف الناتج بأيّ محرر نصوص، كبرنامج notepad ،ثم نقوم بنسخ محتوياته إلى كود الأردوينو.

ويمكننا تخزين تلك القيم في ذاكرة flash عوضاً عن تخزينها في SRAM ،بإضافة المعدّل PROGMEM قبل المتغيّر.

static const unsigned char Temperature_20Icon_bits[] U8X8_PROGMEM // Save in the Flash memory 
static unsigned char Temperature_20Icon_bits[] // Save in the SRAM

نعود مرة أخرى إلى كود البرنامج حيث نقوم في دالّة (loop) بالتحقّق من استقبال بيانات عن طريق وحدة NRF24L01  ،فإذا استقبلت بنجاح نقوم بقراءتها باستخدام دالّة( radio.read) ،ومن ثم نخزّن أوّل حرفين في متغيّر الحرارة النصّي ،والحرفان الآخران نخزّنهما في متغيّر الرطوبة.

بعد ذلك نقوم باستخدام دالّة (millis) ؛لإظهار البيانات على الشاشة لفترة محدّدة -جعلناها هنا 3 ثواني – ،وما يميّز دالّة millis عن نظيرتها delay أنّها لا تعطّل تنفيذ البرنامج حتى تنقضي الفترة الزمنيّة ،ممّا سيؤدّي في حالتنا إلى فقدان البيانات المرسلة، فنحن هنا  نبدأ المؤقّت ونخزّنه في المتغيّرcurrentMillis  ،ثم نتابع في تنفيذ البرنامج ،ثم نقرأ قيمة المتغيّر مرّة أخرة ،ونرى هل تجاوزت القيمة المحدّدة أم لا، فإن تجاوزت نعيد قيمة المؤقّت إلى الصفر ،وبذلك نبدأ فترة انتظار جديدة.

ومن المكتبة U8G2 نستخدم الدالتين (nextpage )و (first page ) ؛لإظهار الخمس شاشات التي عرفناها سابقا.

وتقوم دالّة (drawCustom) بالحصول على قيم التاريخ والوقت من وحدة الوقت الحقيقيّ لتطبعها على الشاشة بانتظام، وتعمل دالّة  (drawInTemperature) على طباعة بيانات الحرارة القادمة من الوحدة الداخليّة ،وهكذا في باقي الدوالّ التالية لها.


المصدر:هنا
ترجمة:,عبدالرحمن صابر، مراجعة: علي العلي, تدقيق لغوي: رضوى أحمد, تصميم: علي العلي, تحرير: علي العلي