Gravity: BMP585高精度气压温度传感器

产品简介

Fermion: BMI323+BMM350 9轴惯性运动传感器集成了一个BMI323与BMM350。

BMI323是一款低功耗、高性能的 6 轴 IMU 传感器,集成了 3 轴加速度计和 3 轴陀螺仪。它通过 I2C 接口通信,提供全面的运动检测功能,包括计步、任意运动检测、无运动检测、显著运动检测、敲击检测、倾斜检测、方向检测和平面检测。

该传感器非常适合可穿戴设备、智能手表、健身追踪器和物联网应用,这些应用对运动感知和能效要求很高。BMI323 具有基于硬件的运动检测算法,可独立运行,无需 MCU 持续干预即可实现超低功耗。通过可配置的中断引脚(INT1 和 INT2),传感器可以高效地通知主机系统运动事件,非常适合电池供电的应用。

BMM350 是一款低功耗、低噪声的 3 轴数字地磁传感器,完全符合罗盘应用的要求。 基于博世专有的 FlipCore 技术,BMM350 提供了高精度和动态的绝对空间方向和运动矢量。 体积小、重量轻,特别适用于支持无人机精准航向。 BMM350 还可与由 3 轴加速度计和 3 轴陀螺仪组成的惯性测量单元一起使用。

产品参数

基本参数

参数 数值
工作电压 3.3V
工作电流 0.92mA
低功耗电流 0.37mA
通讯接口 I2C
接口类型 SH1.0-5P 接口/2.54mm 排针孔
I2C 地址 BMI323:0x69(默认)/0x68
BMM350:0x15(默认)/0x14
可编程中断引脚 BMI323:2个(INT1、INT2)
BMM350:1个(INT3)

BMI323参数

参数 数值
加速度测量范围 ±2g, ±4g, ±8g, ±16g
加速度 ADC 分辨率 16 位
加速度灵敏度 ±2g 量程:16384 LSB/g
±4g 量程:8192 LSB/g
±8g 量程:4096 LSB/g
±16g 量程:2048 LSB/g
加速度灵敏度误差 ±0.5%
加速度零 g 偏移 ±50 mg
加速度输出数据率 (ODR) 高性能 / 正常模式:12.5 Hz ~ 6400 Hz
低功耗模式:0.78125 Hz ~ 400 Hz
陀螺仪角速度量程 ±125, ±250, ±500, ±1000, ±2000 °/s
陀螺仪 ADC 分辨率 16 位
陀螺仪灵敏度 ±2000 °/s 量程:16.384 LSB/(°/s)
±1000 °/s 量程:32.768 LSB/(°/s)
±500 °/s 量程:65.536 LSB/(°/s)
±250 °/s 量程:131.072 LSB/(°/s)
陀螺仪灵敏度误差 ±3%(无自动校准)/±0.7%(自动校准后)
陀螺仪零速率偏移 ±1 °/s
陀螺仪输出数据率 (ODR) 高性能 / 正常模式:12.5 Hz ~ 6400 Hz
低功耗模式:0.78125 Hz ~ 400 Hz

BMM350参数

参数 数值
工作模式 正常模式(周期性测量)、强制模式(触发式测量)、休眠模式(低功耗待机)
测量范围 ±2000 µT
磁场分辨率 ~0.1 µT
零场偏移漂移(焊接后)零场偏移(校准后) ±2 µT(-40°C ~ +85°C,经 Bosch eCompass 软件校准)
X/Y 轴增益误差 ±1%(25°C,经 API 补偿后)
Z 轴增益误差 ±3%(25°C,经 API 补偿后)
灵敏度温度漂移(TCS) ±0.010 %/K
偏移温度误差(TCOerr) ±200 nT/K
正常模式输出数据率(ODR) 400/200/100/50/25/12.5/6.25/3.125/1.5625 Hz(典型偏差 ±2%)
强制模式最大触发频率 200 Hz(仅 avg=0 时)
X/Y 轴输出噪声(rms) 190 nTrms(ODR=100Hz,平均 2 样本,3dB 带宽 = ODR/2)
Z 轴输出噪声(rms) 450 nTrms(ODR=100Hz,平均 2 样本,3dB 带宽 = ODR/2)

物理尺寸

参数 数值
PCB尺寸 24mm*19mm
安装孔间距 19mm
安装孔直径 2mm

尺寸图

单位:mm

SEN0695-尺寸图

引脚说明

SEN0695-功能图

引脚丝印 功能描述
3V3 电源正极(供电输入3.3V)
GND 电源负极(接地)
SCL I2C模式时钟线(SCL)
SDA I2C模式数据线(SDA)
INT1 BMI323 中断输出引脚1
INT2 BMI323 中断输出引脚2
INT3 BMM350 中断输出引脚

注意:本传感器供电与通信电平均为 3.3V,推荐搭配 3.3V 供电、3.3V 电平的主控使用。直接接入5V主控易导致传感器损坏。

焊盘配置说明(I2C地址选择)

传感器板载 2 个独立焊盘,分别对应 BMI323和 BMM350 的 I2C 地址切换,通过焊盘的 “断开 / 连接” 状态即可灵活配置目标地址,无需额外硬件修改。

SEN0695-焊盘位置图

BMI323 传感器 I2C 地址配置

