جدول المحتويات:

نظام مراقبة الطقس IoT الموزع الذكي باستخدام NodeMCU: 11 خطوة
نظام مراقبة الطقس IoT الموزع الذكي باستخدام NodeMCU: 11 خطوة

فيديو: نظام مراقبة الطقس IoT الموزع الذكي باستخدام NodeMCU: 11 خطوة

فيديو: نظام مراقبة الطقس IoT الموزع الذكي باستخدام NodeMCU: 11 خطوة
فيديو: Water level monitoring system using IoT | IoT based water level using Nodemcu ESP8266 & ESP32 #iot 2024, يوليو
Anonim
نظام مراقبة الطقس IoT الموزع الذكي باستخدام NodeMCU
نظام مراقبة الطقس IoT الموزع الذكي باستخدام NodeMCU

قد تكون على دراية بمحطة الطقس التقليدية ؛ ولكن هل تساءلت يومًا كيف تعمل هذه الطريقة بالفعل؟ نظرًا لأن محطة الطقس التقليدية مكلفة وضخمة ، فإن كثافة هذه المحطات لكل وحدة مساحة أقل مما يساهم في عدم دقة البيانات. سأشرح لك كيف: لنفترض أن هناك محطة تقع في وسط مدينة وهي المحطة الوحيدة التي تقع في دائرة نصف قطرها 'x' متر ، يمكن أن تكون متحيزة بسهولة إذا كان هناك أي عامل يسبب التلوث في المنطقة المجاورة من المحطة تظهر منطقة نصف قطرها 'x' متر بالكامل على أنها ملوثة لأن هذه المحطة الوحيدة مسؤولة عن تحديد بيانات الطقس للمنطقة بأكملها.

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

هذا هو السبب في أن الحل الذي قدمته هو الحل الأمثل لهذه المشكلة ، فهو يكلف أقل من 10 دولارات ويستقر بسهولة على كفي.

كيف تعمل…

هناك 3 أجزاء رئيسية من هذا المشروع.

جانب الجهاز:

الجهاز عبارة عن وحدة IoT موضحة في الصورة والتي ترسل بيانات الطقس إلى الخادم كل فاصل زمني "x". تتضمن البيانات بيانات الطقس الفعلية والموقع الجغرافي للوحدة ؛ أي إحداثياتها وعنوان MAC الخاص بها ؛ لتعريف الجهاز بشكل فريد ، إصدار البرنامج الثابت الذي يعمل عليه حاليًا. يتكون جانب الجهاز من الوحدات النمطية N الموزعة عبر المنطقة التي تساهم بفاعلية في البيانات إلى الخادم.

جانب الخادم:

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

العميل / جانب المستخدم:

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

اللوازم

  • NodeMCU (ESP8266-12E)
  • DHT11 (مستشعر الرطوبة ودرجة الحرارة)
  • BMP180 (مستشعر الضغط ودرجة الحرارة)
  • MQ-135 (مستشعر مؤشر جودة الهواء)
  • كابل يو اس بي (لتحميل البرنامج)
  • مصدر طاقة 5 فولت
  • المكثفات (اختياري: يتم وضعها بالتوازي مع خط الطاقة)
  • Arduino IDE (لتصحيح البرنامج وتحميله)
  • تطبيق POSTMAN (اختياري: لتصحيح أخطاء API)
  • موقع ويب (لاستضافة PHP وخادم MySQL)

الخطوة 1: قم بتلحيم جميع المكونات وتحميل البرنامج إلى NodeMCU

لحام جميع المكونات وتحميل البرنامج إلى NodeMCU
لحام جميع المكونات وتحميل البرنامج إلى NodeMCU
لحام جميع المكونات وتحميل البرنامج إلى NodeMCU
لحام جميع المكونات وتحميل البرنامج إلى NodeMCU

