سنسور فشار بارومتریک BMP180، یک سنسور بزرگ است که در پیشبینی هوا، سنجش ارتفاع و محاسبهی سرعت عمودی به کار میرود. به همین منظور از این سنسور در ایستگاههای هوایی، وسایل کنترل از راه دور، بالنهای هوایی و پروژههای بسیار دیگری استفاده میشود. این سنسور همچنین دارای حساسیت بسیار بالایی نیز میباشد به طوری که تغییرات ارتفاع حتی در حد چند اینچ را نیز به خوبی تشخیص میدهد.
در این مقاله به شما یاد میدهیم که چگونه سنسور BMP180 را نصب و راهاندازی کرده و فشار بارومتریک و ارتفاع از زمین یا سطح دریا را محاسبه کنید.
اما قبل از بیان جزییات، دربارهی فشار بارومتریک و نحوهی کار سنسور BMP180 اطلاعاتی را ارائه میکنیم.
فشار بارومتریک چیست؟
فشار باررومتریک (یا همان فشار جوّی) فشاری است که در اثر وزن ناشی از هوای بالای سطح زمین به وجود میآید. یک ستون از هوا از سطح زمین تا بالای جو را در نظر بگیرید. این مقدار از هوا دارای جرم است بنابرین گرانش زمین باعث میشود که آن مقدار هوا، فشاری متناسب با جرم خود بر سطح زمین وارد کند.
به فشار ناشی از ستون اینچی از هوا که از سطح زمین تا انتهای جو کشیده شده را یک جو (اتمسفر atm) میگویند. این ستون از هوا وزنی معادل ۱۴.۷ پوند دارد لذا یک اتمسفر معادل ۱۴.۷ پوند در هر مربع یک اینچی (psi) میباشد.
واحد استاندارد فشار، پاسکال (Pa) است. یک پاسکال معادل فشاری است که یک نیوتن بر یک متر مربع میباشد. سنسور BMP180 فشار را بر حسب پاسکال قرائت میکند اما با کتابخانههای نرمافزاری میتوان خروجی آن را به هکتوپاسکال (hPa) تبدیل کرد. با استفاده از جدول زیر میتوان فشار برحسب هکتوپاسکال را به سایر واحدهای رایج فشار تبدیل نمود.
واحد |
یک هکتوپاسکال برابر است با |
پاسکال |
100 |
نیوتن در هر متر مربع |
100 N/m |
جو (اتمسفر) |
0.000986923 atm |
بار |
0.001 bar |
میلی بار |
1 m bar |
میلیمتر جیوه |
0.750063755 mmHg |
تور |
0.750061683 torr |
پوند در هر اینچ مربع |
psi 0.014503774 |
فشارسنج BMP180 چگونه کار میکند؟
فشار سنج BMP180 از نوع سنسورهای پیزومقاومتی است. سنسورهای پیزومقاومتی از مواد نیمههادی (معمولا سیلیکون) ساخته شدهاند که در هنگام وارد شدن نیروی مکانیکی مانند فشار جوّی، مقاومت را تغییر میدهند.
دما، چگالی گازهایی همچون هوا را تغییر میدهد از این رو سنسور BMP180 به طور همزمان فشار و دما را اندازهگیری میکند. در دماهای بالا چگالی هوا کم بوده و سنگین نیست در نتیجه سنسور فشار کمتری را گزارش میکند. به طور معکوس در دماهای پایینتر چگالی هوا بیشتر بوده و سنگینتر است لذا سنسور عدد بالاتری را برای فشار گزارش میدهد. سنسور، دما را به صورت بلادرنگ محاسبه میکند تا تغییرات چگالی هوا را در فشار گزارش شده لحاظ کند.
سنسور BMP180 یک عدد به عنوان دمای جبران نشده (UT) و یک عدد به عنوان فشار جبران نشده (UP) در خروجی خود نمایش میدهد. لازم به ذکر است که محاسبات دمایی بر محاسبات فشار تقدم دارند. شکل زیر نمودار مربوط به عملکرد این سنسور را نمایش میدهد.
سنسور BMP180، صدو هفتاد وشش (176) بیت EEPROM دارد که شامل ۱۱ ضریب کالیبره شده مختلف است که مختص هر سنسور میباشد. اعداد گزارش شده به عنوان UT و UP برای محاسبهی دمای بارومتریک و فشار بارومتریک واقعی به کار میروند. بدین منظور الگوریتمهای پیچیدهای استفاده میشود.
- مقاله کمکی: انواع حافظهها
محاسبات ریاضی بالا توسط کتابخانهای که ما به کار بردیم انجام میشود لذا لازم نیست کد جداگانهای برای آن نوشته شود.
سنسوری که در این مقاله از آن استفاده کردهایم مربوط به Adafruit میباشد که از آن در فشارسنج بارومتریک BM180 بوش بهره برده شده است.
فشارسنج BMP180 بوش با ولتاژ ۳.۳ ولت کار میکند اما بسیاری از بردها دارای یک تنظیم کننده ولتاژ و انتقال دهندهی سطح I2C است لذا برای راه اندازی آنها میتوان از ولتاژ ۳.۳ ولت یا ۵ ولتی استفاده نمود.
نمودار مربوط به پینهای این سنسور در شکل زیر به نمایش در آمده است.
اتصال سنسور BMP180 به آردوینو
فشارسنج BMP180 از طریق I2C با آردوینو ارتباط برقرار میکند. پایههای I2C آردوینو (یعنی SDA و SCL) متناسب با نوع آردوینو متفاوت است. جدول زیر نحوه ی اتصال پایههای مذکور را برای چند بورد آردوینو مرسوم مشخص میکند.
آردوینو |
پایه ی SDA |
پایه ی SCL |
Uno |
A4 |
A5 |
Nano |
A4 |
A5 |
Mini |
A4 |
A5 |
101 |
SDA |
SCL |
Zero |
SDA |
SCL |
Leonardo |
2 |
3 |
Micro |
2 |
3 |
Duo |
20 |
21 |
Mega |
20 |
21 |
برای آردوینو مدل Uno اتصالات به صورت زیر میباشد.
در مثال بالا BMP180 به منبع ولتاژ ۵ ولتی متصل شده است اما شما میتوانید آن را به ۳.۳ ولت نیز متصل کنید.
نصب کتابخانهی BMP180
قبل از استفاده از سنسور BMP180 بایستی کتابخانهی مربوط به آن را بارگیری و نصب کنید. ما از کتابخانهی بسیار کاربردی Sparkfun استفاده میکنیم. این کتابخانه شامل تمام عملیاتهای ریاضی مورد نیاز برای محاسبه دما و فشار میباشد.
شما میتوانید فایل زیپ کتابخانه را از این لینک دریافت نمایید. برای نصب آن آردوینو IDE را باز کرده و به آدرس Sketch > Include Library > Add Library بروید و سپس فایل زیپی را که بارگیری کردهاید انتخاب کنید.
استفاده از فشارسنج بارومتریک برای پیشبینی هوا
از تغییرات فشار بارومتریک هوا میتوان وضعیت هوا را پیش بینی نمود. با حرکت تودهای هوا از سطح زمین به سمت بالای جو، فشار بارومتریک کاهش مییابد. خلا ایجاد شده به دلیل بالا رفتن تودهی هوا یک سطح کم فشار نزدیک به زمین به وجود میآورد. تودهی هوا هر چه از زمین فاصله بگیرد، سردتر شده و فشرده میگردد. در نتیجه بخار آب میعان شده و قطرات باران را به وجود میآورند. همچنین به دلیل حرکت هوا از سطح به سمت جو، احتمال تشکیل باد نیز بالا میرود.
بالا رفتن فشار بارومتریک در شرایطی اتفاق میافتد که تودهای از هوا از مناطق بالای جو به سمت سطح زمین حرکت کند. وزن ناشی از تودهی هوای مذکور به سطح زمین، نیرو وارد کرده و موجب افزایش فشار بارومتریک میشود. تودهی هوا با نزدیک شدن به سطح زمین گرمتر شده و حجم آن افزایش مییابد. تودهی هوای گرم معمولا رطوبت کمتری دارد لذا شرایط تشکیل ابر مهیا نمیشود. افزایش فشار بارومتریک معمولا نشان دهندهی هوای آفتابی است.
نمایش فشار و دما در نمایشگر سریال
با استفاده از کد زیر میتوان فشار و دمای بارومتریک را در نمایشگر سریال نشان داد.
#include <Wire.h>
#include <SFE_BMP180.h>
SFE_BMP180 bmp180;
void setup() {
Serial.begin(9600);
bool success = bmp180.begin();
if (success) {
Serial.println("BMP180 init success");
}
}
void loop() {
char status;
double T, P;
bool success = false;
status = bmp180.startTemperature();
if (status != 0) {
delay(1000);
status = bmp180.getTemperature(T);
if (status != 0) {
status = bmp180.startPressure(3);
if (status != 0) {
delay(status);
status = bmp180.getPressure(P, T);
if (status != 0) {
Serial.print("Pressure: ");
Serial.print(P);
Serial.println(" hPa");
Serial.print("Temperature: ");
Serial.print(T);
Serial.println(" C");
}
}
}
}
}
با بالا و پایین بردن سنسور میتوانید تغییرات فشار هوا را در نمایشگر مشاهده کنید و میزان حساسیت بالای آن را مشاهده نمایید.
این فشار بارومتریک در مکان فعلی و ارتفاع شما میباشد. فشار بارومتریک متناسب با شرایط هوای منطقه و ارتفاع تغییر میکند. برای مقایسهی نتیجهای که بدست آوردید با نتایج ایستگاههای هوایی و اخبار و … شما بایستی اثرات ارتفاع را از عدد خود حذف کنید. به دلیل اینکه تمام اعداد گزارش شده توسط اخبار و ایستگاههای هوایی بر حسب ارتفاع از سطح دریا گزارش میشوند.
کتابخانهی Sparkfun دارای یک تابع (sealevel (P, A است که بایستی ارتفاع خود را از سطح دریا مشخص کنید. در کد زیر ازتفاع در خط ۶ بر حسب متر وارد میشود.
#include <Wire.h>
#include <SFE_BMP180.h>
SFE_BMP180 bmp180;
int Altitude = 5; //current altitude in meters
void setup() {
Serial.begin(9600);
bool success = bmp180.begin();
if (success) {
Serial.println("BMP180 init success");
}
}
void loop() {
char status;
double T, P;
bool success = false;
status = bmp180.startTemperature();
if (status != 0) {
delay(1000);
status = bmp180.getTemperature(T);
if (status != 0) {
status = bmp180.startPressure(3);
if (status != 0) {
delay(status);
status = bmp180.getPressure(P, T);
if (status != 0) {
float comp = bmp180.sealevel(P, Altitude);
Serial.print("Pressure: ");
Serial.print(comp);
Serial.println(" hPa");
Serial.print("Temperature: ");
Serial.print(T);
Serial.println(" C");
}
}
}
}
}
ارتفاع فعلی ما از سطح دریا ۵ متر است که اختلاف نسبتا کمی است اما اثر خود را بر ارتفاع میگذارد.
توضیحات مربوط به کد
در ابتدا بایستی یک شی با نام bmp180 بسازیم.
SFE_BMP180 bmp180;
برای مقداردهی اولیه سنسور bmp180 و بارگیری ضریب کالیبراسیون ما لازم داریم که تابع ()begin را صدا بزنیم. این تابع یک مقدار غیرصفر برمیگرداند.
bool success = bmp180.begin();
مطابق با نموداری که در قسمتهای قبل نشان داده شد، ابتدا لازم است تابع دما را ()startTemperature صدا بزنیم تا محاسبات دمایی آغاز شود. این تابع یک مقدار غیرصفر برمیگرداند.
status = bmp180.startTemperature();
سپس باید به مدت ۴.۵ میلیثانیه صبر کرده و از تابع (getTemperature(T برای دریافت و ذخیرهی آن در متغیر T استفاده کنیم.
status = bmp180.getTemperature(T);
سپس تابع ()getPressure را فراخوانی میکنیم تا مقدار فشار را خوانده و در متغیر P ذخیره نماید.
status = bmp180.getPressure(P, T);
همانطور که مشاهده میکنید در تابع بالا از عدد مربوط به دما هم استفاده کردیم چون محاسبات به دما وابسته میباشد.
استفاده از فشارسنج بارومتریک برای محاسبهی ارتفاع
فشار بارومتریک متناسب با ارتفاعی که سنسور در آن قرار گرفته، تغییر میکند. در ارتفاعهای کمتر هوای بیشتری بالای سنسور قرار گرفته در نتیجه فشار بیشتر است. به طور معکوس در ارتفاعات بالاتر هوای کمتری بالای سنسور قرار گرفته در نتیجه فشار کمتر است. به طور تقریبی با تغییر ارتفاع به اندازهی ۸ متر فشار جوَی هوا حدود یک hPa تغییر میکند. در مثالی که در ادامه آورده شده ما از فشار سنج BMP180 برای مشخص کردن ارتفاع استفاده میکنیم.
ارتفاع میتواند با استفاده از فرمول بارومتریک جهانی به صورت زیر محاسبه شود.
خوشبختانه کتابخانه این محاسبات را انجام میدهد لذا لازم نیست به طور جداگانه برای آن اقدامی انجام دهیم.
فشار جوَی در موقعیت فعلی شما توسط BMP180 محاسبه میشود. فشار جوّی در سطح دریا برابر است با فشار جوی در ارتفاع شما منهای اثر ارتفاع بر فشار هوا. که مقدار آن را به دو روش میتوان محاسبه کرد. یکی از روشهای دقیق، استفاده از سنسور BMP180 است که در ادامه آن را توضیح خواهیم داد و روش دیگر استفاده از نقشهی برخط است که در این لینک گفته شده است.
ارتفاع متناسب با سطح دریا
کد زیر ارتفاع شما بر حسب دریا را نمایش میدهد. برای این کار لازم است فشار جوّی موقعیت فعلی خود را در سطح دریا در خط ۵ وارد کنید.
float Po = 1013.0;
کد:
#include <Wire.h>
#include <SFE_BMP180.h>
SFE_BMP180 bmp180;
float Po = 1013.0;
void setup() {
Serial.begin(9600);
bool success = bmp180.begin();
if (success) {
Serial.println("BMP180 init success");
}
}
void loop() {
char status;
double T, P, alt;
bool success = false;
status = bmp180.startTemperature();
if (status != 0) {
delay(1000);
status = bmp180.getTemperature(T);
if (status != 0) {
status = bmp180.startPressure(3);
if (status != 0) {
delay(status);
status = bmp180.getPressure(P, T);
if (status != 0) {
alt = bmp180.altitude(P, Po);
Serial.print("Altitude: ");
Serial.print(alt);
Serial.println(" Meters");
}
}
}
}
}
پنجرهی سریال دستگاه خود را باز کنید و ارتفاع متناسب با سطح دریا را در آن مشاهده کنید.
ارتفاع متناسب با سطح زمین
برای پروژههایی مثل ارتفاع سنج، شما لازم است ارتفاع سنسور خود را از سطح زمین بسنجید. برای این کار باید فشار جوّی موقعیت فعلی خود (و نه نسبت به دریا) را بدانید. با داشتن فشار و ارتفاع، میتوانید فشار جوّی موقعیت خود را بدست آورید. سپس مقدار آن را در خط پنجم کد وارد کنید.
برای مثال اگر شما فشار جوّی محلی خود را ۱۰۱۱.۵ هکتوپاسکال بدست آوردید، خط ۵ به صورت زیر تغییر میکند.
float Po = 1011.5;
یافتن فشار از سطح دریا برای منطقهی خودتان
یکی از راههای بسیار دقیق برای این منظور استفاده از فشار سنج BMP180 میباشد. نتایج حاصل از فشارسنج میتواند در محاسبات مربوط به ارتفاع استفاده شود.
فشار سطح دریا از فرمول بارومتریک بین المللی زیر قابل محاسبه است. این فرمول برای بدست آوردن فشار صفر سطح دریا (P0) بازنویسی شده است.
فشار جوی در موقعیت فعلی شما با سنسور BMP180 قابل محاسبه است. برای بدست آوردن ارتفاع موقعیت فعلی خود میتوانید از برنامههای تلفنهای هوشمند یا نقشههای آنلاین استفاده کنید.
کد زیر نحوهی ارسال فشار سطح دریا در موقعیت فعلی شما را به نمایشگر سریال نشان میدهد. ارتفاع موقعیت فعلی خود را در خط ۵ وارد کنید.
float alt = 5.0;
کد:
#include <Wire.h>
#include <SFE_BMP180.h>
SFE_BMP180 bmp180;
float alt = 5.0; // Altitude of current location in meters
void setup() {
Serial.begin(9600);
bool success = bmp180.begin();
if (success) {
Serial.println("BMP180 init success");
}
}
void loop() {
char status;
double T, P, seaLevelPressure;
bool success = false;
status = bmp180.startTemperature();
if (status != 0) {
delay(1000);
status = bmp180.getTemperature(T);
if (status != 0) {
status = bmp180.startPressure(3);
if (status != 0) {
delay(status);
status = bmp180.getPressure(P, T);
if (status != 0) {
seaLevelPressure = bmp180.sealevel(P, alt);
Serial.print("Pressure at sea level: ");
Serial.print(seaLevelPressure);
Serial.println(" hPa");
}
}
}
}
}
امیدواریم این مقاله به شما در اتصال سنسور BMP180 به آردوینو کمک کند. اگر در این زمینه سوال یا پروژهی مرتبطی داشتید خوشحال میشویم که با ما در میان بگذارید.
- منبع: ترجمه از سایت circuitbasics.com
امیدوارم آموزش راهاندازی سنسور فشار بارومتریک BMP180 با توسط آردوینو براتون مفید واقع شده باشه. اگر این آموزش براتون مفید واقع شده ما را نیز دعا کنید و اگر خواستین میتوانید از محتوای رایگان آموزشی حمایت مالی کنید. نظر خود را در قسمت کامنتها ⇓ ثبت کنید.
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.