Arduino筆記(70):溫度氣壓傳感器模組 BMP180 (GY68)

我有好幾個溫度的感測模組,如DHT-11、AM2320、DS18B20等,這幾個是測試溫溼度的感測模組。最近購買一個可以測量溫度跟氣壓的模組BMP180,這個模組跟先前實作的 筆記(59):大氣壓強度(高度計)感測模組 GY-BMP280 功能一樣具備溫度檢測和大氣監測兩種功能,可以根據測出的溫度和氣壓,計算出晶片所在的海拔高度。BMP280的功能及精度較BMP180佳,在功能上做了一些提升:
  • 減小了體積,目前擁有業界最小封裝2.0 x 2.5 x 0.95 mm3。
  • 在測溫的精度上由0.1℃精確到0.01℃。
  • 在海拔9000m~-500m的壓強為300hPa~1100hPa
  • 氣壓精度由1pa精確到0.16pa。
  • 氣壓傳感器支持SPI和IIC通信接口。
  • 運用氣壓計增強GPS定位或者配合IMU傳感器,實現三維導航。
  • 傳感器功耗僅有2.7μA。
  • 提高了解析度和採樣頻率。

以下是維基百科對於氣壓的解釋:
氣壓的國際單位制是帕斯卡(或簡稱帕,符號是Pa),泛指是氣體對某一點施加的流體靜力壓力,來源是大氣層中空氣的重力,即為單位面積上的大氣壓力。在一般氣象學中人們用千帕斯卡(KPa)、或使用百帕(hPa)作為單位。測量氣壓的儀器叫氣壓表。其它的常用單位分別是:巴(bar,1 bar=100,000帕)和公分水銀柱(或稱公分汞柱)。在海平面的平均氣壓約為101.325千帕斯卡(76公分水銀柱),這個值也被稱為標準大氣壓。另外,在化學計算中,氣壓的國際單位是「atm」。一個標準大氣壓即是1 atm。1個標準大氣壓等於101325帕、1013.25百帕和1.01325巴,或者76公分水銀柱。氣壓的地區差別是氣象變化的直接原因之一。氣壓是天氣預報的一個重要的變量。
在地球上,其來源是大氣層中空氣的重力,一般正常的空氣壓力1 kgw/cm2。在高處之上的大氣層比較薄,那裡的空氣重力比低處要小,因此在高處的氣壓比在低處要低。比如在高山上氣壓比在海平面上要低。[維基百科]

如果要查詢目前所在的相對海拔高度,可以到以下網站,輸入住址後,查詢海拔高度,再將這個網站查得的高度值,修改程式第五行的ALTITUDE變數。網址如下:http://haiba.qhdi.com/


[GY-68 BMP180 溫度氣壓傳感器模組]

BMP180 是Bosch Sensortec 新推出的數字氣壓傳感器,性能非常高,可用於智能手機,平板電腦和運動設備等高級移動設備。像大多數壓力傳感器一樣,BMP180可以測量絕對壓力,這是設備看到的實際環境壓力,隨海拔高度和天氣而變化。GY-68 BMP180 溫度氣壓傳感器模組的規格如下:
  • 壓力範圍:300~1100hPa(海拔9000米~-500米)
  • 電源電壓:1.8V~3.6V(VDDA),1.62V~3.6V(VDDD)
  • LCC8封裝:無鉛陶瓷載體封裝(LCC)
  • 尺寸:3.6mmx3.8×0.93mm
  • 低功耗:5μA,在標準模式
  • 高精度:低功耗模式下,解析度為0.06hPa(0.5米)
  • 高線性模式下,解析度為0.03hPa(0.25米)
  • 含溫度輸出
  • I2C介面
  • 溫度補償
  • 無鉛,符合RoHS規範
  • MSL 1反應時間:7.5ms
  • 待機電流:0.1μA
  • 無需外部時鐘電路


[安裝BMP180 Library]

本實作需要安裝以下程式庫:
程式庫(Library)安裝方法請參考另一篇文章:  Arduino筆記:安裝 Arduino IDE 程式庫(Library)

[材料]

• Arduino Uno x 1
• GY-68 BMP180
• 連接線 x 4條

[接線與電路圖]

Arduino UnoBMP180(GY-68)
5V(VCC)VCC
GNDGND
A4(SDA)SDA
A5(SDL)SDL


[程式]

