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

Erzeuge ein minimales projekt mit dem Esp32 UnoBoard und dem

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

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"