الدرس 96-1: مستشعر الضغط الجوي ودرجة الحرارة والارتفاع التقريبي BMP390 مع كود أردوينو الأساسي
يرشدك هذا الدليل خلال بناء نظام مراقبة بيئية عالي الدقة باستخدام مستشعر Bosch BMP390 وArduino. على عكس المستشعرات الأقدم مثل BMP180 أو BMP280، يوفر BMP390 دقة استثنائية، مما يجعله مثالياً للمشاريع التي تكون فيها التغيرات الصغيرة في الضغط أو الارتفاع مهمة. سيوضح لك هذا البرنامج التعليمي كيفية قراءة درجة الحرارة والضغط والارتفاع التقريبي، وعرض هذه البيانات على شاشات المراقبة التسلسلية وشاشات LCD، وحتى استخدام القراءات للتحكم في أجهزة أخرى مثل المرحلات.
هذا المشروع مثالي لمجموعة واسعة من التطبيقات. إليك بعض الأفكار لتبدأ بها:
- محطة الطقس: قم ببناء محطة طقس منزلية مدمجة ودقيقة لتتبع اتجاهات الضغط الجوي ودرجة الحرارة المحلية.
- مسجل الارتفاع والعلو: أنشئ جهازاً لقياس وتسجيل تغيرات الارتفاع، وهو مفيد للمشي لمسافات طويلة أو رحلات الطائرات بدون طيار أو حتى التحقق من طابق المبنى.
- وحدة تحكم ذكية في منظم الحرارة: استخدم قراءة درجة الحرارة للتحكم في سخان أو مبرد عبر مرحل، للحفاظ على نطاق درجة حرارة محدد.
- مراقب العلبة البيئية: راقب الظروف داخل حامل الخوادم أو الدفيئة أو علبة الطابعة ثلاثية الأبعاد وقم بتشغيل الإنذارات أو المراوح عند تجاوز الحدود.
-
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 أمر بسيط. لهذا الدليل، سنستخدم واجهة 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 طابقًا
++
/*
* 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");
}
الأشياء التي قد تحتاجها
-
أمازون
-
إي باي
-
علي إكسبريسBMP388 High Precision Digital Atmospheric Pressure on AliExpresss.click.aliexpress.com
-
علي إكسبريساشتريه من علي إكسبرسs.click.aliexpress.com
-
بانجودقم بشرائها من بانجود.banggood.com
الموارد والمراجع
-
خارجياشتره من أمازون كنداamzn.to
-
خارجي
-
خارجي
-
خارجياشتريه من علي إكسبرسs.click.aliexpress.com
-
خارجيصفحة المنتج الرسمية BMP390 من بوشbosch-sensortec.com
-
خارجيقم بشرائها من بانجود.banggood.com