كود البحث

الدرس 96-1: مستشعر الضغط الجوي ودرجة الحرارة والارتفاع التقريبي BMP390 مع كود أردوينو الأساسي

الدرس 96-1: مستشعر الضغط الجوي ودرجة الحرارة والارتفاع التقريبي BMP390 مع كود أردوينو الأساسي

يرشدك هذا الدليل خلال بناء نظام مراقبة بيئية عالي الدقة باستخدام مستشعر Bosch BMP390 وArduino. على عكس المستشعرات الأقدم مثل BMP180 أو BMP280، يوفر BMP390 دقة استثنائية، مما يجعله مثالياً للمشاريع التي تكون فيها التغيرات الصغيرة في الضغط أو الارتفاع مهمة. سيوضح لك هذا البرنامج التعليمي كيفية قراءة درجة الحرارة والضغط والارتفاع التقريبي، وعرض هذه البيانات على شاشات المراقبة التسلسلية وشاشات LCD، وحتى استخدام القراءات للتحكم في أجهزة أخرى مثل المرحلات.

BMP380_pink-module-1

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

  • محطة الطقس: قم ببناء محطة طقس منزلية مدمجة ودقيقة لتتبع اتجاهات الضغط الجوي ودرجة الحرارة المحلية.
  • مسجل الارتفاع والعلو: أنشئ جهازاً لقياس وتسجيل تغيرات الارتفاع، وهو مفيد للمشي لمسافات طويلة أو رحلات الطائرات بدون طيار أو حتى التحقق من طابق المبنى.
  • وحدة تحكم ذكية في منظم الحرارة: استخدم قراءة درجة الحرارة للتحكم في سخان أو مبرد عبر مرحل، للحفاظ على نطاق درجة حرارة محدد.
  • مراقب العلبة البيئية: راقب الظروف داخل حامل الخوادم أو الدفيئة أو علبة الطابعة ثلاثية الأبعاد وقم بتشغيل الإنذارات أو المراوح عند تجاوز الحدود.
  • BMP380_pink-module-gravitiy-1

مكونات الأجهزة

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

  • Arduino Uno (أو لوحة مشابهة)
  • وحدة مستشعر الضغط الجوي BMP390
  • شاشة LCD1602 (16x2) أو LCD2004 (20x4) مع واجهة I2C
  • وحدة مرحل (للتجربة التوضيحية للتحكم)
  • أسلاك توصيل
  • لوحة تجارب (اختيارية، لتسهيل التوصيلات)

فهم مستشعر BMP390

BMP390 هو مستشعر صغير جداً وعالي الدقة من Bosch. حجمه الصغير (2.0 × 2.0 × 0.75 مم) يخفي قدراته المذهلة. يمكنه قياس الضغط من 300 هيكتوباسكال إلى 1250 هيكتوباسكال بدقة مطلقة تبلغ ±0.5 هيكتوباسكال. وهذا يترجم إلى دقة ارتفاع نسبية مذهلة تبلغ ±0.25 متر فقط، مما يجعله ترقية كبيرة عن أسلافه. تتضمن الوحدة التي تشتريها عادةً منظم جهد ومحول مستوى منطقي، مما يعني أنه من الآمن استخدامها مع منطق 3.3 فولت و5 فولت والطاقة، مما يبسط توصيلاتك. يتواصل عبر I2C أو SPI، وسنستخدم بروتوكول I2C الأبسط لهذا المشروع.

دليل التوصيل

BMP390_arduino_wiring_2-gravity-module-sda-scl-pins
BMP390_arduino_wiring_2-gravity-module
BMP390_arduino_wiring_pink-1-from-sda-scl-pins
BMP390_arduino_wiring_pink-2
BMP380_pink-module-4

توصيل BMP390 أمر بسيط. لهذا الدليل، سنستخدم واجهة I2C التي تتطلب أربعة أسلاك فقط. يوضح مخطط التوصيل أدناه التوصيلات الخاصة بـ Arduino Uno.

فيما يلي جدول التوصيل لوحدة BMP390:

وحدة BMP390 Arduino Uno
VIN (أو VCC) 5V (أو 3.3V)
GND GND
SDA A4 (SDA)
SCL A5 (SCL)

