سنسورهای فشار یکی از ابزارهای کاربردی در زمینه اندازه گیری فشار بارومتریک به شمار می روند. به کمک این سنسورها می توانید فشار هوای محیط را اندازه گیری نمود. یکی از سنسورهای پرکاربرد در زمینه اندازه گیری فشار، سنسور BMP280 است. به کمک این سنسور می توان میزان فشار بارومتریک را اندازه گیری نمود. در کنار این، این سنسور قابلیت اندازه گیری دمای محیط را در خود جای داده است. جهت راه اندازی و کار با این سنسور، کتابخانه تحت آردوینو توسعه یافته است. بدین ترتیب راه اندازی و کار با این سنسور بسیار ساده خواهد شد. در این آموزش به تحلیل و بررسی این کتابخانه می پردازیم. در ادامه با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک، همراه باشید.
نصب کتابخانه
به منظور استفاده از کتابخانه bmp280، ابتدا می بایست آن را نصب کنیم. در این قسمت به نصب کتابخانه سنسور شتاب سنج با جستجو در مخازن آردوینو می پردازیم. به همین منظور، ابتدا در نرم افزار آردوینو بر روی گزینه Tools و سپس Manage Libraries را کلیک کنید. پس از کلیک بر روی این گزینه، با تصویر زیر رو به می شوید. این منو کتابخانه های در دسترس را به شما نشان می دهد. شما نیز می توانید با جستجوی نام کتابخانه مورد نظر خود، آن را در مخازن آردوینو یافته و سپس نصب کنید.
مطابق فلش مشخص شده در تصویر فوق، در کادر جستجو عبارت 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 پرداختیم. این کتابخانه که برای سنسور با همین نام توسعه یافته است، روال کار و راه اندازی این سنسور را تسهیل و تسریع می بخشد. سنسور BMP280 یک سنسور کاربردی جهت اندازه گیری دما و فشار محیط است. در این آموزش به تحلیل و بررسی کتابخانه توسه یافته برای این سنسور پرداختیم. به کمک این کتابخانه می توانیم به سادگی و در سریعترین زمان ممکن، مقادیر فشار هوا و دمای محیط را اندازه گیری نماییم. در این آموزش ابتدا به نحوه نصب کتابخانه پرداختیم. در ادامه به الزامات فنی و بردهای مورد پشتیبانی پرداختیم. پس از این مرحله، به تحلیل و بررسی توابع کلیدی و کاربردی کتابخانه پرداختیم. در نهایت با ارائه مثالی، نحوه کاربرد توابع را مشاهده نمودیم.
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
سلام خیلی ممنون بابت توضیحات کامل
من سنسور رو راه اندازی کردم اما بشدت مقداری ناپایدار هستن، چطور میشه این مشکل رو حل کرد؟
ممنونم
سلام و متشکرم از شما
این مورد احتمال زیاد به سیم کشی دیتا و تغذیه ارتباط دارد. یک خازن با ظرفیت ۱۰۰۰ میکروفاراد با تغذیه سنسور موازی کنید، نتیجه را تست کرده و لطفا در کامنت بعد اعلام نمایید.
ممنونم از جوابتون
تغذیه رو که از خود برد nudmcu-32 میدم بهش و از ماژول bmp280 هم استفاده کردم که یعنی مدارش مشکل خاصی نداره.
نتیجه نهایی با وجود خازن هم تفاوت جدی نکرد.
اما یک سوال با توجه به این که ارتباط ماژول و میکرو دیجیتال هست سیم بندی این قسمت چقدر میتونه رو نتیجه نهایی موثر باشه؟
منظورم از ناپایداری تفاوت بیش از ۰٫۶-۰٫۷ متر و گاهی خیلی بیشتر در دو نمونه پشت سر هم هستش
خواهش می کنم
سیم کشی داده بسیار مهم است، لطفا روی هریک از پایه های SCL و SDA مقاومت پول آپ قرار داده و نتیجه را تست و لطفا در کامنت بعدی اعلام کنید.
ممنونم از راهنماییتون
باز هم خطا فاحش و من با چنتا ماژول تست کردم همین شکل بوده
مورد عجیبی شد!
از روش میانگیری استفاده کنید. صد نمونه بگیرید و میانگین آن را حساب کنیدو ببینید ایا مقادیر تغییری می کنند؟
واقعا ممنونم بابت وقتی که میذارید
پایداری سیستم شما به چه شکل هست؟
محل مورد استفاده من نیاز به سرعت زیاد داره من در همه ازمایش ها یکبار هم از ۵ نمونه میانگین گرفتم و نتایج رو عرض کردم.
ناگفته نماند از ماژول GY-91 استفاده میکنم
خواهش می کنم
ببخشید بابت تاخیر در پاسخگویی
خیلی دقیق نبوده، ولی خیلی هم غیر دقیق نیست. من با سرعت کم اندازه گرفتم. شاید با سنسورهای دیگر بتوان مشکل را برطرف کرد.