قم بتلحيم جميع مكونات NodeMCU كما هو موضح في مخطط الدائرة على لوحة الأداء. أيضًا ، قم بلحام مكثف بالتوازي مع خطوط الطاقة نظرًا لأن الطاقة ترتفع أثناء نقل البيانات واستقبالها بشكل نشط.

بمجرد الانتهاء من عمل اللحام ، قم بتحميل الكود الموجود في ملف "code.c".

ملاحظة: لا تنس استبدال بيانات الاعتماد ببيانات الاعتماد الخاصة بك. ضع أيضًا الملف المسمى "html_file.h" داخل مجلد رسم اردوينو ، ويمكن العثور على جميع ملفات الرأس المستخدمة في هذا المشروع هنا

ميزات الكود:

نقطة الوصول: نظرًا لصعوبة برمجة كل وحدة باستخدام بيانات الاعتماد في الإنتاج الضخم ، تستضيف الوحدة صفحة ويب في التمهيد الأول لها لقبول بيانات اعتماد WiFi التي يجب على الوحدات الاتصال بها وتخزينها في EEPROM لاستخدامها لاحقًا.

بمجرد تكوين بيانات الاعتماد ، يتحقق NodeMCU من EEPROM بحثًا عن بيانات الاعتماد ويتصل ببيانات اعتماد WiFi الموجودة في EEPROM.

بعد الاتصال بنجاح بشبكة WiFi ، تبدأ NodeMCU في تحميل البيانات إلى الخادم كل فاصل زمني "x" ، وتتضمن البيانات بيانات الطقس ، وعنوان MAC للوحدة النمطية ، وإصدار البرنامج الثابت ، والموقع الجغرافي للجهاز.

تحديث OTA: تتحقق الوحدة أيضًا من تحديث البرنامج الثابت الجديد كل يوم في وقت محدد محدد في الكود. هذه الميزة مفيدة لأنه لا يمكن لأي مصنع الاستمرار وتغيير برنامج وحدة فردية في حالة وجود أي تغييرات يتعين إجراؤها.

Watchdog Timer: يجب أن يكون لدى Atlast طريقة لاستعادة نفسه دون أي تدخل بشري إذا تعطل أو تعطل. يمكن تحقيق ذلك باستخدام مؤقت المراقبة. طريقة عمل ذلك هي: هناك روتين فرعي للمقاطعة يتم تشغيله كل ثانية. يزيد ISR العداد في كل مرة يتم تنفيذه ويتحقق مما إذا كان العداد قد وصل إلى الحد الأقصى للعدد. بمجرد أن يصل العداد إلى القيمة القصوى ، تعيد الوحدة النمطية ضبط نفسها على افتراض أنها قد تعطلت. في التشغيل العادي ، يتم دائمًا إعادة ضبط العداد قبل أن يصل إلى الحد الأقصى للعد.

الخطوة 2: تكوين خادم SQL

تكوين خادم SQL
تكوين خادم SQL

يعد إعداد SQL Server أيضًا بسيطًا جدًا. ما عليك سوى إنشاء قاعدة بيانات في خادم SQL واستيراد الإعداد عن طريق استيراد الملف المسمى "database_structure.txt". يمكنك العثور على الملف في هذه الخطوة. نظرًا لأن التعليمات لا تسمح بتحميل ملفات ".sql" ، فقد أعدت تسمية الملف إلى ".txt".

ملاحظة: أعد تسمية الملف من ".txt" إلى ".sql".

الخطوة 3: تكوين خادم الملفات

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

نظرًا لأن Instructable لا يسمح بتحميل ملفات PHP ، فقد أعدت تسمية الملفات إلى ".txt".

ملاحظة: يرجى إعادة تسمية امتداد الملفات إلى ".php". ولا تنس أيضًا تغيير بيانات اعتماد ملف "config.php".

فقط قم بتحميل الملفات إلى الخادم وأنت على ما يرام.

سأقدم لك معلومات موجزة عن ملفات PHP.

db_config.php:

