Arduino、ESP32驱动BMP585气压温度传感器(压力传感器)

2026-10-171

BMP585高精度气压温度传感器基于博世(Bosch)新一代工业级数字气压传感器BMP585核心打造,是一款集成了±0.3 hPa超高绝对精度、工业级防水防化学腐蚀防护、超低噪声(<0.1 Pa)、约700μA低运行功耗以及卓越长期稳定性的专业级环境监测模块。可同步直接输出高精度大气压、温度及计算出的海拔高度数据,有效解决了传统气压传感器在户外或工业等复杂环境中易受湿度、化学腐蚀及极端气候影响而导致的测量失准或损坏问题。其内置的先进数字温度和线性度补偿算法、硬件FIFO缓冲区及可配置IIR滤波器,能显著抑制环境扰动引起的数据抖动。模块支持I2C与UART双通信协议,并配套Arduino与Python开源库,极其便于集成,非常适用于无人机定高与避障、户外导航、室内外定位融合、气象监测以及GPS导航增强等对可靠性要求极高的项目。

图1

1、传感器特性

传统气压传感器在潮湿、多尘或存在化学气体的环境中容易性能衰减或失效。BMP585高精度气压温度传感器采用工业级防护设计与关键的凝胶填充腔技术,为核心传感元件提供了优异的物理屏障。这种设计能从本质上抵御水分、灰尘和多种化学物质的侵蚀,确保传感器在户外、工业现场等苛刻条件下依然能保持性能稳定,显著延长使用寿命。

BMP585高精度气压温度传感器的核心性能指标处于行业领先水平。其绝对气压测量精度高达±0.3 hPa,相对高度测量精度可达±0.5米(每10kPa变化)。同时,传感器输出的噪声极低,RMS值低于0.1 Pa,这意味着其数据输出非常平滑稳定,能够敏锐捕捉微小的气压变化,为无人机悬停定高、精密海拔测量等应用提供可靠的数据基础。

BMP585高精度气压温度传感器内置了旨在提升整个系统性能的硬件特性。集成的硬件FIFO(先入先出)缓冲区允许传感器自主存储多达512个数据点,主控制器可以大幅降低查询频率,仅在需要时批量读取数据,从而有效降低系统整体功耗。此外,可编程的IIR(无限脉冲响应)低通滤波器能够平滑数据,进一步抑制高频噪声。结合其约700μA的工作电流,这些特性使其非常适合电池供电的便携式设备或需要长期连续监测的物联网节点。

传感器特性如下所示:

  • 多协议接口:支持 I2C和UART通信,适配灵活
  • 多参数同步输出:直接测量气压、温度及计算海拔高度
  • 高精度测量:绝对精度±0.3 hPa,数据可靠
  • 低运行功耗:工作电流约700μA,续航持久
  • 低噪声输出:噪声低于0.1 Pa RMS,输出稳定
  • 可编程中断:支持阈值报警,便于事件驱动设计
  • 用户配置存储:内置 6 Bytes 非易失性内存,保存自定义配置
  • 硬件 FIFO 缓冲:降低主机查询频率,节省系统功耗
  • 集成可编程滤波器:可配置低通滤波,有效抑制高频噪声
  • 气压测量范围:30~125 kPa
  • 温度测量范围:0~65℃
  • 绝对气压测量精度:±0.3 hPa(Typ)
  • 相对气压测量精度:±0.06 hPa/10kPa(Typ)
  • 相对高度测量精度:±0.5 m/10kPa
  • 温度漂移系数:±0.5 Pa/K
  • 气压数据分辨率:1/64
  • 超低噪声:< 0.1 Pa(RMS,未启用低通滤波器)

2、硬件原理图

传感器原理图如下所示:

图2

3、控制器和传感器连线图

I2C模式下控制器和传感器连线图如下所示:

图3

按图示连接 BMP585 气压传感器与 ESP32-E,核心对应关系:

  • 传感器引脚 “VCC” → ESP32-E 3.3V
  • 传感器引脚 “GND” → ESP32-E GND
  • 传感器 I2C 引脚 “SCL” → ESP32-E SCL(默认 GPIO22)
  • 传感器 I2C 引脚 “SDA” → ESP32-E SDA(默认 GPIO21)