ملاحظة مهمة لمشاريع LCD: إذا كنت تستخدم أيضاً شاشة LCD، يمكنك تشغيل المستشعر من دبوس رقمي في Arduino. في الفيديو، يتم تعريف الدبوس 12 كدبوس طاقة للمستشعر، ويتم ضبطه على HIGH في الإعداد لتوفير 5 فولت. هذه طريقة ذكية لإدارة الطاقة بدون لوحة تجارب. يتم أيضاً توصيل SDA وSCL الخاصين بشاشة LCD بـ A4 وA5 على التوالي.

شرح الكود

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

1. تهيئة المكتبة والكائن

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

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BMP3XX.h"

Adafruit_BMP3XX bmp; // إنشاء كائن باسم 'bmp'

يمكنك تغيير اسم الكائن من bmp إلى أي اسم تريده، ولكن يجب عليك تحديث جميع الإشارات إليه في الكود. مكتبة Wire.h ضرورية للاتصال عبر I2C.

2. معايرة ضغط مستوى سطح البحر

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

#define SEALEVELPRESSURE_HPA (1013.25)

3. إعداد شاشة LCD

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

LiquidCrystal_I2C lcd(0x3F, 16, 2); // العنوان 0x3F، 16 حرفًا، سطران

إذا كنت تستخدم شاشة LCD بحجم 20x4، فغيّر 16, 2 إلى 20, 4. عنوان I2C 0x3F شائع، لكنه قد يختلف. إذا لم تعمل شاشتك، فقم بتشغيل ماسح I2C للعثور على العنوان الصحيح.

4. منطق التحكم (مثال على المرحل)

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

if(temperatureC >38.0)
{
 digitalWrite(10, HIGH); // تشغيل المرحل
}else{
 digitalWrite(10, LOW); // إيقاف تشغيل المرحل
}

5. دالة مخصصة: readValues()

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

void readValues()
{
  temperatureC = bmp.temperature; // قراءة درجة الحرارة بالسيليسيوس
  temperatureF = bmp.temperature * 9/5 + 32; // تحويل إلى فهرنهايت
  temperatureK = bmp.temperature + 273.15; // تحويل إلى كلفن
  altitude = bmp.readAltitude(SEALEVELPRESSURE_HPA); // قراءة الارتفاع بالأمتار
  pressure = bmp.pressure / 100.0F; // قراءة الضغط بالهكتوباسكال
}

عرض توضيحي مباشر للمشروع

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

بعد ذلك، يعرض البيانات المعروضة على كل من شاشتي LCD بحجم 16x2 و20x4، مع التنقل بين درجة الحرارة بالسيليسيوس والفهرنهايت، والضغط بالهكتوباسكال، والارتفاع التقريبي. ثم يعرض تطبيق التحكم في المرحل، مع ضبط درجة حرارة بداية تبلغ 30 درجة مئوية ودرجة حرارة إيقاف تبلغ 45 درجة مئوية. يؤدي تطبيق الحرارة على المستشعر إلى إيقاف تشغيل المرحل بمجرد تجاوز درجة الحرارة 45 درجة مئوية، ويعود للعمل عندما تنخفض درجة الحرارة إلى أقل من 30 درجة مئوية.

أخيرًا، يقوم باختبار ارتفاع مثير للإعجاب. يقيس أولاً الارتفاع عند مستوى الأرض (حلبة تزلج على الجليد)، والتي تقرأ حوالي -15 مترًا. ثم ينتقل إلى الطابق الخامس والعشرين من مبنى قريب ويأخذ قياسًا آخر. يبلغ المستشعر عن ارتفاع يبلغ حوالي 57.2 مترًا. الفرق بين القراءتين يبلغ حوالي 72 مترًا، وهو ما يتوافق جيدًا مع الارتفاع المتوقع لمبنى من 25 طابقًا. هذا يُظهر قدرة المستشعر العملية على قياس تغيرات الارتفاع التقريبية.

الفصول

  • [00:00] مقدمة ونظرة عامة على المشروع
  • [01:19] تقديم مستشعر BMP390 وميزاته
  • [03:43] مواصفات المستشعر من الشركة المصنعة
  • [05:45] مخطط توصيل BMP390 مع Arduino Uno
  • [07:48] مخطط توصيل BMP390 مع شاشة LCD
  • [09:46] توصيلات اتصال SPI
  • [10:29] تثبيت المكتبات المطلوبة
  • [11:38] شرح الكود الأساسي
  • [15:46] إضافة منطق التحكم (مثل تشغيل مرحل)
  • [17:30] شرح الكود لشاشة LCD
  • [25:09] كود لشاشة LCD بحجم 20x4 واتصال SPI
  • [26:22] عرض مباشر: تسخين المستشعر
  • [28:05] عرض مع شاشات LCD
  • [29:42] عرض مع شاشة LCD بحجم 20x4
  • [30:07] عرض التحكم في المرحل باستخدام مسدس حراري
  • [32:12] اختبار ارتفاع واقعي في مبنى من 25 طابقًا

