كود البحث

الدرس 45: مستشعر BME280 للرطوبة والضغط الجوي ودرجة الحرارة مع شاشة LCD

الدرس 45: مستشعر BME280 للرطوبة والضغط الجوي ودرجة الحرارة مع شاشة LCD

يرشدك هذا الدليل خلال بناء محطة مراقبة بيئية شاملة باستخدام مستشعر BME280 وشاشة LCD بتقنية I2C. يُعد مستشعر BME280 مستشعرًا متعدد الاستخدامات وعالي الدقة يقيس الضغط الجوي والرطوبة ودرجة الحرارة في حزمة واحدة مدمجة. من خلال إقرانه بشاشة LCD حرفية بحجم 16x2 أو 20x4، يمكنك إنشاء شاشة عرض مستقلة وفي الوقت الفعلي لمجموعة واسعة من المشاريع.

وحدة BMP280-2

تكمن قيمة هذا البناء في بساطته وفائدته. بدلاً من الحاجة إلى جهاز كمبيوتر لقراءة بيانات المستشعر، توفر شاشة LCD قراءة مرئية فورية ودائمة التشغيل. وهذا يجعله مثاليًا للتطبيقات العملية مثل:

BME280 مع شاشة LCD: الضغط والارتفاع التقريبي
BME280 مع شاشة LCD: الضغط والارتفاع التقريبي
  • بناء محطة أرصاد جوية مكتبية لمراقبة المناخ الداخلي المحلي لديك.
  • إنشاء مراقب للضغط الجوي لتتبع اتجاهات الطقس والتنبؤ بالتغيرات قصيرة المدى.
  • تطوير شاشة عرض لوحدة تحكم دفيئة صغيرة لإظهار درجة الحرارة والرطوبة لنباتاتك.
  • صنع مركز أتمتة منزلية يعرض مستوى الراحة الحالي في الغرفة.
  • بناء أداة تعليمية للتعرف على اتصال I2C وقراءة المستشعرات وعرض البيانات باستخدام Arduino.

يُعد هذا المشروع خطوة تالية مثالية للصنّاع الذين لديهم بعض الخبرة مع Arduino ويريدون تجاوز مصابيح LED الوامضة الأساسية. تم تنظيم الكود المقدم مع دوال خاصة، مما يسهل عرض البيانات بتنسيقات متعددة (سيليزيوس، فهرنهايت، كلفن) وبوحدات مختلفة، مما يمنحك تحكمًا كاملاً في مخرجات العرض لديك.

المكونات المطلوبة

لإكمال هذا المشروع، ستحتاج إلى المكونات التالية. جميعها شائعة ومتوفرة بسهولة من موردي الإلكترونيات.

  • Arduino Uno (أو أي لوحة متوافقة مثل Mega أو Nano)
  • وحدة مستشعر BME280 (إصدار I2C)
  • شاشة LCD1602 (16x2) أو LCD2004 (20x4) مع وحدة واجهة I2C
  • أسلاك توصيل (M-M)
  • لوحة تجارب (اختيارية، لتسهيل التوصيلات)

قبل البدء، يُنصح بشدة بمشاهدة الدروس المنفصلة لمستشعر BME280 ووحدة LCD بتقنية I2C. يضمن ذلك تثبيت المكتبات اللازمة واختبار كل مكون على حدة، مما يبسط استكشاف الأخطاء وإصلاحها إذا واجهت مشكلات. (في الفيديو عند 00:44)

دليل التوصيل

توصيل BME280 مع Arduino وشاشة LCD1602 أو LCD204

يعتمد هذا المشروع على جهازين منفصلين بتقنية I2C. تتيح ناقل I2C توصيل أجهزة متعددة باستخدام خطي بيانات فقط (SDA وSCL) بالإضافة إلى الطاقة والأرضي. وهذا يجعل التوصيل مباشرًا للغاية.

يتم توصيل مستشعر BME280 بمنفذي 5V وGND في Arduino. يتم توصيل منفذي SDA وSCL بمنفذي A4 وA5 في Arduino على التوالي. يتم توصيل وحدة LCD بنفس الطريقة. نظرًا لأن كلا الجهازين على نفس ناقل I2C، فإنهما يتشاركان نفس المنفذين A4 (SDA) وA5 (SCL). هذه ميزة رئيسية لـ I2C—يمكنك توصيل ما يصل إلى 128 جهازًا على نفس الناقل ثنائي الأسلاك. (في الفيديو عند 03:41)

