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.