mirror of
https://github.com/jdillenburg/esphome.git
synced 2026-01-09 23:10:38 -07:00
109 lines
3.0 KiB
C++
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
|