成人伊人|一艘游轮一百个女的一个男的|绿巨人污|韩国三级电影网址|国产深夜福利

當前位置: 首頁 > 傳感器常見問題 > 基于arduino平臺的BMP085氣壓傳感器教程

相關商品

瀏覽歷史

基于arduino平臺的BMP085氣壓傳感器教程
BOSCH / 2013-05-10

 BMP085是一款高精度、超低能耗的壓力傳感器,可以應用在移動設備中。它的性能卓越,絕對精度最低可以達到0.03hPa,并且耗電極低,只有3μABMP085采用強大的8-pin陶瓷無引線芯片承載(LCC)超薄封裝,可以通過I2C總線直接與各種微處理器相連。

主要特點:

壓力范圍:300 ... 1100hPa(海拔9000...-500米)

電源電壓:1.8V ... 3.6VVDDA 1.62V ... 3.6VVDDD

LCC8封裝: 無鉛陶瓷載體封裝(LCC

 寸: 5.0mmx5.0*1.2mm

低功耗: 5μA 在標準模式

高精度:低功耗模式下,分辨率為0.06hPa0.5米), 高線性模式下,分辨率為0.03hPa0.25米)

反應時間:7.5ms

待機電流:0.1μA無需外部時鐘電路

典型應用: 1.GPS精確導航(航位推算,上下橋檢測等)2.室內室外導航3.休閑、體育和醫療健康等監測4.天氣預報5.垂直速度指示(上升/下沉速度)6.風扇功率控制

硬件說明

BMP085 Breakout Board一共有6個引腳:'SDA', 'SCL', 'XCLR', 'EOC', 'GND’,'VCC’SDASCLI2C總線引腳;XCLRmaster的復位引腳,低有效,如果把它與地相連,就可以復位BMP085ECO意為 ”end of conversion”BMP085的壓力或溫度轉換完成時觸發產生的信號。XCLRECO是可選的2個信號,如果不需要用它,則可以不連接。

值得注意的是,BMP085能承受的VCC最大電壓為3.6V,當你用arduino時,請注意選擇3.3V供電。

如何進行溫度和壓力的測量?

BMP085是通過I2C總線arduino相連,連接方式如圖所示:

這里,我們可以不連接XCLR  EOC對測量沒有影響。接下來,compile arduino程序,uploadarduino開發板上,點擊打開串口,就可以看見當前的溫度和大氣壓強。

 

代碼如下:

/*

  Get pressure and temperature from the BMP085.

  Serial.print it out at 9600 baud to serial monitor.

*/

 

#include <Wire.h>

 

#define BMP085_ADDRESS 0x77  // I2C address of BMP085

 

const unsigned char OSS = 0;  // Oversampling Setting

 

// Calibration values

int ac1;

int ac2;

int ac3;

unsigned int ac4;

unsigned int ac5;

unsigned int ac6;

int b1;

int b2;

int mb;

int mc;

int md;

 

// b5 is calculated in bmp085GetTemperature(...), this variable is also used in bmp085GetPressure(...)

// so ...Temperature(...) must be called before ...Pressure(...).

long b5;

 

short temperature;

long pressure;

 

void setup()

{

  Serial.begin(9600);

  Wire.begin();

  bmp085Calibration();

}

 

void loop()

{

  temperature = bmp085GetTemperature(bmp085ReadUT());

  pressure = bmp085GetPressure(bmp085ReadUP());

  Serial.print("Temperature: ");

  Serial.print(temperature, DEC);

  Serial.println(" *0.1 deg C");

  Serial.print("Pressure: ");

  Serial.print(pressure, DEC);

  Serial.println(" Pa");

  Serial.println();

  delay(1000);

}

 

// Stores all of the bmp085's calibration values into global variables

// Calibration values are required to calculate temp and pressure

// This function should be called at the beginning of the program

void bmp085Calibration()

{

  ac1 = bmp085ReadInt(0xAA);

  ac2 = bmp085ReadInt(0xAC);

  ac3 = bmp085ReadInt(0xAE);

  ac4 = bmp085ReadInt(0xB0);

  ac5 = bmp085ReadInt(0xB2);

  ac6 = bmp085ReadInt(0xB4);

  b1 = bmp085ReadInt(0xB6);

  b2 = bmp085ReadInt(0xB8);

  mb = bmp085ReadInt(0xBA);

  mc = bmp085ReadInt(0xBC);

  md = bmp085ReadInt(0xBE);

}

 

