eagler8 发表于 2019-7-24 20:35:19

eagler8 发表于 2019-7-24 20:38:24

主要特点
压力范围: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
无需外部时钟电路

eagler8 发表于 2019-7-24 20:50:44

技术数据
压力范围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,马克斯。

eagler8 发表于 2019-7-24 21:00:47

典型应用
GPS精准导航(航位推算,上下桥检测等)
室内室外导航
休闲、体育和医疗健康等监测
天气预报
垂直速度指示(上升/下沉速度)
风扇功率控制
体育设备,如高度剖面

eagler8 发表于 2019-7-24 21:04:28

BMP180 新款 BOSCH温度模块气压传感器

eagler8 发表于 2019-7-25 06:33:52

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

eagler8 发表于 2019-7-25 06:36:46

特性曲线

eagler8 发表于 2019-7-25 07:29:22

模块电原理图

eagler8 发表于 2019-7-25 07:33:53

eagler8 发表于 2019-7-25 07:53:41

eagler8 发表于 2019-7-25 08:06:51

需要用的 “SFE_BMP180” 库文件如下
SFE_BMP180.h
/*
【Arduino】66种传感器模块系列实验(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

eagler8 发表于 2019-7-25 08:20:11

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

#include <SFE_BMP180.h>
#include <Wire.h>
#include <stdio.h>
#include <math.h>

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;

    data = address;
    if (readBytes(data,2))
    {
      value = (int16_t)((data<<8)|data);
      
negative
      return(1);
    }
    value = 0;
    return(0);
}

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

{
    unsigned char data;

    data = address;
    if (readBytes(data,2))
    {
      value = (((uint16_t)data<<8)|(uint16_t)data);
      return(1);
    }
    value = 0;
    return(0);
}

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

{
    char x;

    Wire.beginTransmission(BMP180_ADDR);
    Wire.write(values);
    _error = Wire.endTransmission();
    if (_error == 0)
    {
      Wire.requestFrom(BMP180_ADDR,length);
      while(Wire.available() != length) ;
      for(x=0;x<length;x++)
      {
            values = Wire.read();
      }
      return(1);
    }
    return(0);
}

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

{
    char x;
   
    Wire.beginTransmission(BMP180_ADDR);
    Wire.write(values,length);
    _error = Wire.endTransmission();
    if (_error == 0)
      return(1);
    else
      return(0);
}

char SFE_BMP180::startTemperature(void)

{
    unsigned char data, result;
   
    data = BMP180_REG_CONTROL;
    data = BMP180_COMMAND_TEMPERATURE;
    result = writeBytes(data, 2);
    if (result)
      return(5);
    else
      return(0);
}

char SFE_BMP180::getTemperature(double &T)

{
    unsigned char data;
    char result;
    double tu, a;
   
    data = BMP180_REG_RESULT;

    result = readBytes(data, 2);
    if (result)
    {
      tu = (data * 256.0) + data;
      
      a = c5 * (tu - c6);
      T = a + (mc / (a + md));

    }
    return(result);
}


char SFE_BMP180::startPressure(char oversampling)

{
    unsigned char data, result, delay;
   
    data = BMP180_REG_CONTROL;

    switch (oversampling)
    {
      case 0:
            data = BMP180_COMMAND_PRESSURE0;
            delay = 5;
      break;
      case 1:
            data = BMP180_COMMAND_PRESSURE1;
            delay = 8;
      break;
      case 2:
            data = BMP180_COMMAND_PRESSURE2;
            delay = 14;
      break;
      case 3:
            data = BMP180_COMMAND_PRESSURE3;
            delay = 26;
      break;
      default:
            data = BMP180_COMMAND_PRESSURE0;
            delay = 5;
      break;
    }
    result = writeBytes(data, 2);
    if (result)
      return(delay);
    else
      return(0);
}


char SFE_BMP180::getPressure(double &P, double &T)

sealevel().
{
    unsigned char data;
    char result;
    double pu,s,x,y,z;
   
    data = BMP180_REG_RESULT;

    result = readBytes(data, 3);
    if (result)
    {
      pu = (data * 256.0) + data + (data/256.0);
      
      s = T - 25.0;
      x = (x2 * pow(s,2)) + (x1 * s) + x0;
      y = (y2 * pow(s,2)) + (y1 * s) + y0;
      z = (pu - x) / y;
      P = (p2 * pow(z,2)) + (p1 * z) + p0;

    }
    return(result);
}


double SFE_BMP180::sealevel(double P, double A)

{
    return(P/pow(1-(A/44330.0),5.255));
}

double SFE_BMP180::altitude(double P, double P0)

{
    return(44330.0*(1-pow(P/P0,1/5.255)));
}


char SFE_BMP180::getError(void)
   
{
    return(_error);
}

eagler8 发表于 2019-7-25 08:38:56

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

eagler8 发表于 2019-7-25 11:05:48

/*
【Arduino】66种传感器模块系列实验(68)
实验六十八:BMP180 新款 BOSCH温度模块气压传感器(代替BMP085)
程序之一
*/

#include <SFE_BMP180.h>

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

eagler8 发表于 2019-7-25 11:13:13

页: 74 75 76 77 78 79 80 81 82 83 [84] 85 86 87 88 89 90 91 92 93
查看完整版本: 【Arduino】108种传感器模块系列实验(资料+代码+图形+仿真)