【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;  // 计算俯仰角
 - }
 
  复制代码
  
 
 |