AI视觉手势/人脸跟踪传感器

产品简介

这是一款基于博世新一代高性能数字气压传感器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 使用教程

例程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);

更多资料下载