الصور

BMP380_pink-module-4
BMP380_pink-module-4
BMP380_pink-module-3-size
BMP380_pink-module-3-size
BMP380_pink-module-2
BMP380_pink-module-2
BMP380_pink-module-1
BMP380_pink-module-1
BMP380_pink-module-gravitiy-1
BMP380_pink-module-gravitiy-1
BMP390_arduino_wiring_2-gravity-module-sda-scl-pins
BMP390_arduino_wiring_2-gravity-module-sda-scl-pins
BMP390_arduino_wiring_2-gravity-module
BMP390_arduino_wiring_2-gravity-module
BMP390_arduino_wiring_pink-1-from-sda-scl-pins
BMP390_arduino_wiring_pink-1-from-sda-scl-pins
BMP390_arduino_wiring_pink-2
BMP390_arduino_wiring_pink-2
434-Lesson 96-1: Basic code for BMP390
اللغة: C++
++
/*
 * Lesson 96: Using Precision BMP390 Barometric Pressure and Temperature Sensor
 * with Arduino
Download and resource page https://robojax.com/RJT454


 * Watch video instruction on YouTube:  https://youtu.be/XevQYG_A5xA
 * 
 * Code updated by Ahmad Shamshiri for Robojax.com
 * on Jan 13, 2022 at 17:10 in Ajax, Ontario, Canada
  
  This video is part of Arduino Step by Step Course which starts here: https://youtu.be/-6qSrDUA5a8
 

  This is a library for the BMP390 temperature & pressure sensor

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

  These sensors use I2C or SPI to communicate, 2 or 4 pins are required
  to interface.

  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_BMP3XX.h"


#define SEALEVELPRESSURE_HPA (1013.25)
float temperatureC, temperatureK, temperatureF, pressure, altitude;

Adafruit_BMP3XX bmp;

void setup() {
  Serial.begin(9600);
  while (!Serial);
  Serial.println("Adafruit BMP388 / BMP390 test");

  if (!bmp.begin_I2C()) {   // hardware I2C mode, can pass in address & alt Wire
  Serial.println("Could not find a valid BMP3 sensor, check wiring!");
    while (1);
  }

  // Set up oversampling and filter initialization
  bmp.setTemperatureOversampling(BMP3_OVERSAMPLING_8X);
  bmp.setPressureOversampling(BMP3_OVERSAMPLING_4X);
  bmp.setIIRFilterCoeff(BMP3_IIR_FILTER_COEFF_3);
  bmp.setOutputDataRate(BMP3_ODR_50_HZ);
}

void loop() {
  if (! bmp.performReading()) {
    Serial.println("Failed to perform reading :(");
    return;
  }
  readValues();

 Serial.print("Temperature C: ");
 Serial.print(temperatureC);
 printDegree();
 Serial.println(" C");

 Serial.print("Pressure: ");
 Serial.print(pressure);
 Serial.println(" hPa");

 Serial.print("Approximate Altitude: ");
 Serial.print(altitude);
 Serial.println(" m");
 Serial.println();
 

 
  if(temperatureC >38.0)
  {
   digitalWrite(10, HIGH); 

   
  }else{
    digitalWrite(10, LOW);
  }
  delay(2000);
}




/*
 *  readValues()
 * @brief reads the temperature based on the TEMPERATURE_UNIT
 * @param average temperature
 * @return returns one of the values above
 * Written by Ahmad Shamshiri for robojax.com
 * on Jan 15, 2022 at 08:02 in Ajax, Ontario, Canada
 */
void readValues()
{
 //Robojax.com  BMP390 

  temperatureC = bmp.temperature;// return Celsius
  temperatureF = bmp.temperature *9/5 + 32;//convert to Fahrenheit 
  temperatureK = bmp.temperature + 273.15;//convert to Kelvin
  altitude =  bmp.readAltitude(SEALEVELPRESSURE_HPA);// read altitude
  pressure = bmp.pressure / 100.0F; // get  pressure in hecto pascal
  

}// readValues()





/*
 * @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()
{
    Serial.print("\\xC2"); 
    Serial.print("\\xB0");  
}

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

ملفات📁

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