// Calculate temperature given ut.

// Value returned will be in units of 0.1 deg C

short bmp085GetTemperature(unsigned int ut)

{

  long x1, x2;

 

  x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;

  x2 = ((long)mc << 11)/(x1 + md);

  b5 = x1 + x2;

 

  return ((b5 + 8)>>4); 

}

 

// Calculate pressure given up

// calibration values must be known

// b5 is also required so bmp085GetTemperature(...) must be called first.

// Value returned will be pressure in units of Pa.

long bmp085GetPressure(unsigned long up)

{

  long x1, x2, x3, b3, b6, p;

  unsigned long b4, b7;

 

  b6 = b5 - 4000;

  // Calculate B3

  x1 = (b2 * (b6 * b6)>>12)>>11;

  x2 = (ac2 * b6)>>11;

  x3 = x1 + x2;

  b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;

 

  // Calculate B4

  x1 = (ac3 * b6)>>13;

  x2 = (b1 * ((b6 * b6)>>12))>>16;

  x3 = ((x1 + x2) + 2)>>2;

  b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;

 

  b7 = ((unsigned long)(up - b3) * (50000>>OSS));

  if (b7 < 0x80000000)

    p = (b7<<1)/b4;

  else

    p = (b7/b4)<<1;

   

  x1 = (p>>8) * (p>>8);

  x1 = (x1 * 3038)>>16;

  x2 = (-7357 * p)>>16;

  p += (x1 + x2 + 3791)>>4;

 

  return p;

}

 

// Read 1 byte from the BMP085 at 'address'

char bmp085Read(unsigned char address)

{

  unsigned char data;

 

  Wire.beginTransmission(BMP085_ADDRESS);

  Wire.send(address);

  Wire.endTransmission();

 

  Wire.requestFrom(BMP085_ADDRESS, 1);

  while(!Wire.available())

    ;

   

  return Wire.receive();

}

 

// Read 2 bytes from the BMP085

// First byte will be from 'address'

// Second byte will be from 'address'+1

int bmp085ReadInt(unsigned char address)

{

  unsigned char msb, lsb;

 

  Wire.beginTransmission(BMP085_ADDRESS);

  Wire.send(address);

  Wire.endTransmission();

 

  Wire.requestFrom(BMP085_ADDRESS, 2);

  while(Wire.available()<2)

    ;

  msb = Wire.receive();

  lsb = Wire.receive();

 

  return (int) msb<<8 | lsb;

}

 

// Read the uncompensated temperature value

unsigned int bmp085ReadUT()

{

  unsigned int ut;

 

  // Write 0x2E into Register 0xF4

  // This requests a temperature reading

  Wire.beginTransmission(BMP085_ADDRESS);

  Wire.send(0xF4);

  Wire.send(0x2E);

  Wire.endTransmission();

 

  // Wait at least 4.5ms

  delay(5);

 

  // Read two bytes from registers 0xF6 and 0xF7

  ut = bmp085ReadInt(0xF6);

  return ut;

}

 

// Read the uncompensated pressure value

unsigned long bmp085ReadUP()

{

  unsigned char msb, lsb, xlsb;

  unsigned long up = 0;

 

  // Write 0x34+(OSS<<6) into register 0xF4

  // Request a pressure reading w/ oversampling setting

  Wire.beginTransmission(BMP085_ADDRESS);

  Wire.send(0xF4);

  Wire.send(0x34 + (OSS<<6));

  Wire.endTransmission();

 

  // Wait for conversion, delay time dependent on OSS

  delay(2 + (3<<OSS));

 

  // Read register 0xF6 (MSB), 0xF7 (LSB), and 0xF8 (XLSB)

  Wire.beginTransmission(BMP085_ADDRESS);

  Wire.send(0xF6);

  Wire.endTransmission();

  Wire.requestFrom(BMP085_ADDRESS, 3);

 

  // Wait for data to become available

  while(Wire.available() < 3)

    ;

  msb = Wire.receive();

  lsb = Wire.receive();

  xlsb = Wire.receive();

 

  up = (((unsigned long) msb << 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);

 

  return up;

}

 

 

 

BMP085 博世BOSCH氣壓傳感器購買鏈接 http://www.szktazwx.com/goods-111.html

 

用戶評論(共0條評論)

  • 暫時還沒有任何用戶評論
總計 0 個記錄,共 1 頁。 第一頁 上一頁 下一頁 最末頁
用戶名: 游客
E-mail:
評價等級:
評論內容: