آردوینو, پروژه آردوینو

سنسور فشار بارومتریک BMP180 را چگونه روی آردوینو تنظیم کنیم ؟

راه اندازی ماژول سنسور فشار بارومتریک BMP180 با آردوینو

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

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

فهرست مطالب

فشار بارومتریک چیست؟

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

نمایی از مفهوم فشار بارومتریک
مفهوم فشار بارومتریک به روایت تصویر

به فشار ایجاد شده توسط یک اینچ ستون 1×1 هوا که به بخش بالایی اتمسفر می‌رسد، یک اتمسفر (atm) از فشار گفته می‌شود. این ستون هوا، وزنی برابر با 14.7 پوند دارد و به همین دلیل یک atm به ازای هر اینچ مربع، وزنی برابر با 14.7 پوند خواهد داشت.

واحد اندازه گیری فشار پاسکال (Pa) است. یک پاسکال به عنوان یک نیوتن نیرو در هر متر مربع تعریف می‌شود. خروجی فشار ماژول سنسور BMP180 بر اساس پاسکال است اما توسط کتابخانه نرم‌افزاری که ما از آن استفاده می‌کنیم، به هکتو پاسکال (hPa) تبدیل می‌شود. برای تبدیل از hPa به برخی دیگر از واحدهای معمول فشار، می‌توانید از جدول زیر کمک بگیرید:

واحد یک hPa
پاسکال 100 Pa
نیوتون بر متر مربع 100 N/m
اتمسفر 0.000986923 atm
بار 0.001 bar
میلی بار 1mbar
میلی متر جیوه 0.750063755 mmHg
تور 0.750061683 torr
پوند بر اینچ مربع 0.014503774 psi

سنسور فشار بارومتریک BMP180 چگونه کار می‌کند؟

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

از آن جایی که دما، چگالی گازها مانند هوا را تغییر می‌دهد، سنسور فشار بارومتریک BMP180 هر دو فشار و دما را اندازه‌گیری می‌کند. در دماهای بالاتر، هوا چگالی بالایی ندارد و سنگین نیست به همین دلیل فشار کمتری به سنسور وارد می‌کند. در دماهای پایین‌تر، چگالی هوا بیشتر است و وزن بیشتری دارد و به همین دلیل فشار بیشتری به سنسور وارد خواهد آورد. این سنسور از مقیاس دمای حال حاضر برای خواندن فشار زمانی که چگالی هوا تغییر می‌کند، بهره می‌گیرد.

خروجی سنسور فشار بارومتریک BMP180 یک مقدار دمای جبران نشده (UT) و یک مقدار فشار جبران نشده (UP) است بنابراین ابتدا دما و سپس فشار اندازه‌گیری می‌شوند. در جدول زیر مراحل کار برای اندازه‌گیری فشار و دمای سنسور نمایش داده شده‌اند:

نحوه عملکرد و الگوریتم ماژول سنسور بارومتریک
نحوه عملکرد و الگوریتم ماژول سنسور بارومتریک

سنسور فشار بارومتریک BMP180 یک حافظه رم EEPROM با ظرفیت 176 بیتی دارد که حاوی 11 ضریب کالیبراسیون مختص هر سنسور است. از این ضرایب به همراه UP و UT برای محاسبه فشار و دمای بارومتریک استفاده می‌شود. این فشار و دما با استفاده از الگوریتمی پیچیده قابل محاسبه هستند:

الگوریتم های پیچیده ای که در استفاده از ماژول بارومتریک به کار می رود
الگوریتم‌های پیچیده‌ای که در استفاده از ماژول بارومتریک به کار می‌روند

این عملیات ریاضی توسط کتابخانه‌ای که ما از آن استفاده می‌کنیم، انجام می‌گیرد و نیازی به کدنویسی نخواهد داشت.

سنسوری که ما در این مقاله از آن استفاده کرده‌ایم، یک برد برک اوت از Adafruit است که از سنسور فشار بارومتریک BMP180 بوش استفاده می‌کند:

نمایی از ماژول BMP180
نمایی از ماژول BMP180

سنسور فشار بارومتریک BMP180 بوش با ولتاژ 3.3 ولت کار می‌کند اما بسیاری از بردهای برک اوت دارای تنظیم‌کننده ولتاژ و تغییردهنده سطح I2C هستند بنابراین می‌توانند با هر دو ولتاژ 3.3 و یا 5 ولت کار کنند.

