回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

【花雕学编程】Arduino动手做(239)---GY-61 ADXL335使用ADXL335.h库的加速度计演示 简单

头像 驴友花雕 2025.05.12 10 0

0-.jpg
02.jpg
04.jpg
05--.jpg

  【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
 实验二百三十九:GY-61 ADXL335模拟量加速度模块 倾斜角度三轴加速度传感器
 项目之五:使用ADXL335.h库的加速度计演示
 
安装ADXL335.h库(https://github.com/infomaniac50/ADXL335)
 

08-14.jpg

实验开源代码

代码
/*
  【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百三十九:GY-61 ADXL335模拟量加速度模块 倾斜角度三轴加速度传感器
  项目之五:使用ADXL335.h库的加速度计演示
*/

#include <ADXL335.h>  // **引入 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));  
}

代码简单解读

这段代码使用 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 传感器不断采集加速度数据,并格式化输出到串口。

 

实验串口返回情况

 

10.jpg

实验串口绘图器返回情况

 

07-1.jpg
10-.jpg

评论

user-avatar
icon 他的勋章
    展开更多