焊盘状态直接决定 BMI323 的 I2C 通信地址,配置规则如下:

  • 焊盘断开:I2C 地址为 0x69
  • 焊盘连接:I2C 地址为 0x68

BMM350 传感器 I2C 地址配置

BMM350 的 I2C 地址通过对应焊盘状态切换,配置规则如下:

  • 焊盘断开:I2C 地址为 0x15
  • 焊盘连接:I2C 地址为 0x14

Arduino IDE 使用教程

说明:本传感器支持任意运动、无运动、显著运动等多种运动状态检测,以及敲击、倾斜、方向、平面检测等手势识别功能。Wiki 仅展示核心基础用法,更多运动状态检测与高级功能实现,请直接参考BMI323BMM350库中完整的 examples 示例程序及API,此处不再逐一展开。

通过I2C读取数据的Arduino示例代码

目标

本教程旨在演示如何初始化BMI323、BMM350传感器,并通过轮询方式直接读取加速度、角速度和地磁数据。

硬件准备

软件准备

接线配置

SEN0695-I2C接线图

  • 按图示连接9轴IMU传感器与 ESP32-C5,核心对应关系:
    • 传感器引脚 “3V3” → ESP32-C5 3.3V
    • 传感器引脚 “GND” → ESP32-C5 GND
    • 传感器 I2C 引脚 “SCL” → ESP32-C5 SCL(默认 GPIO10)
    • 传感器 I2C 引脚 “SDA” → ESP32-C5 SDA(默认 GPIO9)
    • I2C地址焊盘配置:将BMI323和BMM350的I2C地址焊盘断开,此时 BMI323的 I2C 地址为 0x69,BMM350的 I2C 地址为 0x15(出厂默认模式)

样例代码

#include "DFRobot_BMI323.h"
#include "DFRobot_BMM350.h"

#define BMI323_I2C_ADDR 0x69    
#define BMM350_I2C_ADDR 0x15

DFRobot_BMI323 bmi323(&Wire, BMI323_I2C_ADDR);
DFRobot_BMM350_I2C bmm350(&Wire, BMM350_I2C_ADDR);

void setup() 
{
  Serial.begin(115200);
  while(!Serial) { 
    delay(10); 
    }

  Serial.println("BMI323 and BMM350 Combined Sensor Demo");
  Serial.println("========================================");

  // 初始化BMI323(六轴)
  while (!bmi323.begin()) {
    Serial.println("BMI323 init failed, retry in 1s");
    delay(1000);
  }
  Serial.println("BMI323 init success!");

  // 配置加速度计:50Hz采样,±8g,普通模式
  if (!bmi323.configAccel(bmi323.eAccelODR50Hz, bmi323.eAccelRange8G, bmi323.eAccelModeNormal)) {
    Serial.println("Accel config failed!");
    while(1) delay(1000);
  }

  // 配置陀螺仪:800Hz采样,±2000dps,普通模式
  if (!bmi323.configGyro(bmi323.eGyroODR800Hz, bmi323.eGyroRange2000DPS, bmi323.eGyroModeNormal)) {
    Serial.println("Gyro config failed!");
    while(1) delay(1000);
  }

  // 初始化BMM350(磁力计)
  while (bmm350.begin()) {   // begin()返回0表示成功,非0表示失败
    Serial.println("BMM350 init failed, retry in 1s");
    delay(1000);
  }
  Serial.println("BMM350 init success!");

  // 设置操作模式为普通模式
  bmm350.setOperationMode(eBmm350NormalMode);

  // 设置预设模式为高精度,数据率25Hz
  bmm350.setPresetMode(BMM350_PRESETMODE_HIGHACCURACY, BMM350_DATA_RATE_25HZ);

  // 使能X、Y、Z轴测量(默认已使能,但显式调用确保)
  bmm350.setMeasurementXYZ();

  Serial.println("Setup complete!\n");
}

void loop()
{
  // 读取BMI323数据
  DFRobot_BMI323::sSensorData accel, gyro;
  if (bmi323.getAccelGyroData(&accel, &gyro)) {
    Serial.print("Accel (g)  : ");
    Serial.print(accel.x, 3);
    Serial.print(", ");
    Serial.print(accel.y, 3);
    Serial.print(", ");
    Serial.println(accel.z, 3);

    Serial.print("Gyro (dps) : ");
    Serial.print(gyro.x, 2);
    Serial.print(", ");
    Serial.print(gyro.y, 2);
    Serial.print(", ");
    Serial.println(gyro.z, 2);
  } else {
    Serial.println("Failed to read BMI323 data.");
  }

  // 读取BMM350数据
  sBmm350MagData_t magData = bmm350.getGeomagneticData();
  Serial.print("Mag (uT)   : ");
  Serial.print(magData.float_x, 2);
  Serial.print(", ");
  Serial.print(magData.float_y, 2);
  Serial.print(", ");
  Serial.println(magData.float_z, 2);


  Serial.println("--------------------------------");
  delay(200);   // 约5Hz刷新率
}

结果

SEN0695-I2C结果图

通过I2C获取运动状态与航向角的Arduino示例代码

目标

本教程旨在指导用户使用BMI323和BMM350传感器在ESP32上实现运动状态检测与航向角(电子罗盘)监测功能。