في هذا الملف ، يتم تخزين جميع بيانات الاعتماد المطلوبة للاتصال بخادم SQL.

db_connect:

في هذا الملف ، توجد الفئة المطلوبة لاتصال قاعدة البيانات.

insert.php:

تستدعي NodeMCU ملف PHP هذا لتحميل البيانات إلى الخادم باستخدام طريقة GET. هذا الملف مسؤول أيضًا عن تخزين نفس البيانات على خادم SQL.

استرداد.php:

يقوم المستخدم / العميل باستدعاء PHP باستخدام طريقة GET. يحسب الخادم المسافة بين المستخدم وجميع الوحدات. ثم يتم إرسال بيانات أقرب وحدة استجابة إلى العميل بتنسيق JSON / XML حسب ما يفضله العميل.

update.php:

يتم استدعاء ملف PHP هذا بواسطة الوحدة النمطية كل يوم في وقت محدد للتحقق مما إذا كانت الوحدة تعمل بأحدث إصدار من البرنامج الثابت. فقط ضع أحدث ملف ".bin" في خادم الملفات وحدد دليل الملف في متغير الملف.

إذا بدت هذه الملفات العديدة شاقة في البداية ، فقد قمت بتضمين وثائق المستخدم في الخطوة التالية.

الخطوة 4: وثائق المستخدم

وثائق المستخدم
وثائق المستخدم
وثائق المستخدم
وثائق المستخدم

مقدمة:

توفر واجهة برمجة تطبيقات الطقس واجهة بسيطة لطلب بيانات الطقس للمواقع الموجودة على سطح الأرض. أنت تطلب معلومات الطقس لزوج معين من خطوط الطول / العرض باستخدام تنسيق الإخراج المحدد. تقوم واجهة برمجة التطبيقات بإرجاع درجة الحرارة والرطوبة والضغط ومؤشر جودة الهواء الذي تم تسجيله آخر مرة بواسطة أقرب وحدة من الموقع المطلوب.

قبل ان تبدأ:

هذا المستند مخصص لمطوري مواقع الويب والأجهزة المحمولة الذين يرغبون في تضمين معلومات الطقس في تطبيق قيد التطوير. يقدم الاستخدام باستخدام API والمواد المرجعية على المعلمات المتاحة.

طلبات بيانات الطقس:

يتم إنشاء طلبات واجهة برمجة تطبيقات الطقس كسلسلة عنوان URL. تقوم واجهة برمجة التطبيقات بإرجاع بيانات الطقس لنقطة على الأرض ، يتم تحديدها بواسطة زوج من خطوط الطول / العرض. لاحظ أن دقة بيانات الطقس تتناسب طرديًا مع كثافة الوحدات الموضوعة في منطقة ما.

يأخذ طلب Weather API النموذج التالي:

example.com/retrieve.php؟lat=25.96446&lon=53.9443&format=json

حيث قد يكون تنسيق الإخراج (التنسيق) أيًا من القيم التالية:

  • JSON (موصى به) ، يشير إلى الإخراج في JavaScript Object Notation (JSON) ؛ أو
  • XML ، يشير إلى الإخراج في XML ، ملفوف داخل العقدة.

معلمات الطلب:

كما هو معتاد في جميع عناوين URL ، يتم فصل المعلمات باستخدام حرف العطف (&). يتم الإشارة إلى قائمة المعلمات وقيمها المحتملة أدناه.

المعلمات المطلوبة:

  • خط العرض: يمثل خط عرض لموقع للبحث عنه. (مثال: خط العرض = 19.56875)
  • lon: تمثل خط طول لموقع للبحث عنه. (مثال: lon = 72.97568)

معلمات اختيارية:

التنسيق: يحدد تنسيق إخراج الاستجابة لبيانات الطقس. يمكن أن يكون إما JSON أو XML. الافتراضي هو JSON. (على سبيل المثال format = json or format = xml)

استجابات الطقس:

