راقب الطقس باستخدام Node.js و Raspberry Pi وشاشة LCD

ازداد عدد الأجهزة المنزلية الذكية المباعة بشكل مطرد خلال السنوات القليلة الماضية. ومن المتوقع بيع 1.5 مليار من هذه الأجهزة في عام 2021 . متوسط ​​عدد هذه الأجهزة لكل أسرة ذكية هو 8.7. لذلك ، من المحتمل جدًا أن يكون لديك على الأقل العديد من هذه الأجهزة في المنزل.



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







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



المتطلبات الأساسية



أريد أن أظهر على الفور ما حصلت عليه.



صورة


نظام مراقبة الطقس



قيد التنفيذ نظرًا لأن هذا مشروع DIY ، فأنت بحاجة إلى الحصول على بعض الأشياء قبل أن تتمكن من إعادة إنتاجه. وهي نتحدث عما يلي:



  • Raspberry Pi 3 (أو أعلى).
  • عرض شاشات الكريستال السائل.
  • توصيل الأسلاك.
  • المقاوم المتغير (اختياري).
  • اللوح (اختياري)


الآن دعنا نتحدث عن كيفية تجميعها جميعًا وإعدادها.



الخطوة الأولى. الاستعداد للعمل مع ClimaCell API وتوصيل الشاشة باللوحة



تتمثل الخطوة الأولى في عملنا في الحصول على مفتاح للوصول إلى ClimaCell API وتوصيل الشاشة باللوحة.



سنستخدم هنا ClimaCell Weather API كمصدر لبيانات الطقس . تتيح واجهة برمجة التطبيقات هذه الوصول إلى مجموعة متنوعة من المقاييس ، بما في ذلك مقاييس جودة الهواء.



للعمل مع ClimaCell API ، تحتاج إلى إنشاء حساب على موقع المشروع والحصول على مفتاح API الذي سيتم استخدامه لتوقيع الطلبات على النظام.





ClimaCell API حدود



التسجيل في النظام مجاني ، يمكنك عمل ما يصل إلى 100 طلب في الساعة ، وعدد الطلبات التي يمكن إجراؤها يوميًا يقتصر على 1000. وهذا أكثر من كافٍ لمشروعنا.



بمجرد أن يكون لدينا مفتاح API تحت تصرفنا ، يمكننا الانتقال إلى العمل مع مكونات الأجهزة والبدء في توصيل شاشة LCD بـ Raspberry Pi. قبل توصيل الشاشة باللوحة ، قم بإيقاف تشغيل الطاقة.



يظهر تخطيط منافذ GPIO على Raspberry Pi 3 في الشكل التالي.





Raspberry Pi 3 GPIO Port



Diagram هنا رسم تخطيطي لتوصيل الشاشة باللوحة.





رسم تخطيطي لتوصيل الشاشة باللوحة



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



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





مخطط الأسلاك المقاوم المتغير



بعد توصيل الشاشة باللوحة ، يمكننا تشغيل Raspberry Pi. إذا تم توصيل كل شيء بشكل صحيح ، فسيتم تشغيل الشاشة. وبمساعدة المقاوم المتغير ، يمكننا ضبط مستوى تباينه.



الخطوة 2. تحضير مشروع Node.js



وسوف يستند جزء البرمجيات مشروعنا على نود.جي إس . إذا لم يتم تثبيت هذا النظام الأساسي على Raspberry Pi حتى الآن ، فراجع هذا الدليل البسيط.



أنشئ مجلدًا جديدًا وقم بتشغيل الأمر فيه npm init -yلتهيئة مشروع Node.js جديد. ثم قم بتشغيل الأمر npm install lcd node-fetchلتثبيت التبعيتين اللتين نحتاجهما.



  • lcdسيتم استخدام الحزمة لتنظيم العمل مع شاشة LCD.
  • node-fetchنحتاج إلى الحزمة من أجل تقديم طلبات HTTP إلى ClimaCell API.


قيل أعلاه أننا بحاجة إلى مفتاح API للتفاعل مع ClimaCell API. يمكن وضع هذا المفتاح إما في رمز البرنامج ، أو في ملف خاص config.jsonمصمم لتخزين إعدادات المشروع.