硬件准备

软件准备

接线配置

SEN0692-I2C运动航向接线图

  • 按图示连接9轴IMU传感器与 ESP32-C5,核心对应关系:
    • 传感器引脚 “3V3” → ESP32-C5 3.3V
    • 传感器引脚 “GND” → ESP32-C5 GND
    • 传感器引脚 “INT1” → ESP32-C5 GPIO27
    • 传感器引脚 “INT2” → ESP32-C5 GPIO26
    • 传感器 I2C 引脚 “SCL” → ESP32-C5 SCL(默认 GPIO10)
    • 传感器 I2C 引脚 “SDA” → ESP32-C5 SDA(默认 GPIO9)
    • I2C地址焊盘配置:将BMI323和BMM350的I2C地址焊盘断开,此时 BMI323的 I2C 地址为 0x69,BMM350的 I2C 地址为 0x15(出厂默认模式)

样例代码

#include "DFRobot_BMI323.h"
#include "DFRobot_BMM350.h"

// I2C 地址定义
#define BMI323_I2C_ADDR  0x69    
#define BMM350_I2C_ADDR  0x15    

// 中断引脚定义(根据实际连接修改)
#define INT1_PIN         27       // BMI323 INT1 → GPIO27 (任意运动)
#define INT2_PIN         26       // BMI323 INT2 → GPIO26 (无运动)

// 创建传感器对象
DFRobot_BMI323 bmi323(&Wire, BMI323_I2C_ADDR);
DFRobot_BMM350_I2C bmm350(&Wire, BMM350_I2C_ADDR);

// 中断标志
volatile bool gAnyMotionFlag = false;
volatile bool gNoMotionFlag  = false;

// 运动状态枚举
enum MotionState {
  STATE_UNKNOWN,
  STATE_MOVING,
  STATE_STILL
};
MotionState currentState = STATE_UNKNOWN;

// 方向名称数组
const char* directionNames[] = {
  "North", "Northeast", "East", "Southeast",
  "South", "Southwest", "West", "Northwest"
};

// 中断服务函数
void IRAM_ATTR interruptAnyMotion() {
  gAnyMotionFlag = true;
}

void IRAM_ATTR interruptNoMotion() {
  gNoMotionFlag = true;
}

/**
 * @brief 将航向角转换为方向名称
 * @param heading 航向角 (0~360°)
 * @return 方向名称字符串
 */
const char* getDirectionName(float heading) {
  int index = (int)((heading + 22.5f) / 45.0f) % 8;
  return directionNames[index];
}

void setup() {
  Serial.begin(115200);
  while (!Serial) delay(10);

  Serial.println("\n=== BMI323 Motion Detector + BMM350 Compass ===");

  // ---------- 初始化 BMI323 ----------
  Serial.print("Initializing BMI323... ");
  while (!bmi323.begin()) {
    Serial.println("Failed, retry in 1s");
    delay(1000);
  }
  Serial.println("OK");

  // 配置加速度计
  if (!bmi323.configAccel(bmi323.eAccelODR50Hz, bmi323.eAccelRange8G, bmi323.eAccelModeNormal)) {
    Serial.println("Error: BMI323 accelerometer config failed!");
    while (1) delay(1000);
  }

  // 配置任意运动检测(INT1)
  struct bmi3_any_motion_config anyMotionCfg;
  anyMotionCfg.duration    = 9;    // 9 * 20ms = 180ms
  anyMotionCfg.slope_thres = 9;    // 9 * 1.953mg ≈ 17.6mg
  anyMotionCfg.acc_ref_up  = 1;    // 始终更新参考
  anyMotionCfg.hysteresis  = 5;    // 5 * 1.953mg ≈ 9.8mg
  anyMotionCfg.wait_time   = 4;    // 4 * 20ms = 80ms

  if (!bmi323.enableAnyMotionInt(anyMotionCfg, bmi323.eINT1, bmi323.eAxisXYZ)) {
    Serial.println("Error: Failed to enable any-motion interrupt!");
    while (1) delay(1000);
  }

  // 配置无运动检测(INT2)
  struct bmi3_no_motion_config noMotionCfg;
  noMotionCfg.duration    = 9;    // 9 * 20ms = 180ms
  noMotionCfg.slope_thres = 9;    // 9 * 1.953mg ≈ 17.6mg
  noMotionCfg.acc_ref_up  = 1;    // 始终更新参考
  noMotionCfg.hysteresis  = 5;    // 5 * 1.953mg ≈ 9.8mg
  noMotionCfg.wait_time   = 5;    // 5 * 20ms = 100ms

  if (!bmi323.enableNoMotionInt(noMotionCfg, bmi323.eINT2, bmi323.eAxisXYZ)) {
    Serial.println("Error: Failed to enable no-motion interrupt!");
    while (1) delay(1000);
  }

  // 配置 ESP32 外部中断
  attachInterrupt(digitalPinToInterrupt(INT1_PIN), interruptAnyMotion, RISING);
  attachInterrupt(digitalPinToInterrupt(INT2_PIN), interruptNoMotion, RISING);

  // ---------- 初始化 BMM350 ----------
  Serial.print("Initializing BMM350... ");
  while (bmm350.begin()) {   // begin() 返回 0 成功,非 0 失败
    Serial.println("Failed, retry in 1s");
    delay(1000);
  }
  Serial.println("OK");

  // 设置操作模式为普通模式
  bmm350.setOperationMode(eBmm350NormalMode);

  // 设置预设模式为高精度,数据率 25Hz
  bmm350.setPresetMode(BMM350_PRESETMODE_HIGHACCURACY, BMM350_DATA_RATE_25HZ);

  // 使能 X、Y、Z 轴测量
  bmm350.setMeasurementXYZ();

  Serial.println("Setup complete! Monitoring motion and compass.\n");
}

