我有好幾個溫度的感測模組,如DHT-11、AM2320、DS18B20等,這幾個是測試溫溼度的感測模組。最近購買一個可以測量溫度跟氣壓的模組BMP180,這個模組跟先前實作的 筆記(59):大氣壓強度(高度計)感測模組 GY-BMP280 功能一樣具備溫度檢測和大氣監測兩種功能,可以根據測出的溫度和氣壓,計算出晶片所在的海拔高度。BMP280的功能及精度較BMP180佳,在功能上做了一些提升:
以下是維基百科對於氣壓的解釋:
氣壓的國際單位制是帕斯卡(或簡稱帕,符號是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/。
程式庫(Library)安裝方法請參考另一篇文章: Arduino筆記:安裝 Arduino IDE 程式庫(Library)。
• GY-68 BMP180
• 連接線 x 4條
如果要測得天氣狀況,則要消除海拔的影響,這要跟他地方公佈的壓力的海拔高度進行比較,使用sealevel()函數時,需要提供測量壓力的已知高度,如果要測量高度,則需要知道壓力在基準點的高度。這可以是平均海平面壓力,或是以前的壓力值,依照測得的結果加或減基準值,這是透過height()函數完成。
- 減小了體積,目前擁有業界最小封裝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 Uno | BMP180(GY-68) |
---|---|
5V(VCC) | VCC |
GND | GND |
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秒 }
張貼留言