لكل طلب صالح ، ستعرض خدمة المنطقة الزمنية استجابة بالتنسيق الموضح في عنوان URL للطلب. سيحتوي كل رد على العناصر التالية:

  • نجاح: قيمة تشير إلى حالة الاستجابة.

    • 0: سلبي ؛ يشير إلى أن الطلب غير صحيح.
    • 1: إيجابي ؛ يشير إلى أن الطلب كان ناجحًا.
  • message: سلسلة تشير إلى سبب خطأ الطلب. متاح فقط عندما تكون الحالة سلبية.
  • البيانات: مصفوفة ذات معلمات طقس متعددة.

    • درجة الحرارة: بيانات درجة الحرارة.
    • همهمة: بيانات وجود الرطوبة.
    • pres: بيانات الضغط المطلق.
    • aqi: مؤشر جودة الهواء الحالي.

يمكن رؤية استجابة الأمثلة لكلا التنسيقين في الصور.

الخطوة 5: إعداد الوحدة النمطية

إعداد الوحدة النمطية
إعداد الوحدة النمطية
إعداد الوحدة النمطية
إعداد الوحدة النمطية

يتم إنشاء نقطة وصول واستضافة صفحة ويب على عنوان IP (الافتراضي: 192.168.4.1) لتلقي بيانات الاعتماد من مدير / مستخدم الجهاز في التمهيد الأول أو إذا لم تعثر الوحدة النمطية على بيانات الاعتماد المخزنة بالفعل في إيبروم.

يحتاج المستخدم إلى إدخال SSID وكلمة المرور اللذين يريد المستخدم توصيل الوحدة بهما. يتم ملء خطوط الطول والعرض تلقائيًا إذا سمحت للمتصفح بالوصول إلى الموقع.

بمجرد إدخال جميع التفاصيل ، انقر فوق الزر "إرسال" ، ثم تتم كتابة جميع بيانات الاعتماد في ذاكرة التخزين المؤقت للوحدة النمطية.

هذه الخطوة مهمة للغاية لأنه أثناء إنتاج الوحدات بكميات كبيرة ، ليس من الممكن برمجة جميع الوحدات ببيانات الموقع الدقيقة وبيانات اعتماد WiFi. أيضًا ، لا يُنصح بترميز بيانات الاعتماد في البرنامج لأنه إذا احتجنا على الإطلاق إلى نقل الوحدة إلى موقع آخر أو نريد تغيير بيانات اعتماد WiFi ، فسنحتاج إلى إعادة برمجة الوحدة. لتجنب هذه المتاعب ، يتم تنفيذ وظيفة الإعداد الأولي.

الخطوة 6: حان الوقت الآن للمساهمة بالبيانات في السحابة

حان الوقت الآن للمساهمة بالبيانات في السحابة
حان الوقت الآن للمساهمة بالبيانات في السحابة
حان الوقت الآن للمساهمة بالبيانات في السحابة
حان الوقت الآن للمساهمة بالبيانات في السحابة

بعد اكتمال جميع الخطوات السابقة ، حان الوقت الآن للسماح للوحدة بتحميل البيانات إلى الخادم. يبدأ التحميل تلقائيًا بمجرد حفظ بيانات الاعتماد.

يستدعي "insert.php" باعتباره استدعاء API مع تمرير جميع المعلمات لإرسالها في طريقة GET.

يوضح مقتطف الشفرة أدناه كيفية معالجة المعلمات.