void loop() {
  static unsigned long lastPrint = 0;
  unsigned long now = millis();

  // 处理运动中断
  if (gAnyMotionFlag) {
    gAnyMotionFlag = false;
    uint16_t status = bmi323.getIntStatus();
    if (status & BMI3_INT_STATUS_ANY_MOTION) {
      if (currentState != STATE_MOVING) {
        currentState = STATE_MOVING;
        float heading = bmm350.getCompassDegree();
        const char* dirName = getDirectionName(heading);
        Serial.print("[");
        Serial.print(now);
        Serial.print("] State: MOVING | Direction: ");
        Serial.print(dirName);
        Serial.print(" (");
        Serial.print(heading, 1);
        Serial.println("°)");
      }
    }
  }

  if (gNoMotionFlag) {
    gNoMotionFlag = false;
    uint16_t status = bmi323.getIntStatus();
    if (status & BMI3_INT_STATUS_NO_MOTION) {
      if (currentState != STATE_STILL) {
        currentState = STATE_STILL;
        float heading = bmm350.getCompassDegree();
        const char* dirName = getDirectionName(heading);
        Serial.print("[");
        Serial.print(now);
        Serial.print("] State: STILL | Direction: ");
        Serial.print(dirName);
        Serial.print(" (");
        Serial.print(heading, 1);
        Serial.println("°)");
      }
    }
  }

  // 每秒输出一次当前状态和方向
  if (now - lastPrint >= 1000) {
    lastPrint = now;
    float heading = bmm350.getCompassDegree();
    const char* dirName = getDirectionName(heading);
    const char* stateStr = (currentState == STATE_MOVING) ? "MOVING" : 
                           (currentState == STATE_STILL) ? "STILL" : "UNKNOWN";
    Serial.print("[");
    Serial.print(now);
    Serial.print("] State: ");
    Serial.print(stateStr);
    Serial.print(" | Direction: ");
    Serial.print(dirName);
    Serial.print(" (");
    Serial.print(heading, 1);
    Serial.println("°)");
  }

  delay(10);
}

结果

SEN0692-I2C运动航向结果图

API函数

BMI323 API函数

