锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

arduino低功耗模式_【雕爷学编程】Arduino动手做(67)---BMP180气压传感器

时间:2023-12-01 08:07:02 rohs交流电流传感器

2b26f29a764cc9b0d4c2de2ee348ff11.png

37个传感器和执行器的提法在互联网上广泛传播。事实上,Arduino能兼容的传感器模块肯定不止这37种。鉴于我积累了一些传感器和执行模块,根据实践知识(必须做)的概念,为了学习和交流,这里准备逐一尝试一系列实验,无论成功(程序),都会记录——小进步或问题,希望能吸引玉。

【Arduino】数据 代码 图形 仿真)

实验67: GY-68 BMP180 新款 BOSCH气压传感器(温度模块)BMP085)

BMP180

博世Sensortec新型数字气压传感器性能高,使用智能手机、平板电脑、运动设备等先进的移动设备。它遵循了BMP085带来了很多改进,比如小尺寸和数字。超低功耗降至3μA使BMP180节电是您移动设备的领导者。BMP性能也很稳定,最好有独立电源供电。BMP180是一种高精度、小体积、超低能耗的压力传感器,可应用于移动设备,其性能优异,绝对精度可达0.03hPa,而且耗电极低,只有3μA。BMP180采用强大的8-pin承载陶瓷无引线芯片(LCC)超薄包装,可通过I2C总线直接连接到各种微处理器

BMP180主要特点

压力范围:300~1100hPa(海拔9000米~-500米)

电源电压:1.8V~3.6V(VDDA),1.62V~3.6V(VDDD) VIN需要5V

LCC8包装:无铅陶瓷载体包装(LCC)

低功耗:5μA,在标准模式

高精度:在低功耗模式下,分辨率为0.06hPa(0.5米)

在高线模式下,分辨率为0.03hPa(0.25米)

含温度输出

I2C接口

温度补偿

无铅,符合RoHS规范

MSL 1反应时间:7.5ms

待机电流:0.1μA

无需外部时钟电路

BMP180技术数据

压力范围300……1100 hPa

方根噪声表达压力0.06 hPa typ。(超低功耗模式)

0.02 hPa typ。(超高分辨率模式)

方根噪声表达高度0.5 m,typ。(超低功耗模式)

0.17米,typ。(超高分辨率模式)

相对精度的压力

VDD = 3.3 v 950……1050 hPa / hPa±0.12

@ 25°C / m±1.0

700年……900 hPa / hPa±0.12

25…40°C / m±1.0

绝对精度

p = 300…1100 hpa

(温度= 0… 65°C,VDD = 3.3。-4.0 V)压力:…… 2.0 hPa

温度:±1°C,typ。

平均电流消耗(1 Hz刷新率数据)

峰值电流3μA典型(超低功耗模式)

32μA,典型的(高级模式)

650μA,典型的

待机电流1.62……3.6 V

电源电压vddio 1.62……3.6 V

电源电压vdd 1.8……3.6 V

操作温度。

40范围全面准确… 85°C

0… 65°C

conv压力。5毫秒,典型的(标准模式)

I2C传输速率3.4 MHz,马克斯。

BMP180典型应用

GPS精确导航(航位计算、上下桥检测等)

室内外导航

监测休闲、体育和医疗健康

天气预报

垂直速度指示(上升/下沉)

风扇功率控制

高度剖面等运动设备

BMP180气压模块是一种高精度、小体积、低能耗的压力传感器,可应用于移动设备,性能优异,绝对精度最低可达0.03hPa,而且耗电极低,只有3μA。BMP180采用强大的8-pin承载陶瓷无引线芯片(LCC)超薄包装,可通过I2C总线直接连接到各种微处理器。

特性曲线

模块电原理图

需要用的 “SFE_BMP180” 库文件如下

SFE_BMP180.h