if (isset ($ _ GET ['temp']) && isset ($ _ GET ['hum']) && isset ($ _ GET ['pres']) && isset ($ _ GET ['aqi']) && isset ($ _ GET ['mac']) && isset ($ _ GET ['lat']) && isset ($ _ GET ['lon'])) 2. {3. // main program 4.}

هكذا تبدأ جميع الوحدات في تحميل البيانات.

ملاحظة: قم بخفض معدل التحميل في الكود إذا شعرت أن الخادم يتم تحميله بشكل زائد.

الخطوة السابعة: التحديث عبر الأثير (OTA)

تحديث عبر الأثير (OTA)
تحديث عبر الأثير (OTA)

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

للتحقق من وجود تحديث جديد ، تستدعي الوحدة "update.php" بإرسال عنوان MAC في رأس الطلب الخاص بها. يقوم الخادم بعد ذلك بالتحقق مما إذا كان عنوان MAC المحدد هذا يحتوي على أي تحديث جديد ، إذا كانت الإجابة بنعم ، فإنه يرسل الملف الثنائي لأحدث البرامج الثابتة ردًا على ذلك.

كما يتحقق أيضًا من جميع الرؤوس الضرورية المطلوبة للمصادقة الأساسية للوحدة.

الخطوة 8: كيف يمكن للمستخدم / العميل الوصول إلى البيانات …

كيف يمكن للمستخدم / العميل الوصول إلى البيانات …
كيف يمكن للمستخدم / العميل الوصول إلى البيانات …
كيف يمكن للمستخدم / العميل الوصول إلى البيانات …
كيف يمكن للمستخدم / العميل الوصول إلى البيانات …
كيف يمكن للمستخدم / العميل الوصول إلى البيانات …
كيف يمكن للمستخدم / العميل الوصول إلى البيانات …

من السهل جدًا الوصول إلى البيانات من الخادم. فقط عن طريق استدعاء "recovery.php" ، سوف نحصل على بيانات الطقس استجابةً بتنسيق JSON. بعد ذلك ، فإن الأمر يتعلق فقط بتحليل بيانات JSON للوصول إلى العناصر الفردية. مماثل مع استجابة XML. يمكن للمستخدم دائمًا تحديد التنسيق المفضل للاستجابة الذي يشعر المستخدم بالراحة في التعامل معه. إذا لم يحدد المستخدم التنسيق ، فإن التنسيق الافتراضي هو JSON.

يتم إجراء نموذج طلب باستخدام أداة POSTMAN للتحقق من عمل واجهة برمجة التطبيقات.

يظهر مثال لتحليل استجابة JSON في جافا سكريبت في مقتطف الشفرة أدناه.

var url = "https://example.com/retrieve.php؟lat=19.044848&lon=72.8464373"؛function httpGet (theUrl) {var xmlHttp = new XMLHttpRequest ()؛ xmlHttp.open ("GET"، theUrl، false) ؛ // خطأ للطلب المتزامن xmlHttp.send (فارغ) ؛ إرجاع xmlHttp.responseText ؛ } var myVar = httpGet (url) ؛ var obj = JSON.parse (myVar) ؛ document.getElementById ("aqi"). innerHTML = obj.data [0].aqi؛ document.getElementById ("temperature"). innerHTML = Math.round (obj.data [0].temp) + "° C"؛ document.getElementById ("temp"). innerHTML = Math.round (obj.data [0].temp) + "° C" ؛ document.getElementById ("الرطوبة"). innerHTML = Math.round (obj.data [0].hum) + "٪"؛ document.getElementById ("pressure"). innerHTML = Math.round (obj.data [0].pres) + "mb"؛

يتوفر الكود المصدري لمثال صفحة HTML التي تحلل استجابة JSON في نهاية هذه الخطوة.

ملاحظة: قم بتغيير امتداد الملف إلى ".html".

الخطوة 9: حدود هذا المشروع

  • يستخدم المشروع GET لإرسال البيانات ؛ على الرغم من أنها لا تتعامل مع بيانات حساسة ، إلا أنه يمكن التلاعب بالبيانات بسهولة نظرًا لعدم وجود أي آلية للتحقق من صحة المصدر باستثناء التحقق من الرؤوس ، والتي يمكن تعديلها بسهولة وحتى يمكن انتحال الجهاز العادي لتبدو وكأنها وحدة الطقس.
  • نظرًا لأن الوحدة تعتمد فقط وتعتمد على نقطة وصول أخرى (WIFI) لإرسال البيانات التي ستكون في معظم الحالات من المنظمات الأخرى. إذا كانت نقطة الوصول معطلة على الإطلاق في الخدمة لسبب ما ، فلن تتمكن الوحدة النمطية من إرسال البيانات.
  • على الرغم من أن المشروع مصمم لزيادة دقة النظام الحالي ، إلا أن المستشعر المتاح في السوق أقل دقة مما هو متوقع مما يؤدي إلى فشل غرضه الرئيسي.
  • أثناء التخطيط للمشروع ، خططت لتضمين وضع يقوم فيه الخادم بمتوسط قيمة البيانات بناءً على الموقع لتصحيح الخطأ. ولكن عند تنفيذ هذه الميزة ، أدركت أنها بحاجة إلى بعض واجهات برمجة التطبيقات التابعة لجهات خارجية لترجمة الإحداثيات إلى مناطق جغرافية.

الخطوة 10: مزيد من التحسينات التي يمكن إجراؤها على هذا المشروع

  • يمكن تحسين دقة الوحدة بشكل أكبر عن طريق تكييف المستشعرات خصيصًا لغرض محدد بدلاً من استخدام الوحدة العامة المتوفرة في السوق.
  • يمكن تعديل الوحدة لتعمل بشكل أكثر استقلالية باستخدام شريحة خاصة تتصل لاسلكيًا بأبراج الخلايا لإرسال البيانات وبالتالي تحسين القدرة على تحمل الأخطاء.
  • يمكن استخدام الألواح الشمسية ونظام البطارية جنبًا إلى جنب مع وضع السكون العميق لـ ESP وبالتالي تحسين كفاءة الطاقة وجعلها أكثر استقلالية عن مصدر طاقة خارجي.
  • يمكن استخدام POST لإرسال البيانات مع بعض آليات المصادقة مثل استخدام الرموز الدورية لكل عملية إرسال للبيانات.
  • بدلاً من NodeMCU ، وهي لوحة نماذج أولية ، يمكننا استخدام متحكم دقيق مخصص في الإنتاج الضخم والذي لا يقلل التكلفة فحسب ، بل يحقق أيضًا أفضل استخدام لموارد النظام.
  • بالاقتران مع واجهة برمجة تطبيقات تحديد الموقع الجغرافي من Google والاتصال بأي شبكة WIFI مفتوحة متاحة ، يمكن للوحدة أن تعمل دون تكوينها ؛ جاهز لنقل البيانات إلى المصنع دون الحاجة إلى أي إعداد على الإطلاق.

الخطوة 11: بضع كلمات للجمهور

كلمات قليلة للجمهور
كلمات قليلة للجمهور

مرحبًا يا رفاق ، أدرك أن هذا ليس برنامجًا تعليميًا مناسبًا للمبتدئين على الإطلاق لأنني لم أذكر كل التفاصيل التي يجب تغطيتها. وأيضًا هذا المشروع ضخم حقًا ليتم تغطيته في Instructable. ومع ذلك ، بذلت قصارى جهدي لتغطية كل جانب مهم من جوانب المشروع. أعلم أيضًا أن مقطع فيديو يعرض عمل المشروع كان سيكون رائعًا حقًا ، لكن نظرًا لأن هذا هو أول تدريب لي ولأكون صادقًا ، فهذا أول منشور لي لأي شيء مشابه لهذا ، كنت متوترة جدًا لأكون أمام الة تصوير.

إذا كنتم بحاجة إلى أي مساعدة في إنشاء هذا المشروع أو أي شيء مشابه لهذا ، فما عليك سوى التواصل معي على [email protected] أو يمكنك ترك تعليق كما هو الحال دائمًا. سأحاول مساعدتكم يا رفاق بأفضل ما في وسعي.

شكرا لك!!

موصى به: