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

实验开源代码
/*
【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 传感器不断采集加速度数据,并格式化输出到串口。
实验串口返回情况

实验串口绘图器返回情况


评论