/*  【Arduino】66种传感器模块系列实验(68)  实验68:BMP180 新款 BOSCH温度模块气压传感器(BMP085)  SFE_BMP180.h  */    #ifndef SFE_BMP180_h  #define SFE_BMP180_h  #if defined(ARDUINO) && ARDUINO >= 100  #include "Arduino.h"  #else  #include "WProgram.h"  #endif  class SFE_BMP180  {    public:        SFE_BMP180();         char begin();          shorted?)                char startTemperature(void);                  char getTemperature(double &T);          startTemperature command                  char startPressure(char oversampling);                  char getPressure(double &P, double &T);          startPressure command                double sealevel(double P, double A);          weather data)                  double altitude(double P, double P0);          sea-level, runway, etc.)                  char getError(void);              private:             char readInt(char address, int16_t &value);                  char readUInt(char address, uint16_t &value);                 char readBytes(unsigned char *values, char length);                            char writeBytes(unsigned char *values, char length);          subsequent registers)                  int16_t AC1,AC2,AC3,VB1,VB2,MB,MC,MD;        uint16_t AC4,AC5,AC6;         double c5,c6,mc,md,x0,x1,x2,y0,y1,y2,p0,p1,p2;        char _error;  };  #define BMP180_ADDR 0x77   #define BMP180_REG_CONTROL 0xF4  #define BMP180_REG_RESULT 0xF6  #define BMP180_COMMAND_TEMPERATURE 0x2E  #define BMP180_COMMAND_PRESSURE0 0x34  #define BMP180_COMMAND_PRESSURE1 0x74  #define BMP180_COMMAND_PRESSURE2 0xB4  #define BMP180_COMMAND_PRESSURE3 0xF4

SFE_BMP180.cp

/*  【Arduino】66传感器模块系列实验(68)  实验68:BMP180 新款 BOSCH温度模块气压传感(代替BMP085)

SFE_BMP180.cp

*/

#include 

#include 

#include 

#include 

SFE_BMP180::SFE_BMP180()

{

}

char SFE_BMP180::begin()

{

    double c3,c4,b1;



    Wire.begin();

    if (readInt(0xAA,AC1) &&

        readInt(0xAC,AC2) &&

        readInt(0xAE,AC3) &&

        readUInt(0xB0,AC4) &&

        readUInt(0xB2,AC5) &&

        readUInt(0xB4,AC6) &&

        readInt(0xB6,VB1) &&

        readInt(0xB8,VB2) &&

        readInt(0xBA,MB) &&

        readInt(0xBC,MC) &&

        readInt(0xBE,MD))

    {

AC6 = 23153;



Calcs.pdf



25671; AC6 = 18974;

        c3 = 160.0 * pow(2,-15) * AC3;

        c4 = pow(10,-3) * pow(2,-15) * AC4;

        b1 = pow(160,2) * pow(2,-30) * VB1;

        c5 = (pow(2,-15) / 160) * AC5;

        c6 = AC6;

        mc = (pow(2,11) / pow(160,2)) * MC;

        md = MD / 160.0;

        x0 = AC1;

        x1 = 160.0 * pow(2,-13) * AC2;

        x2 = pow(160,2) * pow(2,-25) * VB2;

        y0 = c4 * pow(2,15);

        y1 = c4 * c3;

        y2 = c4 * b1;

        p0 = (3791.0 - 8.0) / 1600.0;

        p1 = 1.0 - 7357.0 * pow(2,-20);

        p2 = 3038.0 * 100.0 * pow(2,-36);

        return(1);

    }

    else

    {



        return(0);

    }

}

char SFE_BMP180::readInt(char address, int16_t &value)

{

    unsigned char data[2];

    data[0] = address;

    if (readBytes(data,2))

    {

        value = (int16_t)((data[0]<<8)|data[1]);



negative

        return(1);

    }

    value = 0;

    return(0);

}

char SFE_BMP180::readUInt(char address, uint16_t &value)

{

    unsigned char data[2];

    data[0] = address;

    if (readBytes(data,2))

    {

        value = (((uint16_t)data[0]<<8)|(uint16_t)data[1]);

        return(1);

    }

    value = 0;

    return(0);

}

char SFE_BMP180::readBytes(unsigned char *values, char length)