من التفاصيل المهمة أن منفذ VIN لمستشعر BME280 غير متصل مباشرة بخط 5V. بدلاً من ذلك، يتم توصيله بمنفذ رقمي (المنفذ 12 في الكود). يتم ذلك حتى يتمكن Arduino من التحكم في طاقة المستشعر، وتشغيله فقط عند الحاجة، وهو ما يمكن أن يكون مفيدًا للتطبيقات منخفضة الطاقة. يضبط الكود هذا المنفذ على HIGH في الإعداد لتوفير الطاقة للمستشعر. (في الفيديو عند 05:48)

فيما يلي ملخص للتوصيلات:

  • BME280 VIN -> منفذ 12 في Arduino
  • BME280 GND -> GND في Arduino
  • BME280 SCL -> A5 في Arduino
  • BME280 SDA -> A4 في Arduino
  • LCD VCC -> 5V في Arduino
  • LCD GND -> GND في Arduino
  • LCD SCL -> A5 في Arduino
  • LCD SDA -> A4 في Arduino

بالنسبة للوحات Arduino المختلفة، قد تختلف منافذ I2C. على سبيل المثال، على Arduino Mega، يكون SDA هو المنفذ 20 وSCL هو المنفذ 21. (في الفيديو عند 03:50)

شرح الكود

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

أولاً، ستحتاج إلى تثبيت مكتبتين. الأولى هي مكتبة Adafruit_BME280، التي تتعامل مع جميع الاتصالات منخفضة المستوى مع المستشعر. الثانية هي مكتبة LiquidCrystal_I2C، التي تتيح لك التحكم بسهولة في شاشة LCD. يمكن تثبيت كلتيهما عبر مدير المكتبات في بيئة تطوير Arduino IDE. (في الفيديو عند 04:11)

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


#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme; // I2C
  • SEALEVELPRESSURE_HPA: يحدد هذا الثابت الضغط الجوي القياسي عند مستوى سطح البحر بالهكتوباسكال (hPa). هذه القيمة ضرورية لحساب الارتفاع التقريبي. قد ترغب في تعديلها إلى قيمة محلية أكثر دقة لتحسين دقة الارتفاع.
  • Adafruit_BME280 bme;: هذا السطر ينشئ كائنًا من مستشعر BME280، والذي ستستخدمه للتفاعل مع المستشعر في جميع أنحاء الكود الخاص بك.

بعد ذلك، ستحدد الدبوس الخاص بتغذية المستشعر وعنوان I2C الخاص بشاشة LCD. عنوان I2C مهم جدًا. يمكنك العثور على عنوان وحدة LCD الخاصة بك عن طريق تشغيل رسم المسح الضوئي I2C. في الفيديو، يُظهر الماسح الضوئي عنوانين: واحد للمستشعر (0x76) وواحد للشاشة (0x3F). (في الفيديو عند 06:37)


#define BME_VIN_PIN 12 // دبوس لتغذية BME280 VIN
LiquidCrystal_I2C lcd(0x3F, 16, 2); // تعيين عنوان LCD إلى 0x3F لشاشة 16 حرفًا وسطرين
  • BME_VIN_PIN: يحدد هذا الدبوس الرقمي (الدبوس 12) المستخدم لتغذية مستشعر BME280. يمكنك تغييره إلى أي دبوس رقمي آخر متاح.
  • LiquidCrystal_I2C lcd(0x3F, 16, 2);: ينشئ هذا كائن شاشة LCD. المعامل الأول هو عنوان I2C الذي وجدته باستخدام الماسح الضوئي. المعاملان الثاني والثالث يحددان عدد الأعمدة والصفوف على شاشتك. إذا كنت تستخدم شاشة 20x4، فستغيّر هذا إلى lcd(0x3F, 20, 4);. (في الفيديو عند 08:22)

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


