验证状态
代码复核:已完成编译:已通过本版硬件复测:已完成
当前方案:BMM150 › Arduino UNO R3 › I2C
本方案接线
| BMM150 | Arduino UNO R3 |
|---|---|
| VCC | 3.3V |
| GND | GND |
| SDA | A4 / SDA |
| SCL | A5 / SCL |

供电与信号电平
- 3.3V 供电不能证明 SDA/SCL 可以承受5V;须核对板载上拉与电平转换。
完整测试代码
本程序适用于: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打印 |
运行方法
- 安装 Arduino AVR Boards,选择 Arduino Uno。
- 安装 DFRobot_BMM150 库。
- 断电接线,核对模块 I2C 上拉与电平转换,再连接 USB。
- 打开当前 UNO R3 新版程序并编译上传。
- 串口监视器设置为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() |
| 高精度数据率 | 30Hz | 20Hz,按手册高精度预设 |
| 串口与打印 | 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。 |
| 原始项目代码 | 保留在原资料包,不覆盖。 |