{

    char x;

    Wire.beginTransmission(BMP180_ADDR);

    Wire.write(values[0]);

    _error = Wire.endTransmission();

    if (_error == 0)

    {

        Wire.requestFrom(BMP180_ADDR,length);

while(Wire.available() != length) ; 

        for(x=0;x

模块接线方式

1.先连接芯片与单片机(通过I2C接口),按照如下方式连接

5V—VIN

GND–GND

A5—SCL

A4—SDA

2.然后UNO通过usb与PC电脑连接

3.拷贝后面的代码烧录进Arduino

实验开源代码

/*

【Arduino】66种传感器模块系列实验(68)

实验六十八:BMP180 新款 BOSCH温度模块气压传感器(代替BMP085)

程序之一

*/



#include 

SFE_BMP180 AirPresure;

char presureDelayTime;

double presureP, presureT;

void setup() {

  Serial.begin(9600);

  AirPresure.begin();

}

void loop()

{

  presureDelayTime = AirPresure.startPressure(3);

  if (presureDelayTime != 0)

  {

  delay(presureDelayTime);

  presureDelayTime = AirPresure.getPressure(presureP, presureT);

  if (presureDelayTime != 0)

  {

    

    Serial.print("Current Preasure: ");

    Serial.print(presureP);

    Serial.println(" bar");

    Serial.print(presureP);

    Serial.print(" bar is");

    Serial.print(presureP / 1000.0);

    Serial.println(" atm");

  }

  else

  {

    Serial.println("ERROR");

  }

  }

  else

  {

  Serial.println("ERROR");

  }

  delay(1000);

}

/*
【Arduino】168种传感器模块系列实验(67)
实验六十七:BMP180 新款 BOSCH温度模块气压传感器(代替BMP085)
程序之二,气温、气压与海拔值可以调整并校准
*/

#include 
#define BMP180ADD 0x77    
                                 
unsigned char OSS;                            

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;            
float temperature;  
double pressure;   
double pressure2;
long b5;          
double altitude;  



void setup()
{
  Serial.begin(9600);
  Wire.begin();
  OSS = 2;  
  BMP180start();
}

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

void calculate()
{
  temperature = bmp180GetTemperature(bmp180ReadUT());
  temperature = temperature*0.0137;
  pressure = bmp180GetPressure(bmp180ReadUP());
  pressure2 = pressure/115325;
  pressure2 = pow(pressure2,0.29029496);
  altitude = 39*(1+pressure2);                            
}


void show()
{
  Serial.print("气温: ");
  Serial.print(temperature, 1);                            
  Serial.println(" C");
  Serial.print("气压: ");
  Serial.print(pressure, 0);                               
  Serial.println(" Pa");
  Serial.print("海拔:");
  Serial.print(altitude);
  Serial.println("m");
}

void BMP180start()
{                     
  ac1 = bmp180ReadDate(0xAA);                     
  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);
}

short bmp180GetTemperature(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);                           
}

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)<>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;
}

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();
}

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;
}

unsigned int bmp180ReadUT()
{
  unsigned int ut;
  Wire.beginTransmission(BMP180ADD);
  Wire.write(0xF4);                       
  Wire.write(0x2E);                       
  Wire.endTransmission();  
  delay(5);                               
  ut = bmp180ReadDate(0xF6);               
  return ut;
}

unsigned long bmp180ReadUP()
{
  unsigned char msb, lsb, xlsb;
  unsigned long up = 0;
  
  Wire.beginTransmission(BMP180ADD);
  Wire.write(0xF4);                        
  Wire.write(0x34 + (OSS<<6));             
  Wire.endTransmission(); 
  delay(2 + (3<> (8-OSS);//16 to 19 bit
  return up;
}

/*

【Arduino】168种传感器模块系列实验(67)

实验六十七:BMP180 新款 BOSCH温度模块气压传感器(代替BMP085)

程序之三,温度、实时气压、已知海拔计算的海平面的气压、已知海平面气压计算的高度

只是算法有点烂,做做实验而已

*/



#include  

#include  

SFE_BMP180 pressure; 

#define ALTITUDE 255.0 

unsigned long gpstimes;

void setup() 

{ 

Serial.begin(9600); 

pressure.begin(); 

} 

void loop() 

{ 

gpstimes=millis();

char status; 

double T,P,p0,a; 

status = pressure.startTemperature(); 

delay(status); 

status = pressure.getTemperature(T); 

delay(status); 

Serial.print("temperature: "); 

Serial.print(T,2); 

Serial.println(" deg C, "); 

status = pressure.startPressure(3); 

delay(status); 

status = pressure.getPressure(P,T); 

// Print out the measurement: 

Serial.print("absolute pressure A: "); 

Serial.print(P,2); 

Serial.println(" mb, "); 

p0=1013.2;

a = pressure.altitude(P,p0); 

Serial.print("computed altitude A: "); 

Serial.print(a,0); 

Serial.println(" meters, "); 

T=25.00;

status = pressure.getPressure(P,T); 

Serial.print("absolute pressure B: "); 

Serial.print(P,2); 

Serial.println(" mb, "); 

p0=1013.2;

a = pressure.altitude(P,p0); 

Serial.print("computed altitude B: "); 

Serial.print(a,0); 

Serial.println(" meters, "); 

gpstimes=millis()-gpstimes;

Serial.print("gpstimes="); 

Serial.println(gpstimes); 

Serial.println();

delay(2000); 

}

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章