## Wie kann ich die x-/y-/z-winkel messen und in grad ausgeben?

Erzeuge ein minimales projekt mit dem Esp32 UnoBoard und dem

- ADXL345 mit Library https://github.com/sparkfun/SparkFun_ADXL345_Arduino_Library

Ja. Beim ADXL345 brauchst du keinen externen ADC: Er ist ein digitaler I²C/SPI-Beschleunigungssensor. Mit dem ESP32 UnoBoard reicht I²C.

Die SparkFun-Library nutzt z. B. `ADXL345 adxl = ADXL345();` für I²C, `adxl.powerOn()`, `adxl.setRangeSetting(...)` und `adxl.readAccel(&x,&y,&z)`. ([GitHub][1])

## Verdrahtung I²C

ADXL345 | ESP32 UnoBoard
--- | ---
VCC | 3.3 V
GND | GND
SDA | GPIO 21
SCL | GPIO 22
CS | 3.3 V
SDO | GND für Adresse `0x53`

Falls dein Breakout schon Pullups/Levelshifter hat, ist das unkritisch. Den ADXL345 selbst bitte mit 3.3 V betreiben.

## Library installieren

Arduino IDE → Library Manager → SparkFun ADXL345 Arduino Library

Oder per ZIP von GitHub:
`SparkFun_ADXL345_Arduino_Library`

## Minimaler Sketch: Winkel in Grad

    #include <Wire.h>
    #include <SparkFun_ADXL345.h>

    ADXL345 adxl = ADXL345();  // I2C

    const int SDA_PIN = 21;
    const int SCL_PIN = 22;

    // ADXL345 im Full-Resolution-Modus:
    // Rohwert entspricht ca. 3.9 mg/LSB
    const float LSB_TO_G = 0.0039;

    void setup() {
      Serial.begin(115200);
      delay(500);

      Wire.begin(SDA_PIN, SCL_PIN);

      adxl.powerOn();

      // Messbereich: 2, 4, 8 oder 16 g
      // Für Neigungswinkel ist 2g am sinnvollsten.
      adxl.setRangeSetting(2);

      Serial.println("ESP32 UnoBoard + ADXL345 Winkelmessung gestartet");
    }

    void loop() {
      int xRaw, yRaw, zRaw;

      adxl.readAccel(&xRaw, &yRaw, &zRaw);

      float ax = xRaw * LSB_TO_G;
      float ay = yRaw * LSB_TO_G;
      float az = zRaw * LSB_TO_G;

      float angleX = atan2(ax, sqrt(ay * ay + az * az)) * 180.0 / PI;
      float angleY = atan2(ay, sqrt(ax * ax + az * az)) * 180.0 / PI;
      float angleZ = atan2(az, sqrt(ax * ax + ay * ay)) * 180.0 / PI;

      Serial.print("ax=");
      Serial.print(ax, 3);
      Serial.print("g ay=");
      Serial.print(ay, 3);
      Serial.print("g az=");
      Serial.print(az, 3);

      Serial.print("g | X=");
      Serial.print(angleX, 1);
      Serial.print(" deg Y=");
      Serial.print(angleY, 1);
      Serial.print(" deg Z=");
      Serial.print(angleZ, 1);
      Serial.println(" deg");

      delay(200);
    }

## Bedeutung der Winkel

- `angleX`: Neigung um die X-Achse bezogen auf Schwerkraftvektor
- `angleY`: Neigung um die Y-Achse
- `angleZ`: Winkel der Z-Achse zum Schwerkraftvektor

Bei flachem Sensor solltest du ungefähr sehen:

    ax ≈ 0g
    ay ≈ 0g
    az ≈ 1g
    X ≈ 0 deg
    Y ≈ 0 deg
    Z ≈ 90 deg

Für eine klassische Anzeige von Roll und Pitch sind oft diese zwei Werte sinnvoller:

    float roll  = atan2(ay, az) * 180.0 / PI;
    float pitch = atan2(-ax, sqrt(ay * ay + az * az)) * 180.0 / PI;

Der ADXL345 misst Neigung nur im Stillstand zuverlässig. Bei Bewegung misst er zusätzlich dynamische Beschleunigung; dann sind die Winkel verfälscht.

[1]: "SparkFun_ADXL345_Arduino_Library/examples/SparkFun_ADXL345 ... - GitHub"