【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十三:ESP32-S3 UNO开发板 双核16M+8M+Wi-Fi+蓝牙5.0+45个GPIO
{花雕动手做}项目之八:ESP32-S3 UNO使用ADXL345传感器读取加速度数据并计算俯仰角和滚动角
实验开源代码
- /*
- 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
- 实验二百三十三:ESP32-S3 UNO开发板 双核16M+8M+Wi-Fi+蓝牙5.0+45个GPIO
- {花雕动手做}项目之八:ESP32-S3 UNO使用ADXL345传感器读取加速度数据并计算俯仰角和滚动角
- */
-
- #include <Wire.h> // 引入Wire库,用于I2C通信
-
- #define DEVICE (0x53) // ADXL345设备地址
- #define TO_READ (6) // 每次要读取的字节数(每个轴两个字节)
- byte buff[TO_READ]; // 6字节缓冲区,用于保存从设备读取的数据
-
- char str[512]; // 字符串缓冲区,用于在将数据发送到串行端口之前对其进行转换
- int regAddress = 0x32; // ADXL345上的第一个轴加速度数据寄存器
- int x, y, z; // 三轴加速度数据
-
- double roll = 0.00, pitch = 0.00; // Roll & Pitch 是绕X轴和Y轴旋转的角度
-
- void setup() {
- Wire.begin(4, 5); // 初始化I2C总线,设置SDA为GPIO4,SCL为GPIO5
- Serial.begin(115200); // 启动串口输出
-
- // 开启ADXL345
- writeTo(DEVICE, 0x2D, 0); // 进入待机模式
- writeTo(DEVICE, 0x2D, 16); // 重置所有位
- writeTo(DEVICE, 0x2D, 8); // 设置测量模式
- }
-
- void loop() {
- readFrom(DEVICE, regAddress, TO_READ, buff); // 从ADXL345读取加速度数据
-
- // 每个轴读数的分辨率为10位,即2个字节。最低有效字节优先!!
- // 因此我们将两个字节转换为一个整数
- x = (((int)buff[1]) << 8) | buff[0];
- y = (((int)buff[3]) << 8) | buff[2];
- z = (((int)buff[5]) << 8) | buff[4];
-
- // 将x, y, z值作为字符串发送到串口
- Serial.print("x, y, z的加速度信息为:");
- sprintf(str, "%d %d %d", x, y, z);
- Serial.print(str);
- Serial.write(10);
-
- // 计算Roll & Pitch
- RP_calculate();
- Serial.print("滚动:");
- Serial.println(roll);
- Serial.print("俯仰:");
- Serial.println(pitch);
- Serial.println("");
-
- // 延迟以避免阻塞端口
- delay(2000);
- }
-
- // 将val写入设备上的地址寄存器
- void writeTo(int device, byte address, byte val) {
- Wire.beginTransmission(device); // 开始传输到设备
- Wire.write(address); // 发送寄存器地址
- Wire.write(val); // 发送要写入的值
- Wire.endTransmission(); // 结束传输
- }
-
- // 从设备上的地址寄存器开始读取num字节到buff数组
- void readFrom(int device, byte address, int num, byte buff[]) {
- Wire.beginTransmission(device); // 开始传输到设备
- Wire.write(address); // 发送要读取的地址
- Wire.endTransmission(); // 结束传输
-
- Wire.beginTransmission(device); // 开始传输到设备
- Wire.requestFrom(device, num); // 从设备请求num个字节
-
- int i = 0;
- while (Wire.available()) // 设备发送的数据可能少于请求的数据(异常)
- {
- buff[i] = Wire.read(); // 接收一个字节
- i++;
- }
- Wire.endTransmission(); // 结束传输
- }
-
- // 计算Roll & Pitch
- void RP_calculate() {
- double x_Buff = float(x);
- double y_Buff = float(y);
- double z_Buff = float(z);
-
- roll = atan2(y_Buff, z_Buff) * 57.3; // 计算滚动角
- pitch = atan2(-x_Buff, sqrt(y_Buff * y_Buff + z_Buff * z_Buff)) * 57.3; // 计算俯仰角
- }
复制代码
|