نمودار زیر طرح پایه‌های تراشه یک سنسور فشار بارومتریک BMP180 را نشان می‌دهد:

پین های ورودی و خروجی ماژول BMP180
پین‌های ورودی و خروجی ماژول BMP180

اتصال سنسور فشار بارومتریک BMP180 به آردوینو

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

آردوینو پین SDA پین SCL
یونو (Uno) A4 A5
نانو (Nano) A4 A5
مینی (Mini) A4 A%
101 SDA SCL
زیرو (Zero) SDA SCL
لئوناردو (Leonardo) 2 3
میکرو (Micro) 2 3
دیو (Due) 20 21
مگا (Mega) 20 21

اتصالات برد آردوینو Uno، مطابق تصویر زیر هستند:

اتصالات و مداربندی ماژول BMP180 با آردوینو
اتصالات و مداربندی ماژول BMP180 با آردوینو

در این مثال، یک سنسور فشار بارومتریک BMP180 به یک پین 5 ولت متصل شده اما شما می‌توانید آن را به پین 3.3 ولت نیز متصل کنید.

نصب کتابخانه سنسور فشار بارومتریک BMP180

پیش از برنامه‌نویسی سنسور فشار بارومتریک BMP180، کتابخانه آن را دانلود و نصب کنید. برای اطلاعات بیشتر در این زمینه می‌توانید در اینجا از کتابخانه Sparkfun استفاده می‌کنیم. این کتابخانه تمامی محاسبات ریاضی برای پیدا کردن دما و فشار و همچنین تمامی محاسبات ریاضی برای پیدا کردن ارتفاع را انجام می‌دهد. شما می‌توانید با استفاده از لینک زیر فایل زیپ آن را دانلود کنید. برای نصب آن، IDE آردوینو را باز کرده و سپس مراحل Sketch > Include Library > Add Library را طی کنید، پس از آن فایل زیپ را که دانلود کرده‌اید، انتخاب کنید.

راه اندازی ماژول سنسور فشار بارومتریک BMP180 با آردوینو برای پیش بینی آب و هوا

می‌توان از تغییرات به وجود آمده در سنسور فشار بارومتریک، برای پیش‌بینی آب و هوا استفاده کرد. توجه کنید که افت فشار بارومتریک به دلیل افزایش چگالی هوای فاصله گرفته از سطح زمین است.

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

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

ارسال فشار و دمای خروجی به سریال مانیتور

کد زیر فشار و دمای خروجی را به سریال مانیتور ارسال می‌کند:

				
					#include
#include
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");
        }
      }
    }
  }
}

				
			

سنسور را بالا و پایین و تغییرات مقدار فشار را مشاهده کنید. این سنسور بسیار حساس است.

119

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

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

کتابخانه Sparkfun یک تابع به نام sealevel(P, A) دارد که این کار را برایتان انجام می‌دهد. شما فقط باید ارتفاع منطقه فعلی از سطح دریا را پیدا کنید. در کد زیر، در خط 6 ارتفاع را به متن وارد کنید:

				
					#include

#include

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");

        }

      }

    }

  }

}
				
			

ارتفاع منطقه فعلی (انجام‌دهنده این پروژه) 5 متر است پس اختلاف ناچیز می‌باشد اما این اختلاف دما روی فشار تاثیر می‌گذارد.

سریال مانیتور و نشان دادن اختلاف دما در IDE

تشریح کد سنسور فشار بارومتریک BMP180

ابتدا یک شی به نام BMP180 ایجاد می‌کنیم:

SFE_BMP180 bmp180;

برای مقداردهی اولیه سنسور فشار بارومتریک BMP180 و دانلود ضرایب کالیبراسیون، باید متد begin() را فراخوانی کنیم. اگر این فراخوانی موفقیت‌آمیز بود، این متد یک مقدار غیر صفر را برمی‌گرداند:

				
					bool success = bmp180.begin();
				
			

بر اساس جدولی که پیشتر دیدیم، برای شروع اندازه‌گیری دما از متد startTemperature() استفاده می‌کنیم. اگر این فراخوانی موفقیت‌آمیز بود، این متد یک مقدار غیر صفر برمی‌گرداند:

				
					status = bmp180.startTemperature();
				
			

سپس باید به مدت 4.5 میلی‌ثانیه منتظر بمانیم و از getTemperature(T) برای دریافت مقدار و ذخیره کردن آن در متغیر T استفاده کنیم:

				
					status = bmp180.getTemperature(T);


				
			

متد startPressure() فرمان شروع اندازه‌گیری فشار را ارسال می‌کند. ما یک مقدار oversampling که می‌تواند بین 0 تا 3 باشد را به عنوان پارامتر ارائه می‌دهیم. مقدار 3 وضوح بالاتری ایجاد خواهد کرد اما بین اندازه‌گیری‌ها تاخیر بیشتری خواهد داشت. مقدار 0 وضوح کمتری را ارائه خواهد داد اما سریع‌تر خواهد بود. این تابع، مدت زمان میلی‌ثانیه‌ای که آردوینو باید قبل از خواندن مقدار فشار از سنسور ثبت کند را برمی‌گرداند:

				
					status = bmp180.startPressure(3);
				
			

سپس از متد getPressure() برای خواندن مقدار فشار و ذخیره کردن آن در متغیر P استفاده می‌کنیم:

				
					status = bmp180.getPressure(P, T);
				
			

از آن جایی که محاسبه فشار به دما بستگی دارد، از متغیر T نیز استفاده می‌کنیم.

راه اندازی ماژول سنسور فشار بارومتریک BMP180 با آردوینو برای محاسبه ارتفاع

فشار بارومتریک با توجه به ارتفاع سنسور تغییر می‌کند. زمانی که ارتفاع کم است، هوای بیشتری روی سنسور خواهد بود پس فشار هم بیشتر است. زمانی که ارتفاع زیاد شد، هوای کمتری روی سنسور بوده و فشار هم کمتر است. تغییر ارتفاع 8 متری باعث تغییر فشار اتمسفریک 1 hPa می‌شود. در این مثال، ما از اطلاعات فشار BMP180 استفاده کرده‌ایم تا اندازه دقیق ارتفاع را پیدا کنیم.

می‌توان با استفاده از فرمول بین‌المللی بارومتریک، ارتفاع را محاسبه کرد:

فرمول محاسبه
فرمول بین‌المللی بارومتریک

خوشبختانه، کتابخانه این محاسبات را انجام می‌دهد و نیازی نیست که شما نگران محاسبات ریاضی باشید.

فشار اتمسفریک در محل فعلی شما، با سنسور فشار بارومتریک BMP180 اندازه‌گیری می‌شود. فشار اتمسفریک در سطح دریا همان فشار اتمسفریک در محل فعلی شماست و طوری تنظیم شده که تاثیرات ارتفاع را نادیده بگیرد. این فشار را می‌توان با یک و یا دو روش اندازه گرفت. دقیق‌ترین روش، استفاده از سنسور فشار بارومتریک BMP180 است که نحوه بهره‌گیری از آن در ادامه توضیح داده شده است. روش دیگرريال استفاده از نقشه‌های آنلاین می‌باشد.

ارتفاع نسبت به سطح دریا

کد زیر، ارتفاع محل فعلی نسبت به سطح دریا را مشخص می‌کند. شما باید در خط 5، فشار اتمسفریک نسبت به سطح دریا در محل فعلی را وارد کنید:

				
					#include
#include
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");
        }
      }
    }
  }
}

				
			

سریال مانیتور را باز کنید تا ارتفاع فعلی شما از سطح دریا نمایش داده شود:

122

ارتفاع نسبت به سطح زمین در سنسور فشار بارومتریک BMP180

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

برای مثال، اگر فشار اتمسفریک که شما اندازه‌گیری کردید برابر با 1011.5 hPa بود، باید خط 5 کد را به شکل زیر تغییر دهید:

				
					float Po = 1011.5;
				
			

پیدا کردن فشار سطح دریا در منطقه شما با راه اندازی ماژول سنسور فشار بارومتریک BMP180 با آردوینو

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

می‌توان با استفاده از فرمول بین‌المللی بارومتریک که برای به دست آوردن فشار سطح دریا ایجاد شده، این فشار را به دست آورد:

فرمول بین المللی فشار بارومتریک

فشار اتمسفریک محل فعلی شما با استفاده از BMP180 اندازه‌گیری می‌شود. برای به دست آوردن ارتفاع محل قرارگیری‌تان می‌توانید از اپلیکیشن‌ها استفاده کنید و یا از نقشه‌های ارتفاع آنلاین کمک بگیرید.

کد پایین فشار سطح دریا در محل فعلی شما را به سریال مانیتور ارسال می‌کند. ارتفاع حال حاضر خودتان را در خط 5 وارد کنید:

				
					#include
#include
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");
        }
      }
    }
  }
}

				
			

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *