2014年7月1日 星期二

BMP180 模組使用提示 - Raspberry Pi 接線與程式測試

網頁中所使用的零件可至露天賣場訂購:
I2C 電壓轉換電路請參照下面網頁的說明
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 上。
  1. DEBUG:如果只開啟 DEBUG 模式,溫度、壓力的計算過程會輸出到螢幕上,溫度、大氣壓力、海拔高度與反算海平面壓力與大氣壓力的結果也會輸出到螢幕上。 ( line 82 )

  2. DISPLAY_ON_I2CLCD:如果只開啟 DISPLAY_ON_I2CLCD 模式,則會將溫度、大氣壓力與海拔高度輸出到 LCD 上,顯示的結果如上面的照片一樣,但就不會再顯示在螢幕上了。( line 32 )

  3. 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 的其他函式幾乎都可以由 "如何使用 Borch 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 還是螢幕上。這幾個使用到的函式直接依樣畫葫蘆照著做就可以了,就是輸出函式回傳結果。

或許上面我講的很簡短,但如果有原始檔而且只是要用或是測試,上面的講解就很足夠了。如果要了解這個程式裡面的細節,整個程式撰寫所需要的觀念以及方式,都在 "如何使用 Borch BMP180 數位氣壓感測器模組計算溫度、大氣壓力與海拔高度 ?" 網頁裡,對照著流程與裡面的講述對照著程式碼,一些細部參數再看資料手冊,相信不難了解 !

在 BMP180 一系列的使用說明中,最大的遺珠之憾就是無法取得即時的海平面壓力 !!!

但在經過這一段時間一邊寫一邊找資料的結果,這問題可以解決了 ! 雖然不是即時,但每隔兩小時的更新週期,應該算的上即時吧 ! 在後續的 BMP180 使用說明中,我將會分享取得這資料,讓 BMP180 的使用更加的完善 !


<< BMP180 數位氣壓感測器系列文章 >>

沒有留言:

張貼留言