UART模式下控制器和传感器连线图如下所示:

图4

按图示连接 BMP585 气压传感器与 ESP32-E,核心对应关系:

  • 传感器引脚 “VCC” → ESP32-E 3.3V
  • 传感器引脚 “GND” → ESP32-E GND
  • 传感器 UART 引脚 “RX” → ESP32-E D3
  • 传感器 UART 引脚 “TX” → ESP32-E D2

4、驱动程序

4.1、I2C连续读取气压及温度数据

通过 ESP32-E 的 I2C 接口与 BMP585 气压传感器通信,连续读取气压、温度及海拔数据。

驱动程序如下所示:

#include "DFRobot_BMP58X.h"
#define BMP5_COMM_I2C
#define CALIBRATE_ABSOLUTE_DIFFERENCE
 
const uint8_t ADDR = 0x47;
DFRobot_BMP58X_I2C bmp58x(&Wire, ADDR);
 
void setup() {
  Serial.begin(115200);
  
  while(!bmp58x.begin()){
    Serial.println("Sensor init fail!");
    delay(1000);
  }
  Serial.println("Sensor init success!");
 
//校准绝对误差(根据实际高度修改参数)
  #if defined(CALIBRATE_ABSOLUTE_DIFFERENCE)
/*示例使用成都温江区540米的标高。使用时请用当地标高代替。*/
    bmp58x.calibratedAbsoluteDifference(540.0);
  #endif
 
  //将测量模式设置为正常模式
  bmp58x.setMeasureMode(bmp58x.eNormal);
}
 
void loop() {
  delay(1000);
 
  Serial.print("Temperature: ");
  Serial.print(bmp58x.readTempC());
  Serial.println(" °C");
  
  Serial.print("Atmospheric Pressure: ");
  Serial.print(bmp58x.readPressPa());
  Serial.println(" Pa");
  
  Serial.print("Altitude: ");
  Serial.print(bmp58x.readAltitudeM());
  Serial.println(" m");
  Serial.println("=================================");
}

运行效果如下所示:

图5

4.2、UART连续读取气压及温度数据

通过 ESP32-E 的 UART 接口与 BMP585 气压传感器通信,连续读取气压、温度及海拔数据。

驱动程序如下所示:

#include "DFRobot_BMP58X.h"
#include "DFRobot_RTU.h"
#define BMP5_COMM_UART
#define CALIBRATE_ABSOLUTE_DIFFERENCE
const uint8_t ADDR = 0x47;
 
#if defined(BMP5_COMM_UART)
  DFRobot_BMP58X_UART bmp58x(&Serial1, 9600, ADDR, /*rx*/ D2, /*tx*/ D3);
#else
  #error "Only UART communication is supported in this configuration"
#endif
 
void setup() {
  Serial.begin(115200);
  while(!bmp58x.begin()){
    Serial.println("传感器初始化失败!");
    delay(1000);
  }
//校准绝对误差(根据实际高度修改参数)
  #if defined(CALIBRATE_ABSOLUTE_DIFFERENCE)
/*示例使用成都温江区540米的标高。使用时请用当地标高代替。*/
    bmp58x.calibratedAbsoluteDifference(540.0);
  #endif
 
  bmp58x.setMeasureMode(bmp58x.eNormal);
}
 
void loop() {
  delay(1000);
  Serial.print("temp: ");
  Serial.print(bmp58x.readTempC());
  Serial.print(" (C)  press: ");
  Serial.print(bmp58x.readPressPa());
  Serial.print(" (Pa)  alt: ");
  Serial.print(bmp58x.readAltitudeM());
  Serial.println(" (M)");
}

运行效果如下所示:

图6

4.3、FIFO数据读取与中断触发

IFO(First In, First Out,先进先出)是传感器内部集成的数据缓冲机制,其核心特性是数据会暂时存到这里,等你需要时再一次性取走,确保数据时序的一致性。

在气压传感器中,FIFO 作为临时数据存储单元,承担着数据暂存与批量处理的功能:传感器按设定频率采集的温度、压力数据会先被有序写入 FIFO,而非实时传输至外部主机;当需要获取数据时,主机可通过单次操作读取 FIFO 中缓存的所有数据,实现批量获取。

