- Bosch BMP180 數位氣壓感測模組 ( 氣壓、溫度 ) - (可用於 Raspberry Pi, Arduino, 單晶片, 8051, AVR)
- {3V3} 整合型{ 4/8BIT,IIC,4SPI }1602英文字型LCD螢幕(附排針,16x2,藍底白色,LED 背光)-可用於樹莓派,Arduino,單晶片,8051,AVR)
BMP180 的晶片使用說明與溫度、氣壓和海拔高度的計算,請參考下面網頁中的說明
如果沒有購買賣場的 BMP180 數位氣壓感測器模組,在沒有賣場提供的程式碼之下,這網頁中的內容就對你幫助不大。
Raspberry Pi + BMP180 數位氣壓感測模組 + {3V3}整合型 1602 LCD @ I2C Mode |
這篇網頁主要說明如何使用賣場所提供的樹莓派 ( Raspberry Pi ) BMP180 程式。這程式只包含一個檔案,所有 BMP180 的操作、溫度、大氣壓力、海拔高度,以及反算海平面壓力與大氣壓力都在其中,經由檔案開頭處的參數設定,就可以很方便操控整個程式 !
電路接線圖:
使用樹莓派搭配 BMP180 並使用整合型 1602 LCD ( @ I2C 模式 ) 做顯示,接線是非常簡單的,只要照著電路圖上的接線方式或是參考上方照片就可以完成。相關注意事項或說明,請參考下方電路圖上的文字描述。
BMP180 - Raspberry Pi 電路接線圖 |
程式測試:
程式編譯會需要 wiringPi 函式庫,安裝方式在這裡。
在賣場所提供給 BMP180 的 Raspberry Pi ( 樹莓派 ) 程式碼中,提供三種模式輸出溫度、大氣壓力、和海拔高度,如果在這其中又指定了 DEBUG 模式,則溫度與大氣壓力計算過程中的每一個算式結果將會一併輸出到螢幕上,但 DEBUG 模式不輸出數據到 LCD 上。
- DEBUG:如果只開啟 DEBUG 模式,溫度、壓力的計算過程會輸出到螢幕上,溫度、大氣壓力、海拔高度與反算海平面壓力與大氣壓力的結果也會輸出到螢幕上。 ( line 82 )
- DISPLAY_ON_I2CLCD:如果只開啟 DISPLAY_ON_I2CLCD 模式,則會將溫度、大氣壓力與海拔高度輸出到 LCD 上,顯示的結果如上面的照片一樣,但就不會再顯示在螢幕上了。( line 32 )
- DEBUG + DISPLAY_ON_I2CLCD:綜合上面兩個項目的動作,輸出到螢幕以及 LCD 上。
{BMP180}/codes/RaspberryPi/BMP180/displayBMP180.c, LCD 顯示設定, line 32
27
28 /*===========================================================================
29 *-*- DISPLAY ON I2C LCD
30 *-*- 若要顯示溫度、壓力高度值在整合型 1602 LCD @ I2C Mode,取消下行前面的雙斜線
31 -------------------------------------------------------------------------*-*/
32 // #define DISPLAY_ON_I2CLCD
33
{BMP180}/codes/RaspberryPi/BMP180/displayBMP180.c, DEBUG 模式設定, line 82
81
82 //#define DEBUG // DEBUG Mode, 如要使用 DEBUG 模式,取消下行前面的雙斜線
83
預設上述兩個模式都是關閉的,所以程式會輸出溫度、大氣壓力和海拔高度,還有反算的海平面壓力與大氣壓力 ( line 561 ... line 571 ),程式碼會在下面 main() 函式中做說明。
BMP180 的重要參數設定上,line 89:一般不用再做變更了,這是用來對計算過程除錯用的,因為已經確認過了並不需要再將其打開;line 94 是 BMP180 的 I2C 位址設定;而 line 96 是用來設定海平面壓力的。
{BMP180}/codes/RaspberryPi/BMP180/displayBMP180.c
77 /*-*-========================================================================
78 *-*- BMP180
79 *-*- BMP180 暫存器與相關定義 ( 同樣也適用於 BMP085 )
80 -------------------------------------------------------------------------*-*/
81
82 //#define DEBUG // DEBUG Mode, 如要使用 DEBUG 模式,取消下行前面的雙斜線
83
84 // 從哪裡取得係數資料,每一顆 BMP 有自己的校正係數
85 // BMP_USE_DATASHEET_VALUES = 0 : 直接從 BMP180 EEPROM 取得校正係數係數
86 // BMP_USE_DATASHEET_VALUES = 1 : 使用資料手冊上所提供的校正係數。這可以用來
87 // 確認所有的數學計算式是否正確輸出相對應的數值。
88 // 做任何計算之前,先把這些校正係數讀取出來 !!!
89 #define BMP_USE_DATASHEET_VALUES 0 // 1: sanity check.
90
91 // I2C handle
92 int pIICBMP;
93
94 #define BMP180_I2C_ADDR 0x77 // BMP180 I2C address
95
96 #define SEALEVEL_PRESSUREHPA 1013.25 // 海平面的氣壓,預設是 1013.25 hPa
97 // 可以實際情況做變更
98
除了上述的參數設定,BMP180 的其他函式幾乎都可以由 "如何使用 Bosch BMP180 數位氣壓感測器模組計算溫度、大氣壓力與海拔高度 ?" 網頁中的說明來對照各函式程式的撰寫,所以我們直接說明 main() 函式。
main() 函式裡面,起頭 line 494 一直到 line 524 都是函式庫與裝置的初始化,沒必要就不需要再做修改;依但該做的初始化完成之後,確認 bmp180 通訊是否正常 ( line 526 ),正常之後就進入到無窮迴圈裡工作 ( line 530 ... line 575 )。
在無窮迴圈裡,首先要對 BMP180 傳送量測控制模式 ( line 538 ),不同模式會影響量測輸出的時間以及導致解析度的變化 ( line 532 ... line 537 ),設定時可以看上面的參數說明。line 540 是讀取 EEPROM 以面的校正係數;line 542, line 544 分別是讀取溫度以及大氣壓力的計算結果,值得注意的是,參數輸入後會修改傳入的參數內容,所以輸入值就是回傳值,函數呼叫之後就可以使用;上述兩函式,溫度的單位是 °C 而大氣壓力的單位是 Pa,但要計算海拔高度時要先將大氣壓力換算成 hPa ( 百帕 ) 才能正確計算 ( line 546 ),回傳值是浮點數。
{BMP180}/codes/RaspberryPi/BMP180/displayBMP180.c, main()
490 /*-*-==================================================================-*-*/
491
492 int main( )
493 {
494 float Temperature, Pressure;
495 unsigned char chrbuf[17];
496
497 // 初始化 wiringPi,並使用 BCM_GPIO 的接腳號碼
498 if (wiringPiSetupGpio() == -1)
499 {
500 fprintf (stderr, "Unable to setup wiringPi GPIO, errno: %s\n", strerror (errno)) ;
501 exit(1);
502 }
503
504 // 取得存取 BH1750 IIC 的 FD
505 if((pIICBMP = wiringPiI2CSetup(BMP180_I2C_ADDR)) == -1)
506 {
507 fprintf (stderr, "Unable to get file handle of IIC (BH1750), errno: %s\n", strerror (errno)) ;
508 exit(1) ;
509 }
510
511 #ifdef DISPLAY_ON_I2CLCD
512 // 取得存取 LCD IIC 的 FD
513 if((pIIC_LCD = wiringPiI2CSetup(LCD_I2C_ADDR)) == -1)
514 {
515 fprintf (stderr, "Unable to get file handle of IIC (LCD), errno: %s\n", strerror (errno)) ;
516 exit(1) ;
517 }
518
519 lcd_init();
520 delay(100);
521 lcd_Clear();
522 delay(150);
523
524 #endif
525
526 if( !bmpLive() )
527 return 0;
528 else
529 {
530 for(;;)
531 {
532 /*** BMP180 oversampling setting ( oss )
533 ULTRA_LOW_POWER = 0, // 4.5 ms
534 STANDARD = 1, // 7.5 ms
535 HIGH_RESOLUTION = 2, // 13.5 ms
536 ULTRA_HIGH_RESOLUTION = 3 // 23.5 ms
537 *********************************************/
538 bmpInit( 0 );
539 // Read EEPROM calibration coefficients
540 bmpReadCalibCoeffs();
541 // Read temperature
542 bmpReadTemperature(&Temperature);
543 // Get compensated pressure level
544 bmpGetPressure(&Pressure);
545 // Altitude from pressure and temperature
546 float mAltitude = pressureToAltitude( (float)SEALEVEL_PRESSUREHPA, Pressure / 100.0, Temperature );
547
548 #ifdef DISPLAY_ON_I2CLCD
549 // 顯示溫度
550 sprintf( chrbuf, "T:%2.1f%cC", Temperature, 0xdf );
551 lcd_DisplayCharAt( 2, 1, chrbuf, 8 );
552
553 // 顯示壓力
554 sprintf( chrbuf, "P:%4.2f hPa ", Pressure/100.0 );
555 lcd_DisplayCharAt( 1, 1, chrbuf, 16 );
556
557 // 使用溫度做補償,再利用測得的壓力值計算出距離水平面的高度
558 sprintf( chrbuf, "A:%2.2fM", mAltitude );
559 lcd_DisplayCharAt( 2, 9, chrbuf, 8 );
560 #else
561 printf("-----------------------------\n");
562 printf(" BMP180 Temperature: %.2f C\n", Temperature);
563 printf("-----------------------------\n");
564 printf(" BMP180 Pressure: %.2f Pa = %.2f Torr\n", Pressure, Pressure * 0.0075F);
565 printf("---------------------------------------------\n\n");
566 printf(" Pressure To Altitude: %.2f M\n\n", mAltitude);
567 float mSeaLevel = seaLevelPressure( mAltitude, Pressure / 100.0, Temperature );
568 printf(" Sea Level Pressure: %.2f hPa\n\n", mSeaLevel);
569 float mPressure = altitudeToPressure( mAltitude, mSeaLevel, Temperature );
570 printf(" Altitude To Pressure: %.2f hPa\n\n", mPressure);
571 printf("------------------------------------\n\n");
572 #endif
573
574 delay(1000);
575 }
576 }
577
578 return 1;
579 }
接下來就是設定數據輸出的位置:是整合型 1602 LCD 還是螢幕上。這幾個使用到的函式直接依樣畫葫蘆照著做就可以了,就是輸出函式回傳結果。
或許上面我講的很簡短,但如果有原始檔而且只是要用或是測試,上面的講解就很足夠了。如果要了解這個程式裡面的細節,整個程式撰寫所需要的觀念以及方式,都在 "如何使用 Bosch BMP180 數位氣壓感測器模組計算溫度、大氣壓力與海拔高度 ?" 網頁裡,對照著流程與裡面的講述對照著程式碼,一些細部參數再看資料手冊,相信不難了解 !
在 BMP180 一系列的使用說明中,最大的遺珠之憾就是無法取得即時的海平面壓力 !!!
但在經過這一段時間一邊寫一邊找資料的結果,這問題可以解決了 ! 雖然不是即時,但每隔兩小時的更新週期,應該算的上即時吧 ! 在後續的 BMP180 使用說明中,我將會分享取得這資料,讓 BMP180 的使用更加的完善 !
<< BMP180 數位氣壓感測器系列文章 >>
- 使用 N-Channel MOSFET 做 I2C 電壓準位轉換電路 簡易但是很好用的 3V3 <--> 5V, I2C 電壓準位 ( Level Shifter ) 轉換電路,這電路會用在 BMP180 與單晶片、Arduino 或是任何 3V3 系統程式測試上。
- 如何使用 Bosch BMP180 數位氣壓感測器模組計算溫度、大氣壓力與海拔高度 ? 要得到模組顯處環境的溫度、大氣壓力和海拔高度,單純讀取 BMP180 的資料是不夠的,還必須經過一長串的計算過程,讓此篇網頁帶使用者進入 BMP180 的世界,並了解這些數據的運算過程。
- BMP180 模組使用提示 - 單晶片接線與程式測試 單晶片、BMP180 與 { 3V3 } / { 5V } 整合型 1602 LCD 之間的接線,並加入了電壓準位轉換電路,轉換不同電壓之間的雙向通訊訊號,最後將所有裝置結合在一起作程式測試,顯示溫度、大氣壓力與海拔高度在 LCD 中。
- BMP180 模組使用提示 - Arduino 接線與程式測試
這篇網頁主要針對兩個賣場提供的 Arduino 做使用說明。主要是說明如何 BMP180 數位氣壓感測模組與 Arduino 的接線與程式測試,使用 Arduino 本身硬體 I2C 做通訊,並且將輸出結果直接輸出到 Serial Port 上,所有計算過程與結果可直接輸出到其 Arduino Monitor 或是 Serial Port 軟體上。
沒有留言:
張貼留言
留言屬名為"Unknown"或"不明"的用戶,大多這樣的留言都會直接被刪除掉,不會得到任何回覆!
發問問題,請描述清楚你(妳)的問題,別人回答前不會想去 "猜" 問題是什麼?
不知道怎麼發問,請看 [公告] 部落格提問須知 - 如何問問題 !