/**
   * @fn DFRobot_BMI323
   * @brief 构造函数
   * @details 构造函数 - I2C 接口
   * @param wire TwoWire 对象指针,默认为 &Wire
   * @param i2cAddr I2C 地址,默认为 0x69
   * @return 无
   */
  DFRobot_BMI323(TwoWire *wire = &Wire, uint8_t i2cAddr = 0x69);

  /**
   * @fn begin
   * @brief 初始化函数
   * @details 初始化 I2C 接口、芯片寄存器和功能上下文
   * @param 无
   * @return bool 类型,表示初始化状态
   * @retval true 初始化成功
   * @retval false 初始化失败
   */
  bool begin(void);

  /**
   * @fn configAccel
   * @brief 配置加速度计
   * @param odr 输出数据速率选择(参见:eAccelODR_t)
   * @n 可用速率:
   * @n - eAccelODR0_78125Hz:  0.78125 Hz
   * @n - eAccelODR1_5625Hz:   1.5625 Hz
   * @n - eAccelODR3_125Hz:    3.125 Hz
   * @n - eAccelODR6_25Hz:     6.25 Hz
   * @n - eAccelODR12_5Hz:     12.5 Hz
   * @n - eAccelODR25Hz:       25 Hz
   * @n - eAccelODR50Hz:       50 Hz
   * @n - eAccelODR100Hz:      100 Hz
   * @n - eAccelODR200Hz:      200 Hz
   * @n - eAccelODR400Hz:      400 Hz
   * @n - eAccelODR800Hz:      800 Hz
   * @n - eAccelODR1600Hz:     1600 Hz
   * @n - eAccelODR3200Hz:     3200 Hz
   * @n - eAccelODR6400Hz:     6400 Hz
   * @n @note ODR 范围限制(基于工作模式):
   * @n - 低功耗模式:0.78Hz ~ 400Hz
   * @n - 普通模式:12.5Hz ~ 6400Hz
   * @n - 高性能模式:12.5Hz ~ 6400Hz
   * @param range 量程选择(参见:eAccelRange_t)
   * @n 可用量程:
   * @n - eAccelRange2G:   ±2g
   * @n - eAccelRange4G:   ±4g
   * @n - eAccelRange8G:   ±8g
   * @n - eAccelRange16G:  ±16g
   * @param mode 工作模式选择(参见:eAccelMode_t),默认为 eAccelModeNormal
   * @n 可用模式:
   * @n - eAccelModeLowPower:  低功耗模式
   * @n - eAccelModeNormal:    普通模式(默认)
   * @n - eAccelModeHighPerf:  高性能模式
   * @return bool 类型,表示配置状态
   * @retval true 配置成功
   * @retval false 配置失败
   */
  bool configAccel(eAccelODR_t odr, eAccelRange_t range, eAccelMode_t mode = eAccelModeNormal);

  /**
   * @fn configGyro
   * @brief 配置陀螺仪
   * @param odr 输出数据速率选择(参见:eGyroODR_t)
   * @n 可用速率:
   * @n - eGyroODR0_78125Hz: 0.78125 Hz
   * @n - eGyroODR1_5625Hz:  1.5625 Hz
   * @n - eGyroODR3_125Hz:   3.125 Hz
   * @n - eGyroODR6_25Hz:    6.25 Hz
   * @n - eGyroODR12_5Hz:    12.5 Hz
   * @n - eGyroODR25Hz:      25 Hz
   * @n - eGyroODR50Hz:      50 Hz
   * @n - eGyroODR100Hz:     100 Hz
   * @n - eGyroODR200Hz:     200 Hz
   * @n - eGyroODR400Hz:     400 Hz
   * @n - eGyroODR800Hz:     800 Hz
   * @n - eGyroODR1600Hz:    1600 Hz
   * @n - eGyroODR3200Hz:    3200 Hz
   * @n - eGyroODR6400Hz:    6400 Hz
   * @n @note ODR 范围限制(基于工作模式):
   * @n - 低功耗模式:0.78Hz ~ 400Hz
   * @n - 普通模式:12.5Hz ~ 6400Hz
   * @n - 高性能模式:12.5Hz ~ 6400Hz
   * @param range 量程选择(参见:eGyroRange_t)
   * @n 可用量程:
   * @n - eGyroRange125DPS:   ±125dps
   * @n - eGyroRange250DPS:   ±250dps
   * @n - eGyroRange500DPS:   ±500dps
   * @n - eGyroRange1000DPS:  ±1000dps
   * @n - eGyroRange2000DPS:  ±2000dps
   * @param mode 工作模式选择(参见:eGyroMode_t),默认为 eGyroModeNormal
   * @n 可用模式:
   * @n - eGyroModeLowPower:  低功耗模式
   * @n - eGyroModeNormal:    普通模式(默认)
   * @n - eGyroModeHighPerf:  高性能模式
   * @return bool 类型,表示配置状态
   * @retval true 配置成功
   * @retval false 配置失败
   */
  bool configGyro(eGyroODR_t odr, eGyroRange_t range, eGyroMode_t mode = eGyroModeNormal);

  /**
   * @fn getAccelGyroData
   * @brief 同时读取加速度计和陀螺仪数据并返回物理单位
   * @details 一次性读取加速度计和陀螺仪原始数据,转换为 g/dps 并返回
   * @param accel 加速度计输出
   * @param gyro 陀螺仪输出
   * @return bool 类型,表示读取状态
   * @retval true 读取成功
   * @retval false 读取失败
   */
  bool getAccelGyroData(sSensorData *accel, sSensorData *gyro);

  /**
   * @fn getTemperature
   * @brief 读取芯片温度(摄氏度)
   * @details 从传感器读取温度原始值,并按官方公式换算:温度(°C) = (int16_t)raw / 512.0 + 23.0。
   * 需先配置加速度计或陀螺仪。
   * @return float 温度值(单位:°C);若传感器未初始化或读取失败则返回 0.0f
   */
  float getTemperature(void);

  /**
   * @fn enableStepCounterInt
   * @brief 使能计步器中断功能
   * @details 配置计步器功能并映射到指定的中断引脚,当步数变化时将触发中断
   * @param pin 绑定的中断引脚(eINT1 或 eINT2)
   * @return bool 类型,表示配置状态
   * @retval true 配置成功
   * @retval false 配置失败
   */
  bool enableStepCounterInt(eInt_t pin);

  /**
   * @fn readStepCounter
   * @brief 读取计步器数据
   * @param stepVal 步数输出指针,读取的步数将写入该指针指向的内存
   * @return int8_t BMI3_OK 表示成功,其他值表示失败
   */
  int8_t readStepCounter(uint16_t *stepVal);

  /**
   * @fn getIntStatus
   * @brief 获取中断状态
   * @details 读取并合并 INT1 和 INT2 引脚的中断状态,返回值为 INT1 和 INT2 状态寄存器的 OR 组合。
   * @return uint16_t 合并的中断状态寄存器值(INT1 | INT2)。每一位代表不同的中断类型:
   * @n - BMI3_INT_STATUS_ANY_MOTION: 检测到任意运动
   * @n - BMI3_INT_STATUS_NO_MOTION: 检测到无运动
   * @n - BMI3_INT_STATUS_FLAT: 平面检测
   * @n - BMI3_INT_STATUS_ORIENTATION: 方向变化
   * @n - BMI3_INT_STATUS_STEP_DETECTOR: 检测到步数
   * @n - BMI3_INT_STATUS_SIG_MOTION: 检测到显著运动
   * @n - BMI3_INT_STATUS_TILT: 检测到倾斜
   * @n - BMI3_INT_STATUS_TAP: 检测到敲击
   */
  uint16_t getIntStatus(void);

  /**
   * @fn enableAnyMotionInt
   * @brief 配置任意运动阈值中断(使用官方结构体参数)
   * @param config 任意运动配置结构体(参见 bmi3_any_motion_config)
   * @n 参数说明:
   * @n - slope_thres: 加速度斜率阈值,范围
   * 0-4095,单位 1.953mg/LSB(官方示例:9 ≈ 17.6mg)
   * @n - hysteresis: 滞回值,范围 0-1023,单位 1.953mg/LSB(官方示例:5 ≈ 9.8mg)
   * @n - duration: 持续时间,范围 0-8191,单位 20ms(官方示例:9 = 180ms)
   * @n - acc_ref_up: 加速度参考更新模式,0=事件触发时,1=始终更新(官方示例:1)
   * @n - wait_time: 等待时间,范围 0-7,单位 20ms(官方示例:4-5 = 80-100ms)
   * @param pin 绑定的中断引脚
   * @param axisMask 轴选择掩码(默认:eAxisXYZ)
   * @return bool 类型,表示配置状态
   * @retval true 配置成功
   * @retval false 配置失败
   */
  bool enableAnyMotionInt(const struct bmi3_any_motion_config &config,
                          eInt_t pin, uint8_t axisMask = eAxisXYZ);

  /**
   * @fn enableNoMotionInt
   * @brief 配置无运动阈值中断(使用官方结构体参数)
   * @param config 无运动检测配置结构体(参见 bmi3_no_motion_config)
   * @n 参数说明:
   * @n - slope_thres: 加速度斜率阈值,范围
   * 0-4095,单位 1.953mg/LSB(官方示例:9 ≈ 17.6mg)
   * @n - hysteresis: 滞回值,范围 0-1023,单位 1.953mg/LSB(官方示例:5 ≈ 9.8mg)
   * @n - duration: 持续时间,范围 0-8191,单位 20ms(官方示例:9 = 180ms)
   * @n - acc_ref_up: 加速度参考更新模式,0=事件触发时,1=始终更新(官方示例:1)
   * @n - wait_time: 等待时间,范围 0-7,单位 20ms(官方示例:5 = 100ms)
   * @param pin 绑定的中断引脚
   * @param axisMask 轴选择掩码(默认:eAxisXYZ)
   * @return bool 类型,表示配置状态
   * @retval true 配置成功
   * @retval false 配置失败
   */
  bool enableNoMotionInt(const struct bmi3_no_motion_config &config, eInt_t pin,
                         uint8_t axisMask = eAxisXYZ);

  /**
   * @fn enableSigMotionInt
   * @brief 配置显著运动检测中断(使用官方结构体参数)
   * @param config 显著运动配置结构体(参见 bmi3_sig_motion_config)
   * @n 参数说明:
   * @n - block_size: 检测段大小,范围 0-65535(官方示例:200)
   * @n - peak_2_peak_min: 峰峰值加速度最小值,范围 0-1023(官方示例:30)
   * @n - peak_2_peak_max: 峰峰值加速度最大值,范围 0-1023(官方示例:30)
   * @n - mcr_min: 每秒平均交叉率最小值,范围 0-62(官方示例:0x10 = 16)
   * @n - mcr_max: 每秒平均交叉率最大值,范围 0-62(官方示例:0x10 = 16)
   * @param pin 绑定的中断引脚
   * @return bool 类型,表示配置状态
   * @retval true 配置成功
   * @retval false 配置失败
   */
  bool enableSigMotionInt(const struct bmi3_sig_motion_config &config,
                          eInt_t pin);

  /**
   * @fn enableFlatInt
   * @brief 配置平面检测中断(使用官方结构体参数)
   * @param config 平面检测配置结构体(参见 bmi3_flat_config)
   * @n 参数说明:
   * @n - theta: 最大允许倾斜角,范围 0-63,角度计算公式为 64 *
   * (tan(angle)^2)(官方示例:9)
   * @n - blocking: 阻塞模式,0=MODE_0(禁用),1=MODE_1(>1.5g),
   * 2=MODE_2(>1.5g 或斜率>半阈值),3=MODE_3(>1.5g 或斜率>阈值)(官方示例:3)
   * @n - hold_time: 设备保持平面状态的最小持续时间,范围 0-255,单位 20ms(官方示例:50 = 1000ms)
   * @n - hysteresis: 平面检测的滞回角度,范围 0-255(官方示例:9)
   * @n - slope_thres: 连续加速度样本之间的最小斜率,范围 0-255(官方示例:0xCD = 205)
   * @param pin 绑定的中断引脚
   * @return bool 类型,表示配置状态
   * @retval true 配置成功
   * @retval false 配置失败
   */
  bool enableFlatInt(const struct bmi3_flat_config &config, eInt_t pin);

  /**
   * @fn enableOrientationInt
   * @brief 配置方向检测中断(使用官方结构体参数)
   * @param config 方向检测配置结构体(参见 bmi3_orientation_config)
   * @n 参数说明:
   * @n - ud_en: 是否检测翻转(正反面),0=禁用,1=使能(官方示例:1)
   * @n - hold_time: 方向变化检测所需的持续时间,范围 0-255,单位 20ms(官方示例:4 = 80ms)
   * @n - hysteresis: 方向检测的滞回值,范围 0-255(官方示例:5)
   * @n - theta: 最大允许倾斜角,范围 0-63,角度=64*(tan(angle)^2)(官方示例:16)
   * @n - mode: 方向检测模式,0/3=对称,1=高不对称,2=低不对称(官方示例:1)
   * @n - slope_thres: 防止剧烈运动导致误检测的斜率阈值,范围 0-255(官方示例:30)
   * @n - blocking: 阻塞模式,0-3(官方示例:3)
   * @param pin 绑定的中断引脚
   * @return bool 类型,表示配置状态
   * @retval true 配置成功
   * @retval false 配置失败
   */
  bool enableOrientationInt(const struct bmi3_orientation_config &config,
                            eInt_t pin);

  /**
   * @fn readOrientation
   * @brief 读取方向检测输出
   * @param portraitLandscape 横竖屏状态输出指针,可为 NULL
   * @param faceUpDown 正反面状态输出指针,可为 NULL
   * @return bool 类型,表示读取状态
   * @retval true 读取成功
   * @retval false 读取失败或功能未使能
   */
  bool readOrientation(uint8_t *portraitLandscape, uint8_t *faceUpDown);

  /**
   * @fn enableTapInt
   * @brief 配置敲击检测中断(使用官方结构体参数)
   * @param config 敲击检测配置结构体(参见 bmi3_tap_detector_config)
   * @n 关键参数(参考 tap.c):
   * @n - axis_sel: 选择敲击检测的轴(0=X,1=Y,2=Z)
   * @n - mode: 检测模式(0=敏感,1=普通,2=稳健)
   * @n - tap_peak_thres / tap_shock_settling_dur 等用于确定敲击的时序/幅度阈值
   * @param pin 绑定的中断引脚
   * @param enableSingle 是否使能单击检测(默认 true)
   * @param enableDouble 是否使能双击检测(默认 true)
   * @param enableTriple 是否使能三击检测(默认 true)
   * @return bool 类型,表示配置状态
   * @retval true 配置成功
   * @retval false 配置失败
   */
  bool enableTapInt(const struct bmi3_tap_detector_config &config, eInt_t pin,
                    bool enableSingle = true, bool enableDouble = true,
                    bool enableTriple = true);

  /**
   * @fn readTapStatus
   * @brief 读取敲击检测状态(单击/双击/三击)
   * @param tapMask 输出掩码(可组合 BMI3_TAP_DET_STATUS_SINGLE/DOUBLE/TRIPLE)
   * @return bool 类型,表示读取状态
   * @retval true 读取成功
   * @retval false 读取失败
   */
  bool readTapStatus(uint8_t *tapMask);

  /**
   * @fn enableTiltInt
   * @brief 配置倾斜检测中断(使用官方结构体参数)
   * @param config 倾斜检测配置结构体(参见 bmi3_tilt_config)
   * @n 关键参数(参考 tilt.c):
   * @n - segment_size: 用于平均参考向量的时间窗口,范围 0-255
   * @n - min_tilt_angle: 需要超过的最小倾斜角,范围 0-255,角度=256*cos(angle)
   * @n - beta_acc_mean: 低通平均系数,范围 0-65535
   * @param pin 绑定的中断引脚
   * @return bool 类型,表示配置状态
   * @retval true 配置成功
   * @retval false 配置失败
   */
  bool enableTiltInt(const struct bmi3_tilt_config &config, eInt_t pin);

