Arduino UNO R3 · I2C

BMM150|Arduino UNO R3 I2C 测试

UNO R3 通过 I2C(0x13)读取 X/Y/Z 磁场。SDA 接 A4、SCL 接 A5,串口 115200;程序已验证(用户确认),编译通过。

Quick Facts

  • 主板:Arduino UNO R3
  • 接口:I2C
  • 版本:UNO-R3-20261002

验证状态

代码复核:已完成编译:已通过本版硬件复测:已完成

当前方案:BMM150 › Arduino UNO R3 › I2C

本方案接线

BMM150Arduino UNO R3
VCC3.3V
GNDGND
SDAA4 / SDA
SCLA5 / SCL
项目已有 BMM150 UNO R3 接线图

供电与信号电平

完整测试代码

本程序适用于:BMM150 + Arduino UNO R3 · I2C,版本 UNO-R3-20261002

下载当前版本源码

// Arduino UNO R3 / Arduino AVR Boards 1.8.8 / DFRobot_BMM150
// Verification: compiled for arduino:avr:uno; hardware validation confirmed by project owner.
#include <Wire.h>
#include "DFRobot_BMM150.h"

/*
 * BMM150 + Arduino UNO R3
 *
 * 接线:
 * BMM150 VCC -> UNO 3.3V
展开完整代码
// Arduino UNO R3 / Arduino AVR Boards 1.8.8 / DFRobot_BMM150
// Verification: compiled for arduino:avr:uno; hardware validation confirmed by project owner.
#include <Wire.h>
#include "DFRobot_BMM150.h"

/*
 * BMM150 + Arduino UNO R3
 *
 * 接线:
 * BMM150 VCC -> UNO 3.3V
 * BMM150 GND -> UNO GND
 * BMM150 SDA -> UNO A4
 * BMM150 SCL -> UNO A5
 *
 * I2C 地址:
 * 0x13 = I2C_ADDRESS_4
 */

// BMM150 I2C 地址 0x13
DFRobot_BMM150_I2C bmm150(&Wire, I2C_ADDRESS_4);

// 最多初始化尝试次数
const uint8_t INIT_MAX_RETRIES = 5;

// 记录传感器是否初始化成功
bool sensorReady = false;

void setup()
{
  Serial.begin(115200);

  // Arduino UNO R3 的 I2C:
  // SDA = A4
  // SCL = A5
  Wire.begin();

  delay(100);

  Serial.println();
  Serial.println("BMM150 Test Start");
  Serial.println("I2C Address: 0x13");

  // 有限次数初始化,避免传感器断开时永久卡死
  for (uint8_t attempt = 1; attempt <= INIT_MAX_RETRIES; attempt++)
  {
    Serial.print("BMM150 init attempt ");
    Serial.print(attempt);
    Serial.print("/");
    Serial.println(INIT_MAX_RETRIES);

    // DFRobot_BMM150:begin() 返回 0 表示成功
    if (bmm150.begin() == 0)
    {
      sensorReady = true;
      break;
    }

    Serial.println("BMM150 init failed!");
    delay(1000);
  }

  // 初始化失败后,不继续配置,也不读取传感器
  if (!sensorReady)
  {
    Serial.println();
    Serial.println("ERROR: BMM150 initialization failed.");
    Serial.println("Check VCC, GND, SDA=A4, SCL=A5 and I2C address 0x13.");
    return;
  }

  Serial.println("BMM150 init OK");

  // 正常连续测量模式
  bmm150.setOperationMode(BMM150_POWERMODE_NORMAL);

  // 高精度预设
  bmm150.setPresetMode(BMM150_PRESETMODE_HIGHACCURACY);

  /*
   * Bosch BMM150 高精度预设推荐 ODR 为 20Hz。
   *
   * 高精度预设使用较高的 X/Y、Z 重复测量次数,
   * 完成一次测量所需时间决定了最大有效数据率约为 20Hz。
   *
   * 因此这里不使用 30Hz,以保持高精度预设的正确组合。
   */
  bmm150.setRate(BMM150_DATA_RATE_20HZ);

  // 开启 X、Y、Z 三轴测量
  bmm150.setMeasurementXYZ();

  Serial.print("Configured data rate: ");
  Serial.print(bmm150.getRate());
  Serial.println(" Hz");

  Serial.println("High-accuracy mode enabled");
  Serial.println("Start measuring...");
  Serial.println();
}

void loop()
{
  // 初始化失败时禁止访问未初始化的传感器
  if (!sensorReady)
  {
    delay(1000);
    return;
  }

  // 读取三轴磁场数据,库返回单位为 uT
  sBmm150MagData_t magData = bmm150.getGeomagneticData();

  Serial.print("X = ");
  Serial.print(magData.x);

  Serial.print(" uT   Y = ");
  Serial.print(magData.y);

  Serial.print(" uT   Z = ");
  Serial.print(magData.z);

  Serial.println(" uT");

  // 网页测试要求:每 500ms 输出一次
  delay(500);
}

软件环境与依赖库

项目配置
开发环境Arduino IDE + Arduino AVR Boards 1.8.8 + DFRobot_BMM150
库版本DFRobot_BMM150 版本号待确认
运行参数I2C 0x13;高精度20Hz;串口115200;每500ms打印

运行方法

  1. 安装 Arduino AVR Boards,选择 Arduino Uno。
  2. 安装 DFRobot_BMM150 库。
  3. 断电接线,核对模块 I2C 上拉与电平转换,再连接 USB。
  4. 打开当前 UNO R3 新版程序并编译上传。
  5. 串口监视器设置为115200 baud。

预期输出

以下仅说明程序输出格式,不代表本次实测数据。

X = ... uT   Y = ... uT   Z = ... uT

视频与演示

项目历史实拍:UNO 接线演示。

项目历史实拍:三轴数据运行演示。程序已验证,由用户确认。

项目原始示例与版本差异

原始文件取自网盘归档包,使用 DFRobot 库;并非本轮修订版。

项目原始示例程序 — 使用 DFRobot 库,保留原文件

UNO R3 接线表 — VCC 3.3V、GND、SDA A4、SCL A5

Bosch BMM150 数据手册 · 在线阅读 / 下载 — Rev.1.4,2020年4月,56页;高精度预设见第13页表3

项目项目原始示例当前推荐版
初始化持续重试最多5次,失败后停止读取
I2C 初始化由库处理显式 Wire.begin()
高精度数据率30Hz20Hz,按手册高精度预设
串口与打印115200,每500ms保持一致
查看项目原始程序
#include <Wire.h>
#include "DFRobot_BMM150.h"


// BMM150 I2C 地址 0x13
DFRobot_BMM150_I2C bmm150(&Wire, I2C_ADDRESS_4);


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

  Serial.println("BMM150 Test Start");

  while(bmm150.begin())
  {
    Serial.println("BMM150 init failed!");
    delay(1000);
  }

  Serial.println("BMM150 init OK");


  // 正常测量模式
  bmm150.setOperationMode(BMM150_POWERMODE_NORMAL);

  // 高精度
  bmm150.setPresetMode(BMM150_PRESETMODE_HIGHACCURACY);

  // 30Hz
  bmm150.setRate(BMM150_DATA_RATE_30HZ);

  // 开启 XYZ
  bmm150.setMeasurementXYZ();

  Serial.println("Start measuring...");
}


void loop()
{

  // 读取磁场数据
  sBmm150MagData_t magData = bmm150.getGeomagneticData();


  Serial.print("X = ");
  Serial.print(magData.x);

  Serial.print(" uT   Y = ");
  Serial.print(magData.y);

  Serial.print(" uT   Z = ");
  Serial.print(magData.z);

  Serial.println(" uT");


  delay(500);
}

本方案下载

当前推荐版 UNO R3 程序 — UNO-R3-20261002;已验证(用户确认),编译通过

UNO R3 接线表 — VCC 3.3V、GND、SDA A4、SCL A5

项目原始示例程序 — 使用 DFRobot 库,保留原文件

Bosch BMM150 数据手册 · 在线阅读 / 下载 — Rev.1.4,2020年4月,56页;高精度预设见第13页表3

完整原始资料包 ZIP · 直接下载 — 网盘原包:项目原始程序、接线表、Bosch 手册;不含新版程序

百度网盘地址:https://pan.baidu.com/s/1RKi30PT7GgFyLUgWzWg1wA?pwd=1111 — 提取码:1111;来自本项目 B站简介

常见问题排查

现象处理
初始化失败检查电源共地、A4/A5与地址0x13;新版最多重试5次,失败后不会读取传感器。
串口乱码检查串口和115200波特率。
磁场数据异常远离磁铁、电机与大电流导线,并检查接触与信号电平。

版本与修改记录

版本说明
UNO-R3-20261002显式 Wire.begin;初始化最多5次;失败不读取;高精度模式20Hz。
原始项目代码保留在原资料包,不覆盖。