产品简介
这是一款基于博世新一代高性能数字气压传感器BMP581设计的高精度气压温度传感器。它可同步直接输出大气压、温度及计算出的海拔高度数据。相比前代产品,其核心优势在于更高的绝对精度(±0.3 hPa)、超低的休眠电流(约2μA)、更低噪声(<0.1 Pa)以及更高的长期稳定性。
其内置先进的数字温度和线性度补偿算法,并集成FIFO缓冲区及可配置IIR滤波器。通过硬件级的数据缓冲与实时滤波处理,显著抑制了环境扰动引起的数据抖动,从而在动态应用场景中提供更可靠、更稳定的测量输出。
本产品支持I2C、SPI与I3C通信,可灵活集成,并配套提供Arduino及Python开源代码库,助力快速完成原型验证与系统集成。产品设计上保留了传感器的全部原生特点,包括小尺寸、高精度、低功耗及稳定可靠性,使其成为无人机定高、户外导航设备、环境监测、气象站等项目开发与设备集成的理想传感解决方案。
产品特性
- 多协议接口:支持 I2C、SPI、I3C 通信,适配灵活
- 多参数同步输出:直接测量气压、温度及计算海拔高度
- 高精度测量:绝对精度 ±0.3 hPa,数据可靠
- 超低功耗:休眠电流仅2μA,续航持久
- 低噪声输出:噪声低于0.1 Pa RMS,输出稳定
- 可编程中断:支持阈值报警,便于事件驱动设计
- 用户配置存储:内置 6 Bytes 非易失性内存,保存自定义配置
- 硬件 FIFO 缓冲:降低主机查询频率,节省系统功耗
- 集成可编程滤波器:可配置低通滤波,有效抑制高频噪声
应用场景
- 室外环境监测
- 无人机定高与避障
- 登山海拔测量
- 楼层检测
- 户外导航
- 户外气象站
技术规格
基本参数
- 工作电压:DC 3.3V
- 工作电流:200μA
- 休眠电流:2μA
- 通讯接口:I2C/I3C/SPI
- 接口形式:2.54mm排针孔
- I2C地址:0x47(默认)/0x46
BMP581参数
- 气压测量范围: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,未启用低通滤波器)
物理尺寸
- PCB尺寸:19×16×2.49 mm
- 安装孔间距:14 mm
- 安装孔直径:2.0 mm
尺寸图
单位:mm

功能示意图

接口引脚说明
| 引脚名称 | 功能描述 |
|---|---|
| 3V3 | 电源正极(供电输入3.3V) |
| GND | 电源负极(接地) |
| SCL/SCK | 复用引脚:I2C模式为时钟线(SCL),SPI模式为时钟线(SCK) |
| SDA/SDI | 复用引脚:I2C模式为数据线(SDA),SPI模式为数据输入线(SDI) |
| CSB | 仅 SPI 模式生效,为片选引脚 |
| SDO | 仅 SPI 模式生效,为数据输出线 |
| INT | 中断输出引脚(通用) |
功能焊盘配置说明
功能焊盘用于配置 I2C 及 I3C 通信的地址参数,具体逻辑如下:
| 通信模式 | 地址 | 0x47焊盘 | 0x46焊盘 | I2C_Pull_Up焊盘 |
|---|---|---|---|---|
| I2C | 0x47(出厂默认) | 连接 | 断开 | 不操作 |
| I2C | 0x46 | 断开 | 连接 | 不操作 |
| I3C | 0x47 | 连接 | 断开 | 断开 |
| I3C | 0x46 | 断开 | 连接 | 断开 |
配置注意事项
- 传感器出厂默认 I2C 地址为 0x47,若需切换至 0x46,需将 I2C ADDR 0x47 处的电阻取下并焊接到 0x46 处的焊盘。
- 启用 I3C 模式时,必须先取下 I2C_Pull_Up 处的电阻,地址切换方式与 I2C 相同。
- 矩阵焊盘仅用于 I2C/I3C 的地址配置,SPI4 线与 SPI3 线的切换需通过操作 0x13 寄存器实现(当前库暂不支持 SPI3 线模式)。
Arduino IDE 使用教程
- 硬件准备
- SEN0667 : Fermion: BMP581 气压传感器 ×1
- DFR0654 FireBeetle 2 ESP32-E ×1
- 软件准备
例程1:I2C 模式连续读取气压及温度数据
目标
通过 ESP32-E 的 I2C 接口与 Fermion: BMP581 气压传感器通信,连续读取气压、温度及海拔数据。
步骤 1:接线配置