BMM350 API函数

 /**
   * @fn softReset
   * @brief 软件复位,软件复位后先恢复为挂起模式
   */
  void softReset(void);

  /**
   * @fn setOperationMode
   * @brief 设置传感器的执行模式
   * @param opMode mode
   * @n eBmm350SuspendMode       挂起模式:挂起模式是芯片上电后BMM350的默认电源模式,在挂起模式下电流消耗最小,因此该模式适用于不需要数据转换的时期(所有寄存器的读写都是可能的)
   * @n eBmm350NormalMode        常规模式: 获取地磁数据      
   * @n eBmm350ForcedMode        强制模式: 单次测量,测量完成后传感器恢复到暂停模式
   * @n eBmm350ForcedModeFast   只有使用FM_FAST时,ODR才能达到200Hz
   */
  void setOperationMode(uint8_t opMode);

  /**
   * @fn getOperationMode
   * @brief 获取传感器的执行模式
   * @return result 返回字符串为传感器的执行模式
   */
  String getOperationMode(void);

  /**
   * @fn setPresetMode
   * @brief 设置预置模式,使用户更简单的配置传感器来获取地磁数据(默认的采集速率为12.5Hz)
   * @param presetMode
   * @n BMM350_PRESETMODE_LOWPOWER       低功率模式,获取少量的数据 取均值
   * @n BMM350_PRESETMODE_REGULAR        普通模式,获取中量数据 取均值
   * @n BMM350_PRESETMODE_ENHANCED       增强模式,获取大量数据 取均值
   * @n BMM350_PRESETMODE_HIGHACCURACY   高精度模式,获取超大量数据 取均值
   */
  void setPresetMode(uint8_t presetMode, uint8_t rate = BMM350_DATA_RATE_12_5HZ);

  /**
   * @fn setRate
   * @brief 设置获取地磁数据的速率,速率越大获取越快(不加延时函数)
   * @param rate
   * @n BMM350_DATA_RATE_1_5625HZ
   * @n BMM350_DATA_RATE_3_125HZ
   * @n BMM350_DATA_RATE_6_25HZ
   * @n BMM350_DATA_RATE_12_5HZ  (默认速率)
   * @n BMM350_DATA_RATE_25HZ
   * @n BMM350_DATA_RATE_50HZ
   * @n BMM350_DATA_RATE_100HZ
   * @n BMM350_DATA_RATE_200HZ
   * @n BMM350_DATA_RATE_400HZ
   */
  void setRate(uint8_t rate);

  /**
   * @fn getRate
   * @brief 获取配置的数据速率 单位:HZ
   * @return rate
   */
  uint8_t getRate(void);

  /**
   * @fn selfTest
   * @brief 传感器自测,返回值表明自检结果
   * @param testMode:
   * @n     eBmm350SelfTestNormal               常规自检,检查x轴、y轴、z轴是否接通或短路
   * @return result 返回的字符串为自测的结果
   */
  String selfTest(eBmm350SelfTest_t testMode = eBmm350SelfTestNormal);

  /**
   * @fn setMeasurementXYZ
   * @brief 使能x y z 轴的测量,默认设置为使能,禁止后xyz轴的地磁数据不准确
   * @param en_x
   * @n   BMM350_X_EN        使能 x 轴的测量
   * @n   BMM350_X_DIS       禁止 x 轴的测量
   * @param en_y
   * @n   BMM350_Y_EN        使能 y 轴的测量
   * @n   BMM350_Y_DIS       禁止 y 轴的测量
   * @param en_z
   * @n   BMM350_Z_EN        使能 z 轴的测量
   * @n   BMM350_Z_DIS       禁止 z 轴的测量
   */
  void setMeasurementXYZ(enum eBmm350XAxisEnDis_t enX = BMM350_X_EN, enum eBmm350YAxisEnDis_t enY = BMM350_Y_EN, enum eBmm350ZAxisEnDis_t enZ = BMM350_Z_EN);

  /**
   * @fn getMeasurementStateXYZ
   * @brief 获取 x y z 轴的使能状态
   * @return result 返回字符串为使能的状态
   */
  String getMeasurementStateXYZ(void);

  /**
   * @fn getGeomagneticData
   * @brief 获取x y z 三轴的地磁数据
   * @return 地磁的数据的结构体,单位:微特斯拉(uT)
   */
  sBmm350MagData_t getGeomagneticData(void);

  /**
   * @fn getCompassDegree
   * @brief 获取罗盘方向
   * @return 罗盘方向 (0° - 360°)
   * @n      0° = North, 90° = East, 180° = South, 270° = West.
   */
  float getCompassDegree(void);

  /**
   * @fn setDataReadyPin
   * @brief 使能或者禁止数据准备中断引脚
   * @n 使能后有数据来临DRDY引脚跳变
   * @n 禁止后有数据来临DRDY不进行跳变
   * @n 高极性:高电平为活动电平,默认为低电平,触发中断时电平变为高
   * @n 低极性:低电平为活动电平,默认为高电平,触发中断时电平变为低
   * @param modes
   * @n     BMM350_ENABLE_INTERRUPT        使能DRDY
   * @n     BMM350_DISABLE_INTERRUPT       禁止DRDY
   * @param polarity
   * @n     BMM350_ACTIVE_HIGH      高极性
   * @n     BMM350_ACTIVE_LOW       低极性
   */
  void setDataReadyPin(uint8_t modes, uint8_t polarity=POLARITY_HIGH);

  /**
   * @fn getDataReadyState
   * @brief 获取数据准备的状态,用来判断数据是否准备好
   * @return status
   * @n true  数据准备好了
   * @n false 数据没有准备好
   */
  bool getDataReadyState(void);

  /**
   * @fn setThresholdInterrupt(uint8_t modes, int8_t threshold, uint8_t polarity)
   * @brief 设置阈值中断,当某个通道的地磁值高/低于阈值时触发中断
   * @n     高极性:高电平为活动电平,默认为低电平,触发中断时电平变为高
   * @n     低极性:低电平为活动电平,默认为高电平,触发中断时电平变为低
   * @param modes
   * @n     LOW_THRESHOLD_INTERRUPT       低阈值中断模式
   * @n     HIGH_THRESHOLD_INTERRUPT      高阈值中断模式
   * @param  threshold
   * @n     阈值,默认扩大16倍,例如:低阈值模式下传入阈值1,实际低于16的地磁数据都会触发中断
   * @param polarity
   * @n     POLARITY_HIGH      高极性
   * @n     POLARITY_LOW       低极性
   */
  void setThresholdInterrupt(uint8_t modes, int8_t threshold, enum eBmm350IntrPolarity_t polarity);

  /**
   * @fn getThresholdData
   * @brief 获取发生阈值中断的数据
   * @return 返回存放地磁数据的结构体,结构体存放三轴当数据和中断状态,
   * @n xyz轴的数据为 NO_DATA 时,未触发中断
   * @n mag_x、mag_y、mag_z 存放地磁数据
   * @n interrupt_x、interrupt_y、interrupt_z 存放轴中断状态
   */
  sBmm350ThresholdData_t getThresholdData(void);

更多资料下载