float getBME(char type)
{
   // Robojax.com BME280 Code YouTube Watch it here http://robojax.com/L/?id=338
  float value;
    float temp = bme.readTemperature();// قراءة درجة الحرارة
    float pressure = bme.readPressure() / 100.0F; // قراءة الضغط
    float rel_hum = bme.readHumidity();// قراءة الرطوبة
    float alt =bme.readAltitude(SEALEVELPRESSURE_HPA);// قراءة الارتفاع
   if(type =='F')
   {
    value = temp *9/5 + 32;// تحويل إلى فهرنهايت
   }else if(type =='K')
   {
    value = temp + 273.15;// تحويل إلى كلفن
   }else if(type =='H')
   {
    value = rel_hum;// إرجاع الرطوبة النسبية
   }else if(type =='P')
   {
    value = pressure;// إرجاع الضغط
   }else if(type =='A')
   {
    value = alt;// إرجاع الارتفاع التقريبي
   }else{
    value = temp;// إرجاع درجة الحرارة بالسيليسيوس
   }
   return value;
    // Robojax.com BME280 Code YouTube Watch it here http://robojax.com/L/?id=338
}//getBME

لاستخدام هذه الدالة، ببساطة استدعها مع الحرف المناسب. على سبيل المثال، للحصول على درجة الحرارة بالفهرنهايت، ستستدعي getBME('F'). الخيارات المتاحة هي:

  • 'C': يُرجع درجة الحرارة بالسيليسيوس (الافتراضي).
  • 'F': يُرجع درجة الحرارة بالفهرنهايت.
  • 'K': يُرجع درجة الحرارة بالكلفن.
  • 'H': يُرجع الرطوبة النسبية بالنسبة المئوية.
  • 'P': يُرجع الضغط الجوي بالهكتوباسكال.
  • 'A': يُرجع الارتفاع التقريبي بالأمتار.

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

عرض المشروع المباشر

بمجرد رفع الكود، ستعرض شاشة LCD أولاً رسالة ترحيب لمدة ثانيتين قبل بدء الحلقة الرئيسية. ثم ستتنقل الشاشة عبر عدة شاشات، تعرض كل منها بيانات مختلفة من المستشعر. (في الفيديو عند 09:57)

في العرض التوضيحي، سترى درجة الحرارة معروضة بالسيليسيوس والفهرنهايت والكلفن، مع الوحدة المناسبة ورمز الدرجة حيثما ينطبق. تعرض الشاشة أيضًا الرطوبة كنسبة مئوية، والضغط الجوي بالهكتوباسكال (hPa)، والارتفاع التقريبي بالأمتار. يُظهر الفيديو قراءة 44 درجة سيليسيوس، و165 درجة فهرنهايت، ورطوبة 20%، وكلها تتحدث بشكل صحيح على الشاشة. (في الفيديو عند 16:50)

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

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

فصول الفيديو

  • [00:00] مقدمة ونظرة عامة على المشروع
  • [00:44] المتطلبات الأساسية والمكتبات المطلوبة
  • [02:19] توصيل BME280 وLCD بـ Arduino
  • [04:11] تثبيت المكتبات المطلوبة
  • [05:06] شرح الكود: التضمينات وتعريفات الدبابيس
  • [06:37] العثور على عنوان I2C لشاشة LCD الخاصة بك
  • [08:32] شرح الكود: دالة الإعداد
  • [10:22] شرح الكود: الحلقة الرئيسية ومنطق العرض
  • [12:34] شرح الكود: دالة getBME() المخصصة
  • [14:52] شرح الكود: دالة عرض LCD المخصصة
  • [16:50] عرض المشروع المباشر
  • [18:18] الخاتمة والخطوات التالية

الصور

BME280 مع شاشة LCD: الضغط والارتفاع التقريبي
BME280 مع شاشة LCD: الضغط والارتفاع التقريبي
BMP280-mobule-2
BMP280-mobule-2
BMP280-mobule-1
BMP280-mobule-1
BME280 Arduino wiring with LCD1602 or LCD204
BME280 Arduino wiring with LCD1602 or LCD204
500-Lesson 45: BME280 Humidity, Barometric Pressure, and Temperature Sensor with LCD
اللغة: C++
/***************************************************************************
 * Robojax Arduino Step By Step Course
 * Part 4: Temperature Sensors
 * Lesson 37: BME280 code with two extra functions to display temperature easily
 
* Written and updated by Ahmad Shamshiri on July 25, 2019 at 18:42 
* in Ajax, Ontario, Canada for Robojax.com

  Please watch video instructions here https://youtu.be/zqJRNGECAvw
 This code is available at http://robojax.com/course1/?vid=lecture37
 
With over 100 lectures free on YouTube. Watch it here http://robojax.com/L/?id=338
Get the code for the course: http://robojax.com/L/?id=339  

If you found this tutorial helpful, please support me so I can continue creating.
Make a donation using PayPal http://robojax.com/L/?id=64


  This is a library for the BME280 humidity, temperature & pressure sensor

  Designed specifically to work with the Adafruit BME280 Breakout
  ----> http://www.adafruit.com/products/2650

  These sensors use I2C or SPI to communicate, 2 or 4 pins are required
  to interface. The device's I2C address is either 0x76 or 0x77.

  Adafruit invests time and resources providing this open source code,
  please support Adafruit and open-source hardware by purchasing products
  from Adafruit!

  Written by Limor Fried & Kevin Townsend for Adafruit Industries.
  BSD license, all text above must be included in any redistribution
 ***************************************************************************/