في حالة config.jsonالاستخدام نتحدث عن إضافة ما يلي إليها:



"cc_key": "<your_ClimaCell_API_key>"}


الآن ، بعد استكمال مرحلة الإعداد الأولي لمشروع Node.js ، دعنا نضيف الكود التالي إلى ملفه الرئيسي:



// * 
const Lcd = require("lcd");
const fs = require("fs");
const fetch = require("node-fetch");

// *  
const { cc_key } = JSON.parse(fs.readFileSync("./config.json"));


الخطوة 3. العمل مع شاشة LCD



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



هذا هو الكود المسؤول عن العمل مع الشاشة.



const lcd = new Lcd({ rs: 26, e: 19, data: [13, 6, 5, 11], cols: 16, rows: 2 });

function writeToLcd(col, row, data) {
  return new Promise((resolve, reject) => {
    lcd.setCursor(col, row);
    lcd.print(data, (err) => {
      if (err) {
        reject();
      }
      resolve();
    });
  });
}


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



خصائص الكائن مع المعلمات colsو rowsتحديد عدد الأعمدة والصفوف من الشاشة. يستخدم شاشة 16 × 2. إذا كنت تستخدم شاشة عرض أخرى ، على سبيل المثال ، واحدة بها 8 أعمدة وصف واحد ، فاستبدل الرقمين 16 و 2 ، على التوالي ، بالرقمين 8 و 1. من



أجل عرض شيء ما على الشاشة ، يجب عليك استخدام طرق الكائن التالية بالتسلسل lcd:



  • lcd.setCursor() - اختيار الموضع الذي سيتم عرض البيانات منه.
  • lcd.print() - إخراج البيانات.


نضع استدعاءات لهذه الوظائف في وعد حتى نتمكن من استدعاء العمليات المقابلة بشكل غير متزامن باستخدام البنية غير المتزامنة / انتظار.



الآن ، يجب أن تكون قادرًا على عرض شيء ما على الشاشة. على سبيل المثال ، writeToLcd(0,0,'Hello World')يجب أن يؤدي تنفيذ الأمر إلى عرض النص على السطر الأول ، بدءًا من العمود الأول Hello World.



الخطوة 4: تنزيل معلومات الطقس وعرضها



لنبدأ في تنزيل معلومات الطقس وعرضها على الشاشة.



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



إذا كنت بحاجة إلى عرض الكثير من البيانات على مثل هذه الشاشة ، ويبدو هذا القيد قوياً للغاية ، يمكنك استخدام تأثير التمرير.



صورة

تأثير التمرير



هنا ، من أجل عدم تعقيد المشروع ، نقصر أنفسنا على عرض البيانات التالية على الشاشة:



  • التاريخ الحالي (ساعة ، دقيقة ، ثانية).
  • درجة الحرارة.
  • كثافة هطول الأمطار.


ها هو الكود المسئول عن تحميل البيانات وعرضها:



function getWeatherData(apiKey, lat, lon) {
  const url = `https://api.climacell.co/v3/weather/realtime?lat=${lat}&lon=${lon}&unit_system=si&fields=temp&fields=precipitation&apikey=${apiKey}`;

  const res = await fetch(url);
  const data = await res.json();
  return data;
}