- 按图示连接 Fermion: BMP581 气压传感器与 ESP32-E,核心对应关系:
- 传感器引脚 “3V3” → ESP32-E 3.3V
- 传感器引脚 “GND” → ESP32-E GND
- 传感器 I2C 引脚 “SCL” → ESP32-E SCL(默认 GPIO22)
- 传感器 I2C 引脚 “SDA” → ESP32-E SDA(默认 GPIO21)
- 传感器功能焊盘配置:I2C 0x47(默认模式,无需改动出厂配置)
步骤 2:代码上传
打开 Arduino IDE,复制以下代码并上传至 ESP32-E:
#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("=================================");
}
输出结果:

例程2:SPI 模式连续读取气压及温度数据
目标
通过 ESP32-E 的 SPI 接口与 Fermion: BMP581 气压传感器通信,连续读取气压、温度及海拔数据。
步骤 1:接线配置

- 按图示连接 Fermion: BMP581 气压传感器与 ESP32-E,核心对应关系:
- 传感器引脚 “3V3” → ESP32-E 3.3V
- 传感器引脚 “GND” → ESP32-E GND
- 传感器 SPI 引脚 “SCK” → ESP32-E SCK(默认 GPIO18)
- 传感器 SPI 引脚 “SDI” → ESP32-E MOSI(默认 GPIO23)
- 传感器 SPI 引脚 “SDO” → ESP32-E MISO(默认 GPIO19)
- 传感器 SPI 引脚 “CSB” → ESP32-E D3(默认 GPIO26)
步骤 2:代码上传
打开 Arduino IDE,复制以下代码并上传至 ESP32-E:
#include "DFRobot_BMP58X.h"
#define BMP5_COMM_SPI
#define CALIBRATE_ABSOLUTE_DIFFERENCE
//SPI通信的片选(CS)引脚定义(可根据实际布线修改)
#define BMP5_CS_PIN D3
DFRobot_BMP58X_SPI bmp58x(&SPI, BMP5_CS_PIN);
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("=================================");
}
输出结果:

例程3:FIFO 数据读取与中断触发
FIFO介绍
FIFO(First In, First Out,先进先出)是传感器内部集成的数据缓冲机制,其核心特性是数据会暂时存到这里,等你需要时再一次性取走,确保数据时序的一致性。
在气压传感器中,FIFO 作为临时数据存储单元,承担着数据暂存与批量处理的功能:传感器按设定频率采集的温度、压力数据会先被有序写入 FIFO,而非实时传输至外部主机;当需要获取数据时,主机可通过单次操作读取 FIFO 中缓存的所有数据,实现批量获取。
与无缓冲机制相比,FIFO 的优势显著:
- 避免了高频实时通信带来的总线资源占用,降低系统交互开销
- 防止因主机处理延迟导致的瞬时数据丢失,保障数据完整性
- 支持按需求批量读取,适配不同场景下的数据分析节奏
简言之,FIFO 是传感器与主机之间的数据协调单元,通过有序缓冲与批量传输,优化了数据交互效率与可靠性。
目标
使用FIFO连续读取气压及温度数据。
步骤 1:接线配置

- 按图示连接 Fermion: BMP581 气压传感器与 ESP32-E,核心对应关系:
- 传感器引脚 “3V3” → ESP32-E 3.3V
- 传感器引脚 “GND” → ESP32-E GND
- 传感器 I2C 引脚 “SCL” → ESP32-E SCL(默认 GPIO22)
- 传感器 I2C 引脚 “SDA” → ESP32-E SDA(默认 GPIO21)
- 传感器引脚 “INT” → ESP32-E D6(GPIO14)
- 传感器功能焊盘配置:I2C 0x47(默认模式,无需改动出厂配置)
步骤 2:代码上传
打开 Arduino IDE,复制以下代码并上传至 ESP32-E:
#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长度:");
Serial.println(data.len);
/* 循环打印FIFO中的所有数据 */
for(int i = 0; i < data.len; ++i){
Serial.print("温度:");
Serial.print(data.fifoTempC[i]);
Serial.print(" (℃) 压力:");
Serial.print(data.fifoPressPa[i]);
Serial.println(" (Pa)");
}
flag = 0; // 清除标志位,等待下一次中断
}
}
输出结果:

API函数
/**
* @fn begin
* @brief 初始化传感器硬件接口
* @return 初始化成功返回true,失败返回false
*/
bool begin(void);
/**
* @fn setODR
* @brief 配置传感器输出数据率(ODR)
* @param odr 输出数据率选择(见: eOdr_t)
* @n 可用速率:
* @n - eOdr240Hz: 输出速率240 Hz
* @n - eOdr218_5Hz: 输出速率218.5 Hz
* @n - eOdr199_1Hz: 输出速率199.1 Hz
* @n - eOdr179_2Hz: 输出速率179.2 Hz
* @n - eOdr160Hz: 输出速率160 Hz
* @n - eOdr149_3Hz: 输出速率149.3 Hz
* @n - eOdr140Hz: 输出速率140 Hz
* @n - eOdr129_8Hz: 输出速率129.8 Hz
* @n - eOdr120Hz: 输出速率120 Hz
* @n - eOdr110_1Hz: 输出速率110.1 Hz
* @n - eOdr100_2Hz: 输出速率100.2 Hz
* @n - eOdr89_6Hz: 输出速率89.6 Hz
* @n - eOdr80Hz: 输出速率80 Hz
* @n - eOdr70Hz: 输出速率70 Hz
* @n - eOdr60Hz: 输出速率60 Hz
* @n - eOdr50Hz: 输出速率50 Hz
* @n - eOdr45Hz: 输出速率45 Hz
* @n - eOdr40Hz: 输出速率40 Hz
* @n - eOdr35Hz: 输出速率35 Hz
* @n - eOdr30Hz: 输出速率30 Hz
* @n - eOdr25Hz: 输出速率25 Hz
* @n - eOdr20Hz: 输出速率20 Hz
* @n - eOdr15Hz: 输出速率15 Hz
* @n - eOdr10Hz: 输出速率10 Hz
* @n - eOdr5Hz: 输出速率5 Hz
* @n - eOdr4Hz: 输出速率4 Hz
* @n - eOdr3Hz: 输出速率3 Hz
* @n - eOdr2Hz: 输出速率2 Hz
* @n - eOdr1Hz: 输出速率1 Hz
* @n - eOdr0_5Hz: 输出速率0.5 Hz
* @n - eOdr0_250Hz: 输出速率0.250 Hz
* @n - eOdr0_125Hz: 输出速率0.125 Hz
* @return 成功返回0,错误返回1
*/
uint8_t setODR(eODR_t odr);
/**
* @fn setOSR
* @brief 设置温度和压力的过采样率
* @param osrTemp 温度过采样(见: eOverSampling_t)
* @param osrPress 压力过采样(见: eOverSampling_t)
* @n 支持的值:
* @n - eOverSampling1: 1倍过采样
* @n - eOverSampling2: 2倍过采样
* @n - eOverSampling4: 4倍过采样
* @n - eOverSampling8: 8倍过采样
* @n - eOverSampling16: 16倍过采样
* @n - eOverSampling32: 32倍过采样
* @n - eOverSampling64: 64倍过采样
* @n - eOverSampling128: 128倍过采样
* @return 成功返回0,错误返回1
*/
uint8_t setOSR(eOverSampling_t osrTemp, eOverSampling_t osrPress);
/**
* @fn setMeasureMode
* @brief 配置传感器电源/测量模式
* @param mode 操作模式(见: eMeasureMode_t)
* @n 可用模式:
* @n - eSleep: 睡眠模式
* @n - eNormal: 正常测量模式
* @n - eSingleShot: 单次测量
* @n - eContinuous: 连续测量
* @n - eDeepSleep: 深度睡眠模式
* @return 成功返回0,错误返回1
*/
uint8_t setMeasureMode(eMeasureMode_t mode);
/**
* @fn reset
* @brief 执行传感器软件复位
* @return 成功返回0,错误返回1
*/
uint8_t reset(void);
/**
* @fn readTempC
* @brief 读取校准后的温度数据
* @return 温度值(摄氏度)
*/
float readTempC(void);
/**
* @fn readPressPa
* @brief 读取校准后的压力数据
* @return 压力值(帕斯卡)
*/
float readPressPa(void);
/**
* @fn readAltitudeM
* @brief 根据压力读数计算海拔高度
* @note 使用公式:
* @n altitude = (1 - (P/101325)^0.190284) * 44307.7
* @n 其中P = 当前压力值(Pa)
* @return 海拔高度(米)
*/
float readAltitudeM(void);
/**
* @fn configIIR
* @brief 配置IIR滤波器系数
* @param iirTemp 温度IIR滤波器(见: eIIRFilter_t)
* @param iirPress 压力IIR滤波器(见: eIIRFilter_t)
* @n 可用系数:
* @n - eFilterBypass: 旁路滤波器
* @n - eFilter1: 1阶滤波器
* @n - eFilter3: 3阶滤波器
* @n - eFilter7: 7阶滤波器
* @n - eFilter15: 15阶滤波器
* @n - eFilter31: 31阶滤波器
* @n - eFilter63: 63阶滤波器
* @n - eFilter127: 127阶滤波器
* @return 成功返回0,错误返回1
*/
uint8_t configIIR(eIIRFilter_t iirTemp, eIIRFilter_t iirPress);
/**
* @fn configFIFO
* @brief 配置FIFO操作参数
* @param dataSel 数据帧类型(见: eFIFODataSel_t)
* @n 可用类型:
* @n - eFIFODisable: FIFO禁用
* @n - eFIFOTempData: 仅温度数据
* @n - eFIFOPressData: 仅压力数据
* @n - eFIFOPressAndTempData: 压力和温度数据
*
* @param downSampling 下采样率(见: eFIFODownSampling_t)
* @n 可用比率:
* @n - eNoDownSampling: 无下采样
* @n - eDownSampling2: 2倍下采样
* @n - eDownSampling4: 4倍下采样
* @n - eDownSampling8: 8倍下采样
* @n - eDownSampling16: 16倍下采样
* @n - eDownSampling32: 32倍下采样
* @n - eDownSampling64: 64倍下采样
* @n - eDownSampling128: 128倍下采样
*
* @param mode FIFO操作模式(见: eFIFOWorkMode_t)
* @n 可用模式:
* @n - eFIFOOverwriteMode: 连续数据流模式
* @n - eFIFOFullStopMode: FIFO满时停止
*
* @param threshold FIFO触发阈值(0=禁用, 1-31=帧数)
* @n - 0x0F: 15帧。这是PT模式下的最大设置。最高有效位被忽略。
* @n - 0x1F: 31帧。这是P或T模式下的最大设置。
* @return 成功返回0,错误返回1
*/
uint8_t configFIFO(eFIFODataSel_t dataSel, eFIFODownSampling_t downSampling, eFIFOWorkMode_t mode, uint8_t threshold);
/**
* @fn getFIFOCount
* @brief 获取FIFO中当前的帧数
* @return 存储的数据帧数(0-31)
*/
uint8_t getFIFOCount(void);
/**
* @fn getFIFOData
* @brief 从FIFO读取所有数据
* @return sFIFOData_t 包含压力和温度数据的结构体
* @n - len: 存储的数据帧数(0-31)
* @n - pressure: 压力值数组
* @n - temperature: 温度值数组
*/
sFIFOData_t getFIFOData(void);
/**
* @fn configInterrupt
* @brief 配置中断行为
* @param intMode 触发模式(见: eIntMode_t)
* @n 可用模式:
* @n - eIntModePulsed: 脉冲模式
* @n - eIntModeLatched: 锁存模式
*
* @param intPol 信号极性(见: eIntPolarity_t)
* @n 可用极性:
* @n - eIntLowActive: 低电平有效
* @n - eIntHighActive: 高电平有效
*
* @param intOd 输出驱动类型(见: eIntOutputMode_t)
* @n 可用类型:
* @n - eIntPushPull: 推挽输出
* @n - eIntOpenDrain: 开漏输出
*
* @return 成功返回0,错误返回1
*/
uint8_t configInterrupt(eIntMode_t mode, eIntPolarity_t pol, eIntOutputMode_t outputMode);
/**
* @fn setIntSource
* @brief 启用特定的中断源
* @param source 触发位掩码(见: eIntSource_t)
* @n 可用源:
* @n - eIntDataReady: 数据就绪中断
* @n - eIntFIFOFull: FIFO满中断
* @n - eIntFIFOThres: FIFO阈值中断
* @n - eIntPressureOor: 压力超出范围中断
* @details 可以使用按位或(|)组合多个中断源。
* 示例: 同时启用数据就绪和FIFO满中断:
* @code
* setIntSource(bmp58x.eIntDataReady | bmp58x.eIntFIFOFull);
* @endcode
* @return 成功返回0,错误返回1
*/
uint8_t setIntSource(uint8_t source);
/**
* @fn getIntStatus
* @brief 读取当前中断状态标志
* @return uint16_t 活动中断的位掩码
* @n 可能的标志:
* @n - eIntStatusDataReady: 数据就绪(0x01)
* @n - eIntStatusFIFOFull: FIFO已满 (0x02)
* @n - eIntStatusFIFOThres: FIFO达到阈值(0x04)
* @n - eIntStatusPressureOor: 压力超出范围(0x08)
* @n - eIntStatusResetComplete: 复位完成(0x10)
*/
uint16_t getIntStatus(void);
/**
* @fn setOORPress
* @brief 配置压力超出范围检测
* @param oor 阈值压力值(0x00000-0x1FFFF)
* @param range 迟滞范围(0-255)
* @n oor - range < 压力 < oor + range
* @param cntLimit 触发持续计数
* @n 可用持续设置:
* @n - eOORCountLimit1: 1次计数
* @n - eOORCountLimit3: 3次计数
* @n - eOORCountLimit7: 7次计数
* @n - eOORCountLimit15: 15次计数
* @return 成功返回0,错误返回1
*/
uint8_t setOORPress(uint32_t oor, uint8_t range, eOORCountLimit_t cntLimit);
/**
* @fn calibratedAbsoluteDifference
* @brief 使用给定的当前海拔高度作为参考值,消除后续压力和海拔数据的绝对差值
* @param altitude 当前海拔高度
* @return 布尔值,表示参考值是否设置成功
* @retval True 表示参考值设置成功
* @retval False 表示设置参考值失败
*/
bool calibratedAbsoluteDifference(float altitude);