تحلیل کتابخانه

تحلیل و بررسی کتابخانه BMP280

bmp280-arduino-library-digispark
نوشته شده توسط معین صابری

سنسورهای فشار یکی از ابزارهای کاربردی در زمینه اندازه گیری فشار بارومتریک به شمار می روند. به کمک این سنسورها می توانید فشار هوای محیط را اندازه گیری نمود. یکی از سنسورهای پرکاربرد در زمینه اندازه گیری فشار، سنسور BMP280 است. به کمک این سنسور می توان میزان فشار بارومتریک را اندازه گیری نمود. در کنار این، این سنسور قابلیت اندازه گیری دمای محیط را در خود جای داده است. جهت راه اندازی و کار با این سنسور، کتابخانه تحت آردوینو توسعه یافته است. بدین ترتیب راه اندازی و کار با این سنسور بسیار ساده خواهد شد. در این آموزش به تحلیل و بررسی این کتابخانه می پردازیم. در ادامه با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک، همراه باشید.

 


نصب کتابخانه


به منظور استفاده از کتابخانه bmp280، ابتدا می بایست آن را نصب کنیم. در این قسمت به نصب کتابخانه سنسور شتاب سنج با جستجو در مخازن آردوینو می پردازیم. به همین منظور، ابتدا در نرم افزار آردوینو بر روی گزینه Tools و سپس Manage Libraries را کلیک کنید. پس از کلیک بر روی این گزینه، با تصویر زیر رو به می شوید. این منو کتابخانه های در دسترس را به شما نشان می دهد. شما نیز می توانید با جستجوی نام کتابخانه مورد نظر خود، آن را در مخازن آردوینو یافته و سپس نصب کنید.

روش نصب کتابخانه PCF8574.h - دیجی اسپارک

 

مطابق فلش مشخص شده در تصویر فوق، در کادر جستجو عبارت bmp280 را تایپ کنید. پس از چند لحظه با تصویر زیر رو به رو می شوید. در این مرحله، کتابخانه مشخص شده با کادر قرمز رنگ را با کلیک بر روی گزینه install، نصب کنید.

 


الزامات و نکات فنی


در این قسمت به بررسی نکات فنی کتابخانه BMP280 می پردازیم. توجه داشته باشید که این کتابخانه بر روی بردهای زیر، توسط توسعه دهنده تست و اجرا شده است.

 

میکروکنترلر تست شده و سازگاری دارد سازگاری ندارد تست نشده نکات
Atmega328 @ 16MHz بله
Atmega328 @ 12MHz بله
Atmega32u4 @ 16MHz بله  از پایه های D2 و D3 به عنوان پایه های I2C استفاده شود.
Atmega32u4 @ 8MHz بله از پایه های D2 و D3 به عنوان پایه های I2C استفاده شود.
ESP8266 بله از پایه های GOIO4 و GPIO5 به عنوان ارتباط I2C استفاده کنید.  از طرفی دیگر به کمک تابع wire.begin(scl,sda) می توانید پایه های دلخواه را به عنوان I2C انتخاب کنید.
Atmega2560 @ 16MHz بله از پایه های ۲۰ و ۲۱ به عنوان ارتباط I2C انتخاب کنید.
ATSAM3X8E بله از پایه های ۲۰ و ۲۱ به عنوان ارتباط I2C استفاده گردد.
ATSAM21D بله
ATtiny85 @ 16MHz کار نمی کند
ATtiny85 @ 8MHz کار نمی کند

پس از بررسی نکات و الزامات فنی، نوبت به بررسی وتحلیل توابع می رسد. قسمت بعدی به این موضوع می پردازد.

 


توابع کلیدی و کاربردی کتابخانه BMP280


در این قسمت توابع کلیدی و کاربردی کتابخانه BMP280 مشاهده می شود. در این جدول، ورودی های توابع از چپ به راست ورودی اول، ورودی دوم و…. نامیده می شوند.

 

