ESP8266-Arduino编程实例-ADXL345三轴加速计驱动

ADXL345三轴加速计驱动

1、ADXL345介绍

ADXL345 是一款小型、薄型、低功耗、3 轴加速度计,具有高达 ±16g 的高分辨率(13 位)测量值。数字输出数据采用 16 位二进制补码格式,可通过 SPI(3 线或 4 线)或 I2C 数字接口访问。
ADXL345 非常适合移动设备应用。它测量倾斜感应应用中的静态重力加速度,以及运动或冲击产生的动态加速度。其高分辨率 (4 mg/LSB) 可以测量小于 1.0° 的倾角变化。

ADXL345提供了几种特殊的传感功能。活动和不活动感应检测运动的存在或缺乏,以及任何轴上的加速度是否超过用户设置的水平。轻敲感应检测单击和双击。自由落体感应检测设备是否正在下降。这些功能可以映射到两个中断输出引脚之一。一个集成的、正在申请专利的 32 级先进先出 (FIFO) 缓冲器可用于存储数据,以最大限度地减少主机处理器干预。

在这里插入图片描述

2、硬件准备

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

硬件接线如下:

在这里插入图片描述

3、软件准备

  • Arduino IDE或VSCode + PlatformIO

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

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

4、代码实现

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

1)导入依赖库头文件

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

// 创建ADXL345设备并分配设备ID
Adafruit_ADXL345_Unified accel = Adafruit\_ADXL345\_Unified(12345);

2)设备初始化

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
void setup(void) 
{
// 串口初始化
Serial.begin(9600);
Serial.println("Accelerometer Test"); Serial.println("");

// 初始化ADXL345加速计
if(!accel.begin())
{
// 初始化失败
Serial.println("Ooops, no ADXL345 detected ... Check your wiring!");
while(1);
}

// 设置重力参数
accel.setRange(ADXL345_RANGE_16_G);
// displaySetRange(ADXL345\_RANGE\_8\_G);
// displaySetRange(ADXL345\_RANGE\_4\_G);
// displaySetRange(ADXL345\_RANGE\_2\_G);

// 显示设备参数
displaySensorDetails();
// 显示数据采样频率
displayDataRate();
displayRange();
Serial.println("");
}

void displaySensorDetails(void)
{
sensor\_t sensor;
accel.getSensor(&sensor);
Serial.println("------------------------------------");
Serial.print ("Sensor: "); Serial.println(sensor.name);
Serial.print ("Driver Ver: "); Serial.println(sensor.version);
Serial.print ("Unique ID: "); Serial.println(sensor.sensor_id);
Serial.print ("Max Value: "); Serial.print(sensor.max_value); Serial.println(" m/s^2");
Serial.print ("Min Value: "); Serial.print(sensor.min_value); Serial.println(" m/s^2");
Serial.print ("Resolution: "); Serial.print(sensor.resolution); Serial.println(" m/s^2");
Serial.println("------------------------------------");
Serial.println("");
delay(500);
}

void displayDataRate(void)
{
Serial.print ("Data Rate: ");

switch(accel.getDataRate())
{
case ADXL345_DATARATE_3200_HZ:
Serial.print ("3200 ");
break;
case ADXL345_DATARATE_1600_HZ:
Serial.print ("1600 ");
break;
case ADXL345_DATARATE_800_HZ:
Serial.print ("800 ");
break;
case ADXL345_DATARATE_400_HZ:
Serial.print ("400 ");
break;
case ADXL345_DATARATE_200_HZ:
Serial.print ("200 ");
break;
case ADXL345_DATARATE_100_HZ:
Serial.print ("100 ");
break;
case ADXL345_DATARATE_50_HZ:
Serial.print ("50 ");
break;
case ADXL345_DATARATE_25_HZ:
Serial.print ("25 ");
break;
case ADXL345_DATARATE_12_5_HZ:
Serial.print ("12.5 ");
break;
case ADXL345_DATARATE_6_25HZ:
Serial.print ("6.25 ");
break;
case ADXL345_DATARATE_3_13_HZ:
Serial.print ("3.13 ");
break;
case ADXL345_DATARATE_1_56_HZ:
Serial.print ("1.56 ");
break;
case ADXL345_DATARATE_0_78_HZ:
Serial.print ("0.78 ");
break;
case ADXL345_DATARATE_0_39_HZ:
Serial.print ("0.39 ");
break;
case ADXL345_DATARATE_0_20_HZ:
Serial.print ("0.20 ");
break;
case ADXL345_DATARATE_0_10_HZ:
Serial.print ("0.10 ");
break;
default:
Serial.print ("???? ");
break;
}
Serial.println(" Hz");
}

void displayRange(void)
{
Serial.print ("Range: +/- ");

switch(accel.getRange())
{
case ADXL345_RANGE_16_G:
Serial.print ("16 ");
break;
case ADXL345_RANGE_8_G:
Serial.print ("8 ");
break;
case ADXL345_RANGE_4_G:
Serial.print ("4 ");
break;
case ADXL345_RANGE_2_G:
Serial.print ("2 ");
break;
default:
Serial.print ("?? ");
break;
}
Serial.println(" g");
}


3)数据采集

1
2
3
4
5
6
7
8
9
10
11
12
13
void loop(void) 
{
// 查询传感器最新事件
sensors\_event\_t event;
accel.getEvent(&event);

// 显示结果
Serial.print("X: "); Serial.print(event.acceleration.x); Serial.print(" ");
Serial.print("Y: "); Serial.print(event.acceleration.y); Serial.print(" ");
Serial.print("Z: "); Serial.print(event.acceleration.z); Serial.print(" ");Serial.println("m/s^2 ");
delay(500);
}

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