bmp180的簡介: • 壓力範圍:300~1100hPa(海拔 9000 米~-500 米) • 電源電壓:1.8V~3.6V(VDDA), 1.62V~3.6V(VDDD) • 尺寸:3.6mmx3.8x0.93mm • 低功耗:5μA,在標準模式 • 高精度:低功耗模式下,解析度為 0.06h ...
bmp180的簡介:
• 壓力範圍:300~1100hPa(海拔 9000 米~-500 米) • 電源電壓:1.8V~3.6V(VDDA), 1.62V~3.6V(VDDD) • 尺寸:3.6mmx3.8x0.93mm • 低功耗:5μA,在標準模式 • 高精度:低功耗模式下,解析度為 0.06hPa(0.5 米) • 高線性模式下,解析度為 0.03hPa(0.25 米) • 含溫度輸出 • I2C 介面 • 溫度補償 • MSL 1 反應時間:7.5ms • 待機電流:0.1μA
可以同時獲得所處環境的溫度和氣壓,甚至還可以通過氣壓、溫度間接求出海拔,此換算過程較為複雜,可自行百度,在此給出數值較為粗糙的公式:(p0指的是標準海平面大氣壓,並不是此時此地的海拔為0m的大氣壓,p0=101.325kpa)
憑個人觀點,相比於溫濕度感測器dht11,實現的功能可能會更多一些,但不知道,兩者哪個精度會高一點。dht11是數字信號輸入,bmp系列是模擬信號輸入,但是我發現利用公式測算的海拔高度altitude時鐘為負值,不知道這是什麼情況,暫時且用fabs函數套上,轉換為絕對值。
年前tb了一個bmp180的感測器,想用arduino獲得實現的可能。當然bmp085也可以,我才用的庫就是bmp085的庫,當時網路上找不到bmp180的庫,甚至動用了某工具。還有,最近在國內似乎連不上arduino的庫管理器,於是我從GitHub那獲得了庫文件,鏈接在此:https://github.com/drophair/BMP180-BMP085(這個庫比較早,而且bmp085已經停產了,其中計算海拔的方法粗在錯誤)https://github.com/drophair/bmp180(這個是專門用於bmp180的,不妨兩個都試一下,而且不用自己去推算海拔,有自己封裝的函數,直接就可以用了)
註意,利用以上公式求的是絕對海拔,誤差較大;相比之下,可以計算相對海拔,其計算原理下文詳細介紹。
接線方式:
arduino bmp180 ---------------------- VIN VCC GND GND SCL A5 SDA A4
代碼:
1 #include <SFE_BMP180.h> 2 #include <Wire.h> 3 SFE_BMP180 pressure; 4 double baseline; // baseline pressure 5 6 void setup() 7 { 8 Serial.begin(9600); 9 Serial.print("重啟中"); 10 Serial.print(",正在獲取最新校準值"); 11 if (pressure.begin()) 12 { 13 int i; 14 for(i=0;i<3;i++){ 15 Serial.print("."); 16 delay(1000);} 17 Serial.println(); 18 Serial.println("BMP180感測器初始化成功"); 19 } 20 else 21 { 22 Serial.println("BMP180感測器初始化失敗 (請檢查連接是否正確)\n\n"); 23 while(1); 24 } 25 baseline = getPressure(); 26 Serial.print("海平面氣壓: "); 27 Serial.print(baseline); 28 Serial.println(" 百帕"); 29 } 30 31 void loop() 32 { 33 double a,P,T,status; 34 P = getPressure(); 35 a = pressure.altitude(P,baseline); 36 Serial.print("實時氣壓: "); 37 Serial.print(P,2); 38 Serial.print(" 百帕, "); 39 Serial.print("相對高度: "); 40 if (a >= 0.0) Serial.print(" "); // add a space for positive numbers 41 Serial.print(a,2); 42 Serial.print(" 米, "); 43 status = pressure.startTemperature(); 44 if(status!=0) 45 { 46 delay(status); 47 status = pressure.getTemperature(T); 48 49 Serial.print("溫度: "); 50 Serial.print(T,2); 51 Serial.println(" 攝氏度"); 52 } 53 delay(1000); 54 } 55 56 double getPressure() 57 { 58 char status; 59 double T,P,p0,a; 60 status = pressure.startTemperature(); 61 if (status != 0) 62 { 63 delay(status); 64 status = pressure.getTemperature(T); 65 if (status != 0) 66 { 67 status = pressure.startPressure(3); 68 if (status != 0) 69 { 70 for a number of pressure measurements.) 71 status = pressure.getPressure(P,T); 72 if (status != 0) 73 { 74 return(P); 75 } 76 else Serial.println("error retrieving pressure measurement\n"); 77 } 78 else Serial.println("error starting pressure measurement\n"); 79 } 80 else Serial.println("error retrieving temperature measurement\n"); 81 } 82 else Serial.println("error starting temperature measurement\n"); 83 }
工作原理:
1、首先感測器會進行一次重啟,之後才會正常工作;
2、內部先進行10次大氣壓的測量,然後計算平均值,作為基準壓強(baseline);
3、先測一次溫度,然後再測大氣壓,若大氣壓的值較為穩定則利用內部的封裝函數,直接求得(至於封裝函數是怎麼樣的就不去深究了),若大氣壓不穩定就會一直等待穩定的時候,因此不管怎麼設置delay,時間間隔都會有偏差;
4、輸出列印。
總結:
代碼在example中就有隻是將多個示例結合為一個整體代碼。
目前只在arduino上進行搭建,未來還會繼續增加溫濕度感測器dht11;由於對軟串口、串口通訊等方面的不瞭解,無法在esp8266上實現一旦時機成熟最終會整體移植到esp8266、樹莓派上。