## 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

```cpp
#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:

```text
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:

```cpp
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"](https://github.com/sparkfun/SparkFun_ADXL345_Arduino_Library/blob/master/examples/SparkFun_ADXL345_Example/SparkFun_ADXL345_Example.ino)