与无缓冲机制相比,FIFO 的优势显著:

  • 避免了高频实时通信带来的总线资源占用,降低系统交互开销
  • 防止因主机处理延迟导致的瞬时数据丢失,保障数据完整性
  • 支持按需求批量读取,适配不同场景下的数据分析节奏

简言之,FIFO 是传感器与主机之间的数据协调单元,通过有序缓冲与批量传输,优化了数据交互效率与可靠性。

使用FIFO连续读取气压及温度数据,驱动程序如下所示:

#include "DFRobot_BMP58X.h"
#include "DFRobot_RTU.h"
 
#define BMP5_COMM_I2C
 
/* 如果不需要消除绝对测量误差,请取消注释此行 */
#define CALIBRATE_ABSOLUTE_DIFFERENCE
 
/**
 * 配置中断模式:取消下面宏的注释可使用锁存中断,
 * 否则为脉冲中断
 */
// #define BMP5_INT_MODE_LATCHED
 
const uint8_t ADDR = 0x47;
 
DFRobot_BMP58X_I2C bmp58x(&Wire, ADDR);
 
volatile uint8_t flag = 0;
/* 中断服务函数:触发时设置标志位 */
void interrupt() {
  if (flag == 0) {
    flag = 1;
  }
}
 
void setup() {
  Serial.begin(115200);
  Serial.println("启动..");
  
  while (!bmp58x.begin()) {
    Serial.println("传感器初始化失败!");
    delay(1000);
  }
 
  /**
   * 配置FIFO参数:
   * - 数据类型:压力+温度
   * - 下采样:无
   * - 模式:满时覆盖旧数据
   * - 阈值:2帧(达到时触发中断)
   */
  bmp58x.configFIFO(
    bmp58x.eFIFOPressAndTempData,  // 存储压力和温度数据
    bmp58x.eNoDownSampling,        // 不进行下采样
    bmp58x.eFIFOOverwriteMode,     // 覆盖模式
    0x02                           // 阈值为2帧
  );
 
  /**
   * 配置中断参数:
   * - 触发模式:脉冲/锁存(取决于宏定义)
   * - 极性:高电平有效
   * - 输出类型:推挽
   */
#if defined(BMP5_INT_MODE_LATCHED)
  bmp58x.configInterrupt(bmp58x.eIntModeLatched, bmp58x.eIntHighActive, bmp58x.eIntPushPull);
#else
  bmp58x.configInterrupt(bmp58x.eIntModePulsed, bmp58x.eIntHighActive, bmp58x.eIntPushPull);
#endif
 
  /* 设置中断源:FIFO达到阈值时触发 */
  bmp58x.setIntSource(bmp58x.eIntFIFOThres);
 
  #if defined(CALIBRATE_ABSOLUTE_DIFFERENCE)
  /**
   * 以540米为参考海拔校准绝对差值
   * (实际使用时修改为当地海拔)
   */
  bmp58x.calibratedAbsoluteDifference(540.0);
  #endif
 
  /* 设置测量模式:正常模式(连续测量) */
  bmp58x.setMeasureMode(bmp58x.eNormal);
 
  /* 将中断附着到ESP32的D6引脚(上升沿触发) */
  attachInterrupt(digitalPinToInterrupt(D6), interrupt, RISING);
}
 
void loop() {
  /* 锁存中断需要读取状态寄存器以清除标志位 */
#if defined(BMP5_INT_MODE_LATCHED)
  bmp58x.getIntStatus();
#endif
 
  /* 检测到中断标志时,读取FIFO数据并打印 */
  if (flag == 1) {
    DFRobot_BMP58X::sFIFOData_t data = bmp58x.getFIFOData();
    Serial.print("FIFO len: ");
    Serial.println(data.len);
    
    /* 循环打印FIFO中的所有数据 */
    for(int i = 0; i < data.len; ++i){
      Serial.print("temp: ");
      Serial.print(data.fifoTempC[i]);
      Serial.print(" (C) pressure: ");
      Serial.print(data.fifoPressPa[i]);
      Serial.println(" (Pa)");
    }
    
    flag = 0;  // 清除标志位,等待下一次中断
  }
}

运行效果如下所示:

图7

创作许可协议

本项目采用 CC BY(署名) 进行许可。

评论(0)
- 没有更多了 -