【花雕学编程】Arduino动手做(239)---ADXL335三轴6个小实验

2025-05-096226
AI 快速预览详细 收起
本文介绍了使用ADXL335三轴加速度传感器模块进行的6个小实验。实验涵盖了传感器的连接、数据读取和故障排查方法。通过这些实验,无论是零基础新手还是有一定经验的爱好者,都可以提升自己的Arduino编程技能。


37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十九:GY-61 ADXL335 模拟量加速度模块 倾斜角度三轴加速度传感器模块

【花雕学编程】Arduino动手做(239)---ADXL335三轴6个小实验图1

【花雕学编程】Arduino动手做(239)---ADXL335三轴6个小实验图2

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(43)
驴友花雕
驴友花雕
作者
电原理图

驴友花雕
驴友花雕
作者

驴友花雕
驴友花雕
作者

驴友花雕
驴友花雕
作者
实验场景图 动态图


驴友花雕
驴友花雕
作者
实验串口绘图器返回情况

驴友花雕
驴友花雕
作者
实验串口返回情况

驴友花雕
驴友花雕
作者
代码简单解读
这段代码使用 ADXL335 加速度传感器 通过 Arduino 采集 X、Y、Z 轴加速度数据,并使用 OLED 显示屏 显示实时运动状态,核心逻辑如下:
1. 传感器数据采集
✅ analogRead(X_PIN); → 读取 X 轴模拟输入
✅ analogRead(Y_PIN); → 读取 Y 轴模拟输入
✅ analogRead(Z_PIN); → 读取 Z 轴模拟输入
✅ 将原始 ADC 值转换为加速度(单位:m/s²)
2. 串口输出
✅ Serial.print(); → 格式化并输出 X、Y、Z 轴加速度
✅ 确保单位为 m/s²,提高数据可读性
3. OLED 显示
✅ 使用 oledDisplayAcceleration(xAcc, yAcc, zAcc); 显示数据
✅ 优化文字排版,确保信息清晰可见
4. 采集间隔
✅ delay(200); → 适当延迟,防止 OLED 频繁刷新
这段代码让 Arduino 读取加速度数据,并实时显示在 OLED 屏幕上。
驴友花雕
驴友花雕
作者
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十九:GY-61 ADXL335模拟量加速度模块 倾斜角度三轴加速度传感器
项目之六:使用 OLED 显示屏显示实时运动状态
实验开源代码
[code]/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十九:GY-61 ADXL335模拟量加速度模块 倾斜角度三轴加速度传感器
项目之六:使用 OLED 显示屏显示实时运动状态
*/
#include "Arduino.h"
#include "U8g2lib.h"
#include "Wire.h"
#define X_PIN A0 // 加速度计 X 轴输入
#define Y_PIN A1 // 加速度计 Y 轴输入
#define Z_PIN A2 // 加速度计 Z 轴输入
U8G2_SSD1306_128X64_NONAME_F_HW_I2C oled(U8G2_R0, U8X8_PIN_NONE); // OLED 显示对象
void setup() {
Wire.begin(); // 启动 I2C
Serial.begin(115200); // 初始化串口
oled.begin(); // 初始化 OLED
oled.setFont(u8g2_font_ncenB18_tr); // 设置字体
}
void loop() {
int xRaw = analogRead(X_PIN);
int yRaw = analogRead(Y_PIN);
int zRaw = analogRead(Z_PIN);
const float SCALE = 102.3; // 灵敏度 330mV/g 转换因子
float xAcc = ((float)xRaw - 331.5) / 65 * 9.8;
float yAcc = ((float)yRaw - 329.5) / 68.5 * 9.8;
float zAcc = ((float)zRaw - 340) / 68 * 9.8;
// 串口输出格式化加速度数据
Serial.print("X: ");
Serial.print(xAcc, 2);
Serial.print(" m/s² | Y: ");
Serial.print(yAcc, 2);
Serial.print(" m/s² | Z: ");
Serial.println(zAcc, 2);
// 在 OLED 显示加速度数据
oledDisplayAcceleration(xAcc, yAcc, zAcc);
delay(200); // 适当延迟防止频繁刷新
}
/*****************************************************************************************************
* 在 OLED 显示加速度数据
*****************************************************************************************************/
void oledDisplayAcceleration(float x, float y, float z) {
oled.firstPage();
do {
oled.setCursor(2, 20);
oled.print("X: ");
oled.print(x, 2);
oled.setCursor(2, 40);
oled.print("Y: ");
oled.print(y, 2);
oled.setCursor(2, 60);
oled.print("Z: ");
oled.print(z, 2);
} while (oled.nextPage());
}[/code]
驴友花雕
驴友花雕
作者
实验模块接线示意图