شرح ورودی ها تابع
به کمک این تابع سنسور راه اندازی می گردد. بدون ورودی  () bool begin
به کمک این تابع دما را از سنسور خوانده و در خروجی قرار می دهیم بدون ورودی float readTemperature()
به کمک این تابع فشار هوا بر حسب پاسکال خوانده شده و در خروجی قرار می گیرد. بدون ورودی float readPressure(void)
به کمک این تابع ارتفاع خوانده شده و در خروجی قرار می گیرد. توجه داشته باشید که برای محاسبه ارتفاع، باید در ورودی فشار سطح دریا لحاظ شود. در صورتیکه ورودی این تابع را خالی بگذارید، مقدار پیشفرض(۱۰۱۳۲٫۲۵( در نظر گرفته خواهد شد. ورودی از نوع عدد اعشاری   float readAltitude(float seaLevelhPa = 1013.25)
به کمک این تابع می توانید فشار سطح دریا را از ارتفاع  و فشار مشخص شده در ورودی محاسبه کرده و در خروجی مشاهده نمایید. ورودی نخست از نوع اعشاری

ورودی دوم از نوع عدد اعشاری

float seaLevelForAltitude(float altitude, float atmospheric)
به کمک این تابع می توانید نقطه جوش آب را با توجه به فشار قرار گرفته در ورودی، محاسبه کرده و در خروجی قرار دهید. ورودی از نوع اعشاری float waterBoilingPoint(float pressure)
به کمک این تابع می توانید نرخ نمونه برداری و سایر تنظیمات در اندازه گیری ها را تنظیم نمایید.

ورودی اول: تنظیم مد کاری با مقدار پیشفرض نرمال

—————-

ورودی دوم: نرخ نمونه برداری دما با مقدار پیشفرض ۱۶x

—————-

ورودی سوم: نرخ نمونه برداری فشار هوا با مقدار پیشفرض ۱۶x

————–

ورودی چهارم: فیلتر داده ها که در حالت پیشفرض این مقدار خاموش است.

————

ورودی پنجم: مدت زمان جهت نمونه برداری که به صورت پیشفرض یک میلی ثانیه است.

 

ورودی های این تابع سنسور را جهت اندازه گیری پارامترهای مختلف، کانفیگ می کند. void setSampling(sensor_mode mode = MODE_NORMAL,

sensor_sampling tempSampling = SAMPLING_X16,

sensor_sampling pressSampling = SAMPLING_X16,

sensor_filter filter = FILTER_OFF,

standby_duration duration = STANDBY_MS_1)

 

برای تابع setSampling، همانطور که مشاهده نمودید ورودی های مختلفی تعیین کننده هستند. در این قسمت به تعریف مقادیر معتبر برای ورودی می پردازیم.  قسمت های بعدی به این موضوع می پردازد.

 


مقادیر معتبر sensor_sampling


شرح مقدار
نمونه برداری در حالت نرمال SAMPLING_NONE = 0x00,
نمونه برداری با سرعت ۱x SAMPLING_X1 = 0x01
نمونه برداری با سرعت ۲x SAMPLING_X2 = 0x02
نمونه برداری با سرعت ۴x SAMPLING_X4 = 0x03
نمونه برداری با سرعت ۸x SAMPLING_X8 = 0x04
نمونه برداری با سرعت ۱۶x    SAMPLING_X16 = 0x05

 


مقادیر معتبر sensor_mode


 

شرح مقدار
قرارگیری سنسور در حالت sleep MODE_SLEEP = 0x00
قرارگیری سنسور در حالت forced MODE_FORCED = 0x01
قرارگیری سنسور در حالت نرمال MODE_NORMAL
ریست کردن سنسور MODE_SOFT_RESET_CODE

 


مقادیر معتبر sensor_filter


 

شرح مقدار
بدون فیلتر FILTER_OFF = 0x00
فیلتر با ۲x FILTER_X2 = 0x01
فیلتر با ۴x FILTER_X4 = 0x02
فیلتر با ۸x FILTER_X8 = 0x03
فیلتر با ۱۶x   FILTER_X16 = 0x04

 


مقادیر معتبر standby_duration


 

 

خواندن داده ها به مدت ۱ میلی ثانیه STANDBY_MS_1 = 0x00
خواندن داده ها به مدت ۶۲٫۵ میلی ثانیه STANDBY_MS_63 = 0x01
خواندن داده ها به مدت ۱۲۵ میلی ثانیه STANDBY_MS_125 = 0x02
خواندن داده ها به مدت ۲۵۰ میلی ثانیه   STANDBY_MS_250 = 0x03
خواندن داده ها به مدت ۵۰۰ میلی ثانیه STANDBY_MS_500 = 0x04
خواندن داده ها به مدت ۱۰۰۰ میلی ثانیه STANDBY_MS_1000 = 0x05
خواندن داده ها به مدت ۲۰۰۰ میلی ثانیه    STANDBY_MS_2000 = 0x06
خواندن داده ها به مدت ۴۰۰۰ میلی ثانیه STANDBY_MS_4000 = 0x07

 

 پس از بررسی توابع کلیدی و کاربردی کتابخانه، به اجرای یک نمونه برنامه ساده می پردازیم. در قسمت بعدی به این موضوع می پردازیم.

 


اجرای یک نمونه برنامه


پس از بررسی توابع کلیدی، نوبت به اجرای یک نمونه برنامه می رسد. در این برنامه میزان فشار هوا و دمای محیط اندازه گیری شده و در سریال مانیتور نمایش داده می شود.

#include <Wire.h>
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp; // ایجاد یک شی جهت ارتبط I2C با سنسور
void setup() {
  Serial.begin(9600);
  Serial.println(F("BMP280 test"));
  if (!bmp.begin()) {  //راه اندازی سنسور
    Serial.println(F("ERROR IN RUNNING SENSOR!"));
    while (1) delay(10);
  }

  //تنظیم مقادیر نمونه برداری
  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,     /* Operating Mode. */
                  Adafruit_BMP280::SAMPLING_X2,     /* Temp. oversampling */
                  Adafruit_BMP280::SAMPLING_X16,    /* Pressure oversampling */
                  Adafruit_BMP280::FILTER_X16,      /* Filtering. */
                  Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */
}

void loop() {
    Serial.print(F("Temperature = "));
    Serial.print(bmp.readTemperature());  //خواندن دما
    Serial.println(" *C");

    Serial.print(F("Pressure = "));
    Serial.print(bmp.readPressure());  //خواندن فشار
    Serial.println(" Pa");
}

 


اشکالات متداول در راه اندازی کتابخانه


هنگام کامپایل برنامه و راه اندازی ممکن است به خطایی با عبارت زیر برخورید.

Adafruit_BusIO.h: no such file or directory

عبارت فوق به معنای عدم نصب یکی از کتابخانه هاست. برای این منظور، این کتابخانه را مشابه روش نصب کتابخانه، باید نصب کنید. به این منظور در منوی جستجوی کتابخانه، با تایپ عبارت Adafruit_Bus، می توانید کتابخانه را نصب نمایید.

 


لوازم متناسب با کتابخانه


سنسور فشار BMP280

انواع برد آردوینو

انواع برد ESP

 


جمع بندی


در این آموزش به تحلیل و بررسی کتابخانه BMP280 پرداختیم. این کتابخانه که برای سنسور با همین نام توسعه یافته است، روال کار و راه اندازی این سنسور را تسهیل و تسریع می بخشد. سنسور BMP280 یک سنسور کاربردی جهت اندازه گیری دما و فشار محیط است.  در این آموزش به تحلیل و بررسی کتابخانه توسه یافته برای این سنسور پرداختیم. به کمک این کتابخانه می توانیم به سادگی و در سریعترین زمان ممکن، مقادیر فشار هوا و دمای محیط را اندازه گیری نماییم. در این آموزش ابتدا به نحوه نصب کتابخانه پرداختیم. در ادامه به الزامات فنی و بردهای مورد پشتیبانی پرداختیم. پس از این مرحله، به تحلیل و بررسی توابع کلیدی و کاربردی کتابخانه پرداختیم. در نهایت با ارائه مثالی، نحوه کاربرد توابع را مشاهده نمودیم.

 

چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریع‌ترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند می‌توانید از همین طریق اطلاع رسانی کنید.

 

درباره نویسنده

معین صابری

کارشناسی ارشد رشته معماری سیستم های کامپیوتری

مالي که ز تو کس نستاند، علم است
حرزي که تو را به حق رساند، علم است
جز علم طلب مکن تو اندر عالم
چيزي که تو را ز غم رهاند، علم است
(شیخ بهایی)

تبادل نظر و رفع عیب با ثبت دیدگاه

۷ دیدگاه

  • سلام خیلی ممنون بابت توضیحات کامل
    من سنسور رو راه اندازی کردم اما بشدت مقداری ناپایدار هستن، چطور میشه این مشکل رو حل کرد؟
    ممنونم

    • سلام و متشکرم از شما
      این مورد احتمال زیاد به سیم کشی دیتا و تغذیه ارتباط دارد. یک خازن با ظرفیت ۱۰۰۰ میکروفاراد با تغذیه سنسور موازی کنید، نتیجه را تست کرده و لطفا در کامنت بعد اعلام نمایید.

      • ممنونم از جوابتون
        تغذیه رو که از خود برد nudmcu-32 میدم بهش و از ماژول bmp280 هم استفاده کردم که یعنی مدارش مشکل خاصی نداره.
        نتیجه نهایی با وجود خازن هم تفاوت جدی نکرد.
        اما یک سوال با توجه به این که ارتباط ماژول و میکرو دیجیتال هست سیم بندی این قسمت چقدر میتونه رو نتیجه نهایی موثر باشه؟
        منظورم از ناپایداری تفاوت بیش از ۰٫۶-۰٫۷ متر و گاهی خیلی بیشتر در دو نمونه پشت سر هم هستش

        • خواهش می کنم
          سیم کشی داده بسیار مهم است، لطفا روی هریک از پایه های SCL و SDA مقاومت پول آپ قرار داده و نتیجه را تست و لطفا در کامنت بعدی اعلام کنید.

          • ممنونم از راهنماییتون
            باز هم خطا فاحش و من با چنتا ماژول تست کردم همین شکل بوده

            • مورد عجیبی شد!
              از روش میانگیری استفاده کنید. صد نمونه بگیرید و میانگین آن را حساب کنیدو ببینید ایا مقادیر تغییری می کنند؟

              • واقعا ممنونم بابت وقتی که میذارید
                پایداری سیستم شما به چه شکل هست؟
                محل مورد استفاده من نیاز به سرعت زیاد داره من در همه ازمایش ها یکبار هم از ۵ نمونه میانگین گرفتم و نتایج رو عرض کردم.
                ناگفته نماند از ماژول GY-91 استفاده میکنم

                • خواهش می کنم
                  ببخشید بابت تاخیر در پاسخگویی
                  خیلی دقیق نبوده، ولی خیلی هم غیر دقیق نیست. من با سرعت کم اندازه گرفتم. شاید با سنسورهای دیگر بتوان مشکل را برطرف کرد.