#include <Wire.h>

#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme; // I2C



void setup() {
    Serial.begin(9600);
    Serial.println(F("BME280 test"));

    bool status;
    
    // default settings
    // (you can also pass in a Wire library object like &Wire2)
    status = bme.begin();  
    if (!status) {
        Serial.println("Could not find a valid BME280 sensor, check wiring!");
        while (1);
    }
    
    Serial.println("-- Robojax Test --");
    delay(2000);

    Serial.println();
}


void loop() { 
    // Robojax.com BME280 Code YouTube Watch it here http://robojax.com/L/?id=338
    Serial.print("Temperature = ");
    Serial.print(getBME('C'));
    printDegree();
    Serial.print("C ");
    Serial.print(getBME('F'));
    printDegree();
    Serial.print("F "); 
    Serial.print(getBME('K'));
    Serial.println("K ");       


    Serial.print("Pressure = ");
    Serial.print(getBME('P'));
    Serial.println(" hPa ");

    Serial.print("Humidity = ");
    Serial.print(getBME('H'));
    Serial.println("% ");
    
    Serial.print("Approx. Altitude = ");
    Serial.print(getBME('A'));
    Serial.println(" m");



    Serial.println();

    // action
    if(getBME('C') <65.2)
    {
     //digitalWrite(5, HIGH); 
    }
    delay(2000);
     // Robojax.com BME280 Code YouTube Watch it here http://robojax.com/L/?id=338
}// loop end



/*
 * @brief returns temperature or relative humidity
 * @param "type" is character
 *     C = Celsius
 *     K = Kelvin
 *     F = Fahrenheit
 *     H = Humidity
 *     P = Pressure
 *     A = Altitude
 * @return returns one of the values above
 * Usage: to get Fahrenheit type: getHTU('F')
 * to print it on serial monitor Serial.println(getBME('F'));
 * Written by Ahmad Shamshiri on July 13, 2019. Updated July 25, 2019
 * in Ajax, Ontario, Canada
 * www.Robojax.com 
 */
float getBME(char type)
{
   // Robojax.com BME280 Code YouTube Watch it here http://robojax.com/L/?id=338
  float value;
    float temp = bme.readTemperature();// read temperature
    float pressure = bme.readPressure() / 100.0F; // read pressure
    float rel_hum = bme.readHumidity();// read humidity
    float alt =bme.readAltitude(SEALEVELPRESSURE_HPA);// read altitude
   if(type =='F')
   {
    value = temp *9/5 + 32;//convert to Fahrenheit 
   }else if(type =='K')
   {
    value = temp + 273.15;//convert to Kelvin
   }else if(type =='H')
   {
    value = rel_hum;//return relative humidity
   }else if(type =='P')
   {
    value = pressure;//return pressure
   }else if(type =='A')
   {
    value = alt;//return approximate altitude
   }else{
    value = temp;// return Celsius
   }
   return value;
    // Robojax.com BME280 Code YouTube Watch it here http://robojax.com/L/?id=338
}//getBME


/*
 * @brief prints degree symbol on serial monitor
 * @param none
 * @return returns nothing
 * Written by Ahmad Shamshiri on July 13, 2019
 * for Robojax Tutorial Robojax.com
 */
 void printDegree()
{
   // Robojax.com Code
    Serial.print("\\xC2"); 
    Serial.print("\\xB0");  
}

الأشياء التي قد تحتاجها

الموارد والمراجع

ملفات📁

ورقة البيانات (pdf)