Arduino-Programm Esp32AngleProtractor GY-291 ADXL345

Ja. Minimal ohne jede Library außer Wire.h:

#include <Wire.h>
#include <math.h>

#define ADXL345_ADDR 0x53   // GY-291 meist: SDO/GND -> 0x53

int16_t ax, ay, az;

void writeReg(byte reg, byte value) {
  Wire.beginTransmission(ADXL345_ADDR);
  Wire.write(reg);
  Wire.write(value);
  Wire.endTransmission();
}

void readAccel() {
  Wire.beginTransmission(ADXL345_ADDR);
  Wire.write(0x32);                 // DATAX0
  Wire.endTransmission(false);

  Wire.requestFrom(ADXL345_ADDR, 6);

  ax = Wire.read() | (Wire.read() << 8);
  ay = Wire.read() | (Wire.read() << 8);
  az = Wire.read() | (Wire.read() << 8);
}

float angleDeg(int16_t a, int16_t b) {
  return atan2((float)a, (float)b) * 180.0 / PI;
}

void setup() {
  Serial.begin(115200);
  Wire.begin();

  // ADXL345 einschalten
  writeReg(0x2D, 0x08);   // POWER_CTL: Measure = 1

  // +/- 2g, Full Resolution
  writeReg(0x31, 0x08);   // DATA_FORMAT

  Serial.println("ADXL345 gestartet");
}

void loop() {
  readAccel();

  float angleXY = angleDeg(ay, ax);
  float angleXZ = angleDeg(az, ax);
  float angleYZ = angleDeg(az, ay);

  Serial.print("X=");
  Serial.print(ax);
  Serial.print("  Y=");
  Serial.print(ay);
  Serial.print("  Z=");
  Serial.print(az);

  Serial.print("  Winkel XY=");
  Serial.print(angleXY, 1);
  Serial.print(" deg");

  Serial.print("  XZ=");
  Serial.print(angleXZ, 1);
  Serial.print(" deg");

  Serial.print("  YZ=");
  Serial.print(angleYZ, 1);
  Serial.println(" deg");

  delay(500);
}

Anschluss Arduino Uno:

GY-291 VCC  -> 3.3V
GY-291 GND  -> GND
GY-291 SDA  -> A4
GY-291 SCL  -> A5

Wichtig: Der ADXL345 ist ein 3.3V-Sensor. Viele GY-291-Module haben zwar Regler/Levelshifter, aber nicht alle. Bei Unsicherheit besser mit 3.3V-I2C betreiben.