Files
jdillenburg-esphome/components/adxl345/adxl345.cpp
2025-03-02 20:07:36 -06:00

109 lines
3.0 KiB
C++

#include "adxl345.h"
#include "esphome/core/log.h"
namespace esphome {
namespace adxl345 {
static const char *const TAG = "adxl345";
void ADXL345Component::setup() {
ESP_LOGCONFIG(TAG, "Setting up ADXL345...");
if (!accel_.begin(this->address_)) {
ESP_LOGE(TAG, "Could not find ADXL345 sensor at address 0x%02X!", this->address_);
this->mark_failed();
return;
}
// Map our range enum values to Adafruit library constants
range_t adafruit_range;
switch (this->range_) {
case 0: // RANGE_2G
adafruit_range = ADXL345_RANGE_2_G;
break;
case 1: // RANGE_4G
adafruit_range = ADXL345_RANGE_4_G;
break;
case 2: // RANGE_8G
adafruit_range = ADXL345_RANGE_8_G;
break;
case 3: // RANGE_16G
adafruit_range = ADXL345_RANGE_16_G;
break;
default:
adafruit_range = ADXL345_RANGE_2_G;
break;
}
accel_.setRange(adafruit_range);
ESP_LOGD(TAG, "ADXL345 setup complete");
}
void ADXL345Component::dump_config() {
ESP_LOGCONFIG(TAG, "ADXL345:");
LOG_I2C_DEVICE(this);
LOG_UPDATE_INTERVAL(this);
const char* range_str;
switch (this->range_) {
case 0: range_str = "2G"; break;
case 1: range_str = "4G"; break;
case 2: range_str = "8G"; break;
case 3: range_str = "16G"; break;
default: range_str = "Unknown"; break;
}
ESP_LOGCONFIG(TAG, " Range: %s", range_str);
if (this->off_vertical_ != nullptr) {
LOG_SENSOR(" ", "Off Vertical", this->off_vertical_);
}
if (this->jitter_ != nullptr) {
LOG_SENSOR(" ", "Jitter", this->jitter_);
}
if (this->accel_x_ != nullptr) {
LOG_SENSOR(" ", "Acceleration X", this->accel_x_);
}
if (this->accel_y_ != nullptr) {
LOG_SENSOR(" ", "Acceleration Y", this->accel_y_);
}
if (this->accel_z_ != nullptr) {
LOG_SENSOR(" ", "Acceleration Z", this->accel_z_);
}
}
void ADXL345Component::update() {
sensors_event_t event;
accel_.getEvent(&event);
// Publish raw accelerometer values if sensors are configured
if (this->accel_x_ != nullptr) {
this->accel_x_->publish_state(event.acceleration.x);
}
if (this->accel_y_ != nullptr) {
this->accel_y_->publish_state(event.acceleration.y);
}
if (this->accel_z_ != nullptr) {
this->accel_z_->publish_state(event.acceleration.z);
}
// Calculate and publish off_vertical if sensor is configured
if (this->off_vertical_ != nullptr) {
double pitch_amount = atan(event.acceleration.y /
sqrt(pow(event.acceleration.x, 2) + pow(event.acceleration.z, 2))) * 180 / PI;
double roll_amount = atan(-1 * event.acceleration.x /
sqrt(pow(event.acceleration.y, 2) + pow(event.acceleration.z, 2))) * 180 / PI;
this->off_vertical_->publish_state(max(abs(pitch_amount), abs(roll_amount)));
}
// Calculate and publish jitter if sensor is configured
if (this->jitter_ != nullptr) {
float jitter_value = abs(event.acceleration.x) + abs(event.acceleration.y) + abs(event.acceleration.z);
this->jitter_->publish_state(jitter_value);
}
}
} // namespace adxl345
} // namespace esphome