first commit

This commit is contained in:
lumijiez
2025-04-28 18:30:29 +03:00
commit a4b88564a4
45 changed files with 2188 additions and 0 deletions

View File

@@ -0,0 +1,130 @@
#include "drivers/AccelerometerController.h"
ADXL345Controller::ADXL345Controller(uint8_t deviceAddress) :
_deviceAddress(deviceAddress),
_lastReadTime(0),
_minReadInterval(DEFAULT_MIN_READ_INTERVAL),
_lastX(0.0),
_lastY(0.0),
_lastZ(0.0),
_lastReadSuccess(false) {
}
void ADXL345Controller::begin() {
Wire.begin();
uint8_t deviceID = readRegister(ADXL345_DEVID);
if (deviceID != 0xE5) {
_lastReadSuccess = false;
return;
}
setRegister(ADXL345_POWER_CTL, 0x08);
setRegister(ADXL345_DATA_FORMAT, 0x0B);
setRegister(ADXL345_BW_RATE, 0x0A);
setRegister(ADXL345_OFSX, 0x00);
setRegister(ADXL345_OFSY, 0x00);
setRegister(ADXL345_OFSZ, 0x00);
_lastReadSuccess = true;
}
bool ADXL345Controller::read() {
unsigned long currentTime = millis();
if (currentTime - _lastReadTime >= _minReadInterval) {
_lastReadTime = currentTime;
uint8_t buffer[6];
readRegisters(ADXL345_DATAX0, 6, buffer);
int16_t x = ((int16_t)buffer[1] << 8) | buffer[0];
int16_t y = ((int16_t)buffer[3] << 8) | buffer[2];
int16_t z = ((int16_t)buffer[5] << 8) | buffer[4];
_lastX = x / 256.0;
_lastY = y / 256.0;
_lastZ = z / 256.0;
_lastReadSuccess = true;
return true;
}
return _lastReadSuccess;
}
double ADXL345Controller::getX() {
if (millis() - _lastReadTime >= _minReadInterval) read();
return _lastX;
}
double ADXL345Controller::getY() {
if (millis() - _lastReadTime >= _minReadInterval) read();
return _lastY;
}
double ADXL345Controller::getZ() {
if (millis() - _lastReadTime >= _minReadInterval) read();
return _lastZ;
}
bool ADXL345Controller::isLastReadSuccessful() const {
return _lastReadSuccess;
}
void ADXL345Controller::setMinReadInterval(unsigned long interval) {
_minReadInterval = interval;
}
void ADXL345Controller::setRange(uint8_t range) {
uint8_t format = readRegister(ADXL345_DATA_FORMAT);
format &= ~0x03;
if (range > 3) range = 3;
format |= range;
setRegister(ADXL345_DATA_FORMAT, format);
}
void ADXL345Controller::setDataRate(uint8_t rate) {
if (rate > 15) rate = 15;
setRegister(ADXL345_BW_RATE, rate);
}
void ADXL345Controller::setOffsets(int8_t xOffset, int8_t yOffset, int8_t zOffset) {
setRegister(ADXL345_OFSX, xOffset);
setRegister(ADXL345_OFSY, yOffset);
setRegister(ADXL345_OFSZ, zOffset);
}
void ADXL345Controller::setRegister(uint8_t reg, uint8_t value) {
Wire.beginTransmission(_deviceAddress);
Wire.write(reg);
Wire.write(value);
Wire.endTransmission();
}
uint8_t ADXL345Controller::readRegister(uint8_t reg) {
Wire.beginTransmission(_deviceAddress);
Wire.write(reg);
Wire.endTransmission();
Wire.requestFrom(_deviceAddress, (uint8_t)1);
return Wire.read();
}
void ADXL345Controller::readRegisters(uint8_t reg, uint8_t count, uint8_t *buffer) {
Wire.beginTransmission(_deviceAddress);
Wire.write(reg);
Wire.endTransmission();
Wire.requestFrom(_deviceAddress, count);
for (uint8_t i = 0; i < count && Wire.available(); i++) {
buffer[i] = Wire.read();
}
}