欢迎光临
我们一直在努力

大气压传感器BMP180 示例教程 适用于Arduino平台

1. 产品图片

2. 产品购买地址点我购买
3. 产品概述
Bosch Sensortec开发出一款智能,超小体积,高精度数字传感器BMP180,适合智能的高精度测量和数据采集,输出高精度的压力(或高度)和温度测量数据。可与加速度计相互搭配,在没有GPS讯号的环境下,提供可靠的楼层侦测能力,以实现三维(3D)室内导航。本传感器可以检测:温度,大气压强,海拔高度。

4. 产品参数
工作范围:-40~+85 ℃
压强精度:0.12hPa/m
接口类型:4pin 排针和 1.27间距 IDC10座

5. 引脚定义
模块共有4个引脚,从上到下是5V,GND,SCL,SDA。模块可以通过I2C和单片机通信,5V供电。在模块反面有引脚标示。

6. 曲线特性

7. 接线方式
1.先连接芯片与单片机(通过I2C接口),按照如下方式连接。
5V—VIN
GND–GND
A5—SCL
A4—SDA
2.然后UNO通过usb与PC电脑连接。
3.拷贝以下的代码烧录进单片机。

8. 示例程序

//中贝斯特UltiRobot大气压传感器示例教程
//程序效果:测出当前环境下的大气压强和计算出芯片的海拔高度
//淘宝店地址:zhongbest.taobao.com
//专业Arduino资料网站:www.arduino365.com
#include <Wire.h>
#define BMP180ADD 0xEE>>1  // I2C address of BMP180  
                            //write is (0xEE)     read is (0xEF)       
unsigned char OSS;                            
/**********************MSB      LSB******/
int ac1;           // 0xAA     0xAB
int ac2;           // 0xAC     0xAD
int ac3;           // 0xAE     0xAE
unsigned int ac4;  // 0xB0     0xB1
unsigned int ac5;  // 0xB2     0xB3
unsigned int ac6;  // 0xB4     0xB5
int b1;            // 0xB6     0xB7
int b2;            // 0xB8     0xB9
int mb;            // 0xBA     0xBB
int mc;            // 0xBC     0xBD
int md;            // 0xBE     0xBF
float temperature;  
double pressure;   
double pressure2;
long b5;          
double altitude; 

void setup()
{
   Serial.begin(9600);
   Wire.begin();
   OSS = 2;  // Oversampling Setting           0: single    1: 2 times    2: 4 times   3: 8 times 
   BMP180start();
}

void loop()
{
   calculate();
   show();
   delay(1000);
}

/** calculate centure **/
void calculate()
{
   temperature = bmp180GetTemperature(bmp180ReadUT());
   temperature = temperature*0.1;
   pressure = bmp180GetPressure(bmp180ReadUP());
   pressure2 = pressure/101325;
   pressure2 = pow(pressure2,0.19029496);
   altitude = 44330*(1-pressure2);                            //altitude = 44330*(1-(pressure/101325)^0.19029496);
}

/** print reslut **/
void show()
{
   Serial.print("Temperature: ");
   Serial.print(temperature, 1);                            //10 hexadecimal
   Serial.println(" C");
   Serial.print("Pressure: ");
   Serial.print(pressure, 0);                               //10 hexadecimal
   Serial.println(" Pa");
   Serial.print("altitude:");
   Serial.print(altitude);
   Serial.println("m");
}

/**BMP180 satrt program**/
void BMP180start()
{                     /*MSB*/
   ac1 = bmp180ReadDate(0xAA);                      //get full data
   ac2 = bmp180ReadDate(0xAC);  
   ac3 = bmp180ReadDate(0xAE);  
   ac4 = bmp180ReadDate(0xB0);  
   ac5 = bmp180ReadDate(0xB2);  
   ac6 = bmp180ReadDate(0xB4);  
   b1  = bmp180ReadDate(0xB6);  
   b2  = bmp180ReadDate(0xB8);  
   mb  = bmp180ReadDate(0xBA);  
   mc  = bmp180ReadDate(0xBC);  
   md  = bmp180ReadDate(0xBE);
}