驴友花雕
驴友花雕
作者
实验串口绘图器返回情况

驴友花雕
驴友花雕
作者
实验串口返回情况

驴友花雕
驴友花雕
作者
代码简单解读
这段代码使用 ADXL335 加速度传感器 读取 X、Y、Z 轴加速度,并计算 球坐标参数(ρ、φ、θ),核心逻辑如下:
1. 初始化加速度传感器
✅ ADXL335 accel(pin_x, pin_y, pin_z, aref); → 定义 ADXL335 传感器,并设定引脚和参考电压
2. 采集加速度数据
✅ accel.update(); → 更新传感器数据
✅ accel.getX(); → 获取 X 轴加速度
✅ accel.getY(); → 获取 Y 轴加速度
✅ accel.getZ(); → 获取 Z 轴加速度
3. 计算球坐标
✅ accel.getRho(); → 计算径向距离(ρ)
✅ accel.getPhi(); → 计算方位角(φ)
✅ accel.getTheta(); → 计算极角(θ)
4. 格式化数据并输出
✅ formatFloat(x, 2, &string_width); → 格式化浮点数
✅ Serial.print(); → 将数据打印到串口监视器
5. 采集间隔
✅ delay(1000); → 每秒更新一次数据
这段代码让 ADXL335 传感器不断采集加速度数据,并格式化输出到串口。
驴友花雕
驴友花雕
作者
实验开源代码
[code]/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十九:GY-61 ADXL335模拟量加速度模块 倾斜角度三轴加速度传感器
项目之五:使用ADXL335.h库的加速度计演示
*/
#include // **引入 ADXL335 传感器库**
const int pin_x = A0; // **X 轴模拟输入**
const int pin_y = A1; // **Y 轴模拟输入**
const int pin_z = A2; // **Z 轴模拟输入**
const float aref = 3.3; // **参考电压 3.3V**
ADXL335 accel(pin_x, pin_y, pin_z, aref); // **创建 ADXL335 传感器对象**
void setup() {
Serial.begin(9600); // **初始化串口通信**
// **串口监视器输出数据标题**
Serial.println("X,\tY,\tZ,\tRho,\tPhi,\tTheta");
}
void loop() {
accel.update(); // **更新传感器数据**
int string_width; // **变量用于存储格式化字符串宽度**
float x = accel.getX(); // **获取 X 轴加速度**
float y = accel.getY(); // **获取 Y 轴加速度**
float z = accel.getZ(); // **获取 Z 轴加速度**
// **球坐标变量**
float rho = accel.getRho(); // **ρ:径向距离**
float phi = accel.getPhi(); // **φ:方位角**
float theta = accel.getTheta(); // **θ:极角**
// **输出数据到串口**
Serial.print(formatFloat(x, 2, &string_width));
Serial.print(",\t");
Serial.print(formatFloat(y, 2, &string_width));
Serial.print(",\t");
Serial.print(formatFloat(z, 2, &string_width));
Serial.print(",\t");
Serial.print(formatFloat(rho, 2, &string_width));
Serial.print(",\t");
Serial.print(formatFloat(phi, 2, &string_width));
Serial.print(",\t");
Serial.print(formatFloat(theta, 2, &string_width));
Serial.println("");
delay(1000); // **每秒刷新一次数据**
}
/*****************************************************************************************************
* **formatFloat**
* - 格式化浮点数,使其转换为固定小数位数的字符串
* - 处理特殊情况,例如 **无穷大(Inf)、无效数值(NaN)**
*****************************************************************************************************/
String formatFloat(double value, int places, int* string_width) {
// **检查是否为正无穷**
if (isinf(value) > 0) {
return "+Inf";
}
// **Arduino 没有负无穷,但保留这部分代码**
if (isinf(value) < 0) {
return "-Inf";
}
// **检查是否为 NaN(非法数值)**
if (isnan(value) > 0) {
return "NaN";
}
// **字符串宽度计算**
int num_width = 1; // **初始宽度(包括小数点)**
// **确保小数位数至少为 1**
if (places < 1) {
places = 1;
value = (float)((int)value); // **舍去小数部分**
}
num_width += places; // **添加小数位数宽度**
// **处理小于 1 的情况**
if (value < 1.0 && value > -1.0) {
num_width++; // **额外空间存储 "0."**
} else {
num_width += ((int)log10(abs(value))) + 1; // **计算整数部分宽度**
}
// **处理负数**
if (value < 0.0) {
num_width++; // **预留负号**
}
// **创建字符数组用于存储字符串**
char s[num_width + 1];
s[num_width] = '\0'; // **字符串结束符**
// **初始化数组**
for (int i = 0; i < num_width; i++) {
s[i] = '0';
}
// **设置输出字符串宽度**
*string_width = num_width;
// **使用 AVR `dtostrf` 函数格式化浮点数**
return String(dtostrf(value, num_width, places, s));
}[/code]
驴友花雕
驴友花雕
作者
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十九:GY-61 ADXL335模拟量加速度模块 倾斜角度三轴加速度传感器
项目之五:使用ADXL335.h库的加速度计演示
安装ADXL335.h库(https://github.com/infomaniac50/ADXL335

驴友花雕
驴友花雕
作者
实验串口绘图器返回情况


驴友花雕
驴友花雕
作者
实验串口返回情况

驴友花雕
驴友花雕
作者
代码解读
这段代码使用 加速度传感器 采集 X、Y、Z 轴数据,并提供 自动校准功能,核心逻辑如下:
1. 初始化传感器
✅ const int xInput = A0; → X 轴连接 A0
✅ const int yInput = A1; → Y 轴连接 A1
✅ const int zInput = A2; → Z 轴连接 A2
✅ const int buttonPin = 2; → 按钮用于触发自动校准
✅ analogReference(EXTERNAL); → 使用外部参考电压,提高精度
2. 读取加速度数据
✅ ReadAxis(xInput); → 采集 X 轴的电压数据
✅ ReadAxis(yInput); → 采集 Y 轴的电压数据
✅ ReadAxis(zInput); → 采集 Z 轴的电压数据
✅ 多次采样(10 次)求平均值,减少噪声
3. 自动校准
✅ 按下按钮时调用 AutoCalibrate(),动态调整 最小/最大值
✅ 不断更新 xRawMin、xRawMax 等范围,提高测量精度
4. 数据转换
✅ map(xRaw, xRawMin, xRawMax, -1000, 1000); → 将 ADC 值转换为 milli-G(±1G)
✅ / 1000.0 → 转换为 G(加速度单位)
5. 串口输出
✅ Serial.print("Raw Ranges: X: "); Serial.print(xRawMin); → 打印 X 轴的最小/最大值
✅ 以 G 为单位显示加速度数据,格式化输出
6. 采集间隔
✅ delay(500); → 每 500 毫秒更新一次数据,适合实时监测
这段代码让 加速度传感器能够动态校准并稳定采集数据
驴友花雕
驴友花雕
作者
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十九:GY-61 ADXL335模拟量加速度模块 倾斜角度三轴加速度传感器
项目之四:使用按键的自动校准功能
实验开源代码
[code]/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十九:GY-61 ADXL335模拟量加速度模块 倾斜角度三轴加速度传感器
项目之四:使用按键的自动校准功能
*/
const int xInput = A0;
const int yInput = A1;
const int zInput = A2;
const int buttonPin = 2;
// Raw Ranges:
// initialize to mid-range and allow calibration to
// find the minimum and maximum for each axis
int xRawMin = 512;
int xRawMax = 512;
int yRawMin = 512;
int yRawMax = 512;
int zRawMin = 512;
int zRawMax = 512;
// Take multiple samples to reduce noise
const int sampleSize = 10;
void setup()
{
analogReference(EXTERNAL);
Serial.begin(9600);
}
void loop()
{
int xRaw = ReadAxis(xInput);
int yRaw = ReadAxis(yInput);
int zRaw = ReadAxis(zInput);
if (digitalRead(buttonPin) == LOW)
{
AutoCalibrate(xRaw, yRaw, zRaw);
}
else
{
Serial.print("Raw Ranges: X: ");
Serial.print(xRawMin);
Serial.print("-");
Serial.print(xRawMax);
Serial.print(", Y: ");
Serial.print(yRawMin);
Serial.print("-");
Serial.print(yRawMax);
Serial.print(", Z: ");
Serial.print(zRawMin);
Serial.print("-");
Serial.print(zRawMax);
Serial.println();
Serial.print(xRaw);
Serial.print(", ");
Serial.print(yRaw);
Serial.print(", ");
Serial.print(zRaw);
// Convert raw values to 'milli-Gs"
long xScaled = map(xRaw, xRawMin, xRawMax, -1000, 1000);
long yScaled = map(yRaw, yRawMin, yRawMax, -1000, 1000);
long zScaled = map(zRaw, zRawMin, zRawMax, -1000, 1000);
// re-scale to fractional Gs
float xAccel = xScaled / 1000.0;
float yAccel = yScaled / 1000.0;
float zAccel = zScaled / 1000.0;
Serial.print(" :: ");
Serial.print(xAccel);
Serial.print("G, ");
Serial.print(yAccel);
Serial.print("G, ");
Serial.print(zAccel);
Serial.println("G");
delay(500);
}
}
//
// Read "sampleSize" samples and report the average
//
int ReadAxis(int axisPin)
{
long reading = 0;
analogRead(axisPin);
delay(1);
for (int i = 0; i < sampleSize; i++)
{
reading += analogRead(axisPin);
}
return reading / sampleSize;
}
//
// Find the extreme raw readings from each axis
//
void AutoCalibrate(int xRaw, int yRaw, int zRaw)
{
Serial.println("Calibrate");
if (xRaw < xRawMin)
{
xRawMin = xRaw;
}
if (xRaw > xRawMax)
{
xRawMax = xRaw;
}
if (yRaw < yRawMin)
{
yRawMin = yRaw;
}
if (yRaw > yRawMax)
{
yRawMax = yRaw;
}
if (zRaw < zRawMin)
{
zRawMin = zRaw;
}
if (zRaw > zRawMax)
{
zRawMax = zRaw;
}
}[/code]
驴友花雕
驴友花雕
作者


运行校准程序
将代码加载到 Arduino 上并运行它。
打开 串行监视器。
将带有传感器的试验板放在平坦的表面上
按住该按钮,直到您在串行监视器中看到“校准”。
这将校准 z 轴的最小值。
将试验板放在前边缘,然后再次按下按钮。校准 +Y
对其他三个边重复此作,以校准 +x、-y 和 -x。
将试验板倒置并再次按下按钮以校准 +z。(提示,桌子的底部可以很好地稳定它。
校准程序输出:
校准后,输出将显示每个轴的校准原始范围,然后是测得的“G”力。原始范围可用作草图中的常量。
原始范围: X: 408-616, Y: 398-610, Z: 422-625
511, 511, 625 : : -0.01G, 0.07G, 1.00G
原始范围: X: 408-616, Y: 398-610, Z: 422-625
511, 511, 625 :: -0.01G, 0.07G, 1.00G
原始范围: X: 408-616, Y: 398-610, Z: 422-625
511, 511, 625 :: -0.01G, 0.07G, 1.00G
原始范围: X: 408-616, Y: 398-610, Z: 422-625
511, 511, 625 :: -0.01G, 0.07G, 1.00G
原始范围: X: 408-616, Y: 398-610, Z: 422-625
驴友花雕
驴友花雕
作者
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十九:GY-61 ADXL335模拟量加速度模块 倾斜角度三轴加速度传感器
项目之四:使用按键的自动校准功能
静态校准:
与所有传感器一样,这些加速度计的样本之间的输出存在一些差异。对于非关键应用,例如游戏控制器或简单的运动或倾斜传感器,这些变化并不重要。但对于需要精确测量的应用,最好根据可靠的参考进行校准。
重力作为校准参考
加速度以重力或“G”为单位测量,其中 1G 代表地球表面的引力。尽管您可能听说过,但重力是一种非常稳定的力,如果您碰巧是居住在地表的地球人,它可以成为方便可靠的校准参考。
校准方法:
要将传感器校准到重力参考,您需要确定每个轴与引力轴精确对齐时的传感器输出。实验室质量校准使用精密定位夹具。这里描述的方法很简单,并且给出了非常好的结果。