在讀取壓力感測值之前,必須先取取溫度讀數,透過startTemperature()和getTemperature()取得溫度值,結果以攝氏度為單位。在取得溫度值後,就可以讀取壓力值。透過startPressure()和getPressure()取得感測值完,結果以毫巴(mb)或百帕斯卡(hPa)為單位。
如果要測得天氣狀況,則要消除海拔的影響,這要跟他地方公佈的壓力的海拔高度進行比較,使用sealevel()函數時,需要提供測量壓力的已知高度,如果要測量高度,則需要知道壓力在基準點的高度。這可以是平均海平面壓力,或是以前的壓力值,依照測得的結果加或減基準值,這是透過height()函數完成。

#include <SFE_BMP180.h>
#include <Wire.h>

SFE_BMP180 pressure;  // 建立一個物件名為 pressure
#define ALTITUDE 25   // 台灣西部海岸大約的海平面高度

void setup()
{
  Serial.begin(9600);
  Serial.println("REBOOT");
  
  // 初始設定
  if (pressure.begin())
    Serial.println("BMP180 init success");
  else
  {
    // 初始化錯誤,一般是連接問題
    Serial.println("BMP180 init fail\n\n");
    while(1);    // 永久停在這裡
  }
}

void loop()
{
  char status;
  double T,P,p0,a;

  // 每 10秒鐘偵測一次

  // If you want sea-level-compensated pressure, as used in weather reports,
  // you will need to know the altitude at which your measurements are taken.
  // We're using a constant called ALTITUDE in this sketch:
  
  Serial.println();
  Serial.print("provided altitude: ");
  Serial.print(ALTITUDE,0);
  Serial.print(" meters, ");
  Serial.print(ALTITUDE*3.28084,0);
  Serial.println(" feet");
  
  // 如果要測量高度,而不是壓力,就需要提供已知的基本壓力
  
  // 取得溫度量測值
  
  // Start a temperature measurement:
  // If request is successful, the number of ms to wait is returned.
  // If request is unsuccessful, 0 is returned.

  status = pressure.startTemperature();
  if (status != 0)
  {
    // 等待感測完成
    delay(status);

    // 取得完整溫度測量,感測值存在變數T,函數回傳 1表示成功,0表示失敗

    status = pressure.getTemperature(T);
    if (status != 0)
    {
      // 顯示感測值
      Serial.print("temperature: ");
      Serial.print(T,2);
      Serial.print(" .C,        ");
      Serial.print((9.0/5.0)*T+32.0,2);
      Serial.println(" .F");
      
      // 量測壓力
      // 參數設定從 0 到 3 (最高的解析度,等待較久)
      // 感測成功會傳回等待多少 ms,如果不成功會傳回 0

      status = pressure.startPressure(3);
      if (status != 0)
      {
        // 等待感測完成
        delay(status);

        // 取得完整的壓力感測值,感測值存在變數 P,這個函數需要先前取得的溫度 T       
        // 假使溫度變化不大,可以只取得一次的值即可,函數執行成功會傳回 1,失敗傳回 0

        status = pressure.getPressure(P,T);
        if (status != 0)
        {
          // 列出感測值
          Serial.print("absolute pressure: ");
          Serial.print(P,2);
          Serial.print(" mb,     ");
          Serial.print(P*0.0295333727,2);
          Serial.println(" inHg");

          // 壓力感測值傳回絕對壓力,會隨著高度而變化,要移除高度的影響,需使用 sealevel 函數在目前的高度,
          // 這個數字常被用在氣象報告中,參數 P = 絕對壓力(毫巴), 高度 = 目前高度(公尺/米).
          // 傳回值 p0 = sealevel函數的補償壓力(毫巴)

          p0 = pressure.sealevel(P,ALTITUDE); // we're at 1655 meters (Boulder, CO)
          Serial.print("relative (sea-level) pressure: ");
          Serial.print(p0,2);
          Serial.print(" mb,     ");
          Serial.print(p0*0.0295333727,2);
          Serial.println(" inHg");

          // 如果要從壓力感測值得知高度,需使用高度函數 altitude,以及先言算出的基準壓力.
          // 參數 P = 絕對壓力(毫巴), p0 = 基準壓力(毫巴). 傳回值 a = 高度(公尺/米)

          a = pressure.altitude(P,p0);
          Serial.print("computed altitude: ");
          Serial.print(a,0);
          Serial.print(" meters, ");
          Serial.print(a*3.28084,0);
          Serial.println(" feet");
        }
        else Serial.println("error retrieving pressure measurement\n");
      }
      else Serial.println("error starting pressure measurement\n");
    }
    else Serial.println("error retrieving temperature measurement\n");
  }
  else Serial.println("error starting temperature measurement\n");

  delay(5000);  // 暫停5秒 
}

[實作結果]


[參考資料]

• Github: LowPowerLab/SFE_BMP180

Post a Comment

較新的 較舊