async function printWeatherData() {
  const { temp, precipitation } = await getWeatherData(cc_key, 45.658, 25.6012);

  // *  
  await writeToLcd(0, 0, Math.round(temp.value) + temp.units);

  // *  
  const precipitationMessage =
    "Precip.: " + precipitation.value + precipitation.units;
  await writeToLcd(0, 1, precipitationMessage);


للحصول على بيانات الطقس من ClimaCell ، على سبيل المثال ، لمدينة معينة ، تحتاج إلى تمرير الإحداثيات الجغرافية إلى API - خطوط الطول والعرض.



للعثور على إحداثيات مدينتك ، يمكنك استخدام خدمة مجانية مثل latlong.net ثم حفظ الإحداثيات في ملف config.jsonمع مفتاح API. من الممكن تمامًا إدخال هذه البيانات مباشرة في الكود.



تبدو البيانات التي تم إرجاعها بواسطة API كما يلي:



{
  lat: 45.658,
  lon: 25.6012,
  temp: { value: 17.56, units: 'C' },
  precipitation: { value: 0.3478, units: 'mm/hr' },
  observation_time: { value: '2020-06-22T16:30:22.941Z' }
}


يمكن تحليل هذا الكائن ، باستخدام آلية تخصيص التدمير ، وبعد تلقي معلومات حول درجة الحرارة وهطول الأمطار ، يتم عرض هذه المعلومات في السطرين الأول والثاني من الشاشة.



الخطوة 5. استكمال المشروع



علينا فقط تعديل الكود ، وعند وصول بيانات جديدة ، قم بتحديث المعلومات المعروضة على الشاشة.



async function main() {
  await printWeatherData();

  setInterval(() => {
    printWeatherData();
  }, 5 * 60 * 1000);

  setInterval(async () => {
    await writeToLcd(8, 0, new Date().toISOString().substring(11, 19));
  }, 1000);
}

lcd.on("ready", main);

// *     ctrl+c,     .
process.on("SIGINT", (_) => {
  lcd.close();
  process.exit();
});


يتم تحديث بيانات الطقس كل 5 دقائق. ولكن نظرًا لأن ClimaCell يحد من عدد الطلبات المقدمة للخدمة إلى 100 طلب في الدقيقة ، فيمكننا المضي قدمًا وتحديث البيانات كل دقيقة.



يمكننا عرض الوقت بإحدى طريقتين:



  • يمكنك استخدام خاصية observation_timeالكائن القادمة من API وعرض وقت وصول البيانات.
  • يمكنك عمل ساعة حقيقية وعرض الوقت الحالي.


لقد اخترت الخيار الثاني ، ولكن يمكنك القيام بخلاف ذلك.



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



   -  ,   


يبلغ طول معلومات الوقت 8 أحرف ، وبما أن طول سطر العرض 16 حرفًا ، فأنت بحاجة إلى البدء في عرض هذه المعلومات في العمود رقم 8.



يتم تنظيم العمل مع الشاشة بشكل غير متزامن. لذلك ، لمعرفة وقت تهيئة العرض وجاهزيته للعمل ، يجب علينا استخدام طريقة المكتبة lcd.on().



أسلوب آخر موصى به للعمل مع الأنظمة المضمنة هو تحرير الموارد عند إنهاء البرنامج. هذا هو السبب في أننا نستخدم معالج الأحداث SIGINTلإصدار موارد العرض عند إنهاء البرنامج.



هناك أحداث أخرى مماثلة:



  • SIGUSR1و SIGUSR2- للاعتراض kill PID، مثل إعادة التشغيل nodemon.
  • uncaughtException - للقبض على الاستثناءات غير المعالجة.


الخطوة 6. تنظيم عملية النص المستمر



نصنا جاهز ويمكننا بالفعل تشغيل البرنامج. لكن لا يزال لدينا شيء نفعله قبل الاعتراف بالمشروع على أنه مكتمل.



في هذه المرحلة ، من المحتمل أنك متصل بـ Raspberry Pi باستخدام SSH ، أو بشكل مباشر. ولكن بغض النظر عن كيفية اتصالك باللوحة ، عند إغلاق الجهاز ، سيتوقف البرنامج.



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



لحل هذه المشكلات ، يمكننا استخدام مدير عمليات مثل pm2 .



إليك ما يجب فعله:



  • تثبيت pm2: sudo npm install pm2 -g
  • قم بإنشاء برنامج نصي لبدء التشغيل لـ pm2: sudo pm2 startup
  • إطلاق التطبيق: pm2 start index.js
  • حفظ قائمة العمليات بين عمليات إعادة تشغيل الخادم: pm2 save


يمكن الآن إعادة تشغيل Raspberry Pi. سيتم تشغيل البرنامج النصي بعد أن يصبح الجهاز جاهزًا للاستخدام.



النتيجة



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



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



هل تخطط لعمل شيء مشابه لما تمت مناقشته في هذه المادة؟






All Articles