/***BMP180 temperature Calculate***/
short bmp180GetTemperature(unsigned int ut)
{
   long x1, x2;
   x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;  //x1=((ut-ac6)*ac5)/(2^15)
   x2 = ((long)mc << 11)/(x1 + md);                //x2=(mc*2^11)/(x1+md)
   b5 = x1 + x2;                                   //b5=x1+x2
   return ((b5 + 8)>>4);                           //t=(b5+8)/(2^4)
}

/***BMP180 pressure Calculate***/

long bmp180GetPressure(unsigned long up)
{
   long x1, x2, x3, b3, b6, p;
   unsigned long b4, b7;

   b6 = b5 - 4000;

  x1 = (b2 * (b6 * b6)>>12)>>11;
   x2 = (ac2 * b6)>>11;
   x3 = x1 + x2;
   b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;

   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 bytes from the BMP180  ***/

int bmp180Read(unsigned char address)
{
   unsigned char data;

   Wire.beginTransmission(BMP180ADD);
   Wire.write(address);
   Wire.endTransmission();

   Wire.requestFrom(BMP180ADD, 1);
   while(!Wire.available());

   return Wire.read();
}

/*** Read 2 bytes from the BMP180 ***/
int bmp180ReadDate(unsigned char address)
{
   unsigned char msb, lsb;
   Wire.beginTransmission(BMP180ADD);
   Wire.write(address);
   Wire.endTransmission();
   Wire.requestFrom(BMP180ADD, 2);
   while(Wire.available()<2);
   msb = Wire.read();
   lsb = Wire.read();
   return (int) msb<<8 | lsb;
}

/*** read uncompensated temperature value ***/
unsigned int bmp180ReadUT()
{
   unsigned int ut;
   Wire.beginTransmission(BMP180ADD);
   Wire.write(0xF4);                       // Write 0x2E into Register 0xF4
   Wire.write(0x2E);                       // This requests a temperature reading
   Wire.endTransmission();  
   delay(5);                               // Wait at least 4.5ms
   ut = bmp180ReadDate(0xF6);               // read MSB from 0xF6 read LSB from (16 bit)
   return ut;
}

/*** Read uncompensated pressure value from BMP180 ***/
unsigned long bmp180ReadUP()
{
   unsigned char msb, lsb, xlsb;
   unsigned long up = 0;

   Wire.beginTransmission(BMP180ADD);
   Wire.write(0xF4);                        // Write 0x34+(OSS<<6) into register 0xF4
   Wire.write(0x34 + (OSS<<6));             // 0x34+oss*64
   Wire.endTransmission(); 
   delay(2 + (3<<OSS));                     // Wait for conversion, delay time dependent on OSS

   Wire.beginTransmission(BMP180ADD);
   Wire.write(0xF6);                        // Read register 0xF6 (MSB), 0xF7 (LSB), and 0xF8 (XLSB)
   Wire.endTransmission();

   Wire.requestFrom(BMP180ADD, 3); 
   while(Wire.available() < 3);             // Wait for data to become available
   msb = Wire.read();
   lsb = Wire.read();
   xlsb = Wire.read();
   up = (((unsigned long) msb << 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);//16 to 19 bit
   return up;
}

9. 相关下载
百度网盘:点我下载

未经允许不得转载:Arduino-Maker » 大气压传感器BMP180 示例教程 适用于Arduino平台

支付宝扫码打赏 微信打赏

原创文章,若帮到您,欢迎打赏

分享到:更多 ()

评论 1

评论前必须登录!

 

  1. #1

    这个大气压强传感器,如何LCD12864在屏幕上显示

    wolf9个月前 (10-30)

线上商城

中贝斯特创客空间蘑菇云创客教育