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

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

مقدمه

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

رابطه بین دمای هوا و فشار بارومتریک
رابطه بین دمای هوا و فشار بارومتریک

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

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

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

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

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

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

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

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

واحدیک hPa
پاسکال۱۰۰ Pa
نیوتون بر متر مربع۱۰۰ N/m
اتمسفر۰.۰۰۰۹۸۶۹۲۳ atm
بار۰.۰۰۱ bar
میلی بار۱mbar
میلی متر جیوه۰.۷۵۰۰۶۳۷۵۵ mmHg
تور۰.۷۵۰۰۶۱۶۸۳ torr
پوند بر اینچ مربع۰.۰۱۴۵۰۳۷۷۴ psi

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

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

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

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

فلوچارت کار با سنسور bmp180
مراحل کار

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

الگوریتم محاسبه ی فشار و دمای بارومتریک
الگوریتم محاسبه ی فشار و دمای بارومتریک

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

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

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

سنسور فشار بارومتریک BMP180 بوش با ۳.۳ ولت کار می کند، اما بسیاری از برد های برک اوت دارای تنظیم کننده ولتاژ و لول شیفتر I2C هستند بنابراین می توانند با هر دو ۳.۳ ولت و یا ۵ ولت کار کنند.

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

Pinout برای اطلاعات بیشتر خوانندگان
Pinout

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

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

آردوینوپین SDAپین SCL
یونو (Uno)A4 A5
نانو (nano)A4A5
مینی (mini)A4A%
۱۰۱SDASCL
زیرو (zero)SDASCL
لئوناردو (leonardo)۲۳
میکرو (micro)۲۳
دیو (Due)۲۰۲۱
مگا (Mega)۲۰۲۱
پین های I2C برخی بردهای آردوینو معروف

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

اتصالات برد آردوینو Uno برای سنسور فشار بارومتریک BMP180
اتصالات برد آردوینو 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);

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

status = bmp180.startPressure(3);

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

status = bmp180.getPressure(P, T);

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

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

فشار بارومتریک بر طبق ارتفاع سنسور تغییر میکند. زمانی که ارتفاع کم است، هوای بیشتری روی سنسور است پس فشار هم بیشتر است. زمانی که ارتفاع زیاد است، هوای کمتری روی سنسور است و فشار هم کمتر است. تغییر ارتفاع ۸ متری باعث تغییر فشار اتمسفریک ۱ hPa میشود. در این مثال، ما از اطلاعات فشار BMP 180 استفاده کرده ایم تا اندازه ی دقیق ارتفاع را پیدا کنیم.

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

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

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

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

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

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

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

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

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

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

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

برای مثال، اگر فشار اتمسفریک که شما اندازه گیری کردید برابر با ۱۰۱۱.۵ hPa بود، باید خط ۵ کد را به شکل زیر تغییر دهید:

float Po = 1011.5;

پیدا کردن فشار سطح دریا در منطقه ی شما

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

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

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

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

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

#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 به آردوینو کمک کرده باشد. میتوانید نظران را در بخش کامنت ها برای ما بنویسید و اگر سوالی داشتید، بپرسید. از پروژه های در حال انجامتان نیز برایمان بنویسید!

نمایش بیشتر

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

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

دکمه بازگشت به بالا