ESP8266-Arduino编程实例-HMC5883L磁场传感器

HMC5883L磁场传感器

1、HMC5883L介绍

霍尼韦尔 HMC5883L 是一款表面贴装、多芯片模块,专为低场磁场传感而设计,具有数字接口,适用于低成本罗盘和磁力计等应用。 HMC5883L 包括我们先进的高分辨率 HMC118X 系列磁阻传感器和一个 ASIC,该 ASIC 包含放大、自动消磁带驱动器、偏移消除和一个 12 位 ADC,可实现 1° 至 2° 的罗盘航向精度。

I2C 串行总线允许简单的接口。 HMC5883L 是一款 3.0×3.0x0.9mm 表面贴装 16 引脚无引线芯片载体 (LCC)。 HMC5883L 的应用包括移动电话、上网本、消费电子产品、自动导航系统和个人导航设备。

HMC5883L 采用霍尼韦尔的各向异性磁阻 (AMR) 技术,与其他磁传感器技术相比具有优势。这些各向异性方向传感器具有精确的轴内灵敏度和线性度。

这些传感器的固态结构具有极低的交叉轴灵敏度,旨在测量从毫高斯到 8 高斯的地球磁场的方向和大小。霍尼韦尔的磁传感器是业内最灵敏、最可靠的低场传感器之一。

在这里插入图片描述

2、硬件准备

  • ESP8266 NodeMCU开发板一块
  • HMC5883L传感器模块一个
  • 面板板一个
  • 杜邦线若干
  • 数据线一条

硬件接线如下:

在这里插入图片描述

3、软件准备

  • Arduino IDE或VSCode + PlatformIO

在前面的文章中,对如何搭建ESP8266开发环境做了详细的介绍,请参考:

ESP8266 NodeMCU的引脚介绍在前面的文章中做了详细的介绍,请参考:

4、代码实现

本次实例使用HMLC5883L驱动库如下:

1)导入依赖库头文件

1
2
3
4
5
6
7
#include <Wire.h>
#include <Adafruit\_Sensor.h>
#include <Adafruit\_HMC5883\_U.h>

// 创建HMC5883L设备并分配设备ID
Adafruit_HMC5883_Unified mag = Adafruit\_HMC5883\_Unified(12345);

2)设备初始化

1
2
3
4
5
6
7
8
9
10
11
12
void setup(void) 
{
Serial.begin(9600);

/\* HMC5883L初始化 \*/
if(!mag.begin())
{
Serial.println("Ooops, no HMC5883 detected ... Check your wiring!");
while(1);
}
}

3)数据采集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
void loop(void) 
{
// 查询设备最新事件
sensors\_event\_t event;
mag.getEvent(&event);

// 显示读取结果 (磁矢量值以微特斯拉 (uT) 为单位)
Serial.print("X: ");
Serial.print(event.magnetic.x);
Serial.print(" ");
Serial.print("Y: ");
Serial.print(event.magnetic.y);
Serial.print(" ");
Serial.print("Z: ");
Serial.print(event.magnetic.z);
Serial.print(" ");
Serial.println("uT");

// 握住模块,使 Z 指向“向上”,您可以使用 x&y 测量航向
//当磁力计水平时计算航向,然后校正轴的符号。
float heading = atan2(event.magnetic.y, event.magnetic.x);

// 确定航向后,必须添加“偏角”,即您所在位置的磁场“误差”。
// 在这里找到你的:http://www.magnetic-declination.com/
// 这里的值:-3\* 14' W,大约 3.2333333 度,或者(我们需要的)0.0564323 弧度
// 如果找不到你的偏角,注释掉这两行,指南针会稍微偏离。
float declinationAngle = 0.0564323;
heading += declinationAngle;

// 当符号反转时更正
if(heading < 0)
heading += 2\*PI;

// 检查是否由于增加了偏角而产生了缠绕
if(heading > 2\*PI)
heading -= 2\*PI;

// 将弧度转换为度数以提高可读性
float headingDegrees = heading \* 180/M_PI;

Serial.print("Heading (degrees): ");
Serial.println(headingDegrees);

delay(500);
}

如果需要查找你所在位置的磁偏角,请在http://www.magnetic-declination.com/上查询,例如广州的磁偏角信息如下:

在这里插入图片描述

查找结果后,转换为弧度即可。

文章来源: https://iotsmart.blog.csdn.net/article/details/126328233