7 static const char *
const TAG =
"mpu6050";
24 ESP_LOGCONFIG(TAG,
"Setting up MPU6050...");
26 if (!this->
read_byte(MPU6050_REGISTER_WHO_AM_I, &who_am_i) || (who_am_i != 0x68 && who_am_i != 0x98)) {
31 ESP_LOGV(TAG,
" Setting up Power Management...");
33 uint8_t power_management;
34 if (!this->
read_byte(MPU6050_REGISTER_POWER_MANAGEMENT_1, &power_management)) {
38 ESP_LOGV(TAG,
" Input power_management: 0b" BYTE_TO_BINARY_PATTERN, BYTE_TO_BINARY(power_management));
40 power_management &= 0b11111000;
46 ESP_LOGV(TAG,
" Output power_management: 0b" BYTE_TO_BINARY_PATTERN, BYTE_TO_BINARY(power_management));
47 if (!this->
write_byte(MPU6050_REGISTER_POWER_MANAGEMENT_1, power_management)) {
52 ESP_LOGV(TAG,
" Setting up Gyro Config...");
55 if (!this->
read_byte(MPU6050_REGISTER_GYRO_CONFIG, &gyro_config)) {
59 ESP_LOGV(TAG,
" Input gyro_config: 0b" BYTE_TO_BINARY_PATTERN, BYTE_TO_BINARY(gyro_config));
60 gyro_config &= 0b11100111;
61 gyro_config |= MPU6050_SCALE_2000_DPS << 3;
62 ESP_LOGV(TAG,
" Output gyro_config: 0b" BYTE_TO_BINARY_PATTERN, BYTE_TO_BINARY(gyro_config));
63 if (!this->
write_byte(MPU6050_REGISTER_GYRO_CONFIG, gyro_config)) {
68 ESP_LOGV(TAG,
" Setting up Accel Config...");
71 if (!this->
read_byte(MPU6050_REGISTER_ACCEL_CONFIG, &accel_config)) {
75 ESP_LOGV(TAG,
" Input accel_config: 0b" BYTE_TO_BINARY_PATTERN, BYTE_TO_BINARY(accel_config));
76 accel_config &= 0b11100111;
77 accel_config |= (MPU6050_RANGE_2G << 3);
78 ESP_LOGV(TAG,
" Output accel_config: 0b" BYTE_TO_BINARY_PATTERN, BYTE_TO_BINARY(accel_config));
79 if (!this->
write_byte(MPU6050_REGISTER_GYRO_CONFIG, gyro_config)) {
85 ESP_LOGCONFIG(TAG,
"MPU6050:");
88 ESP_LOGE(TAG,
"Communication with MPU6050 failed!");
90 LOG_UPDATE_INTERVAL(
this);
101 ESP_LOGV(TAG,
" Updating MPU6050...");
102 uint16_t raw_data[7];
103 if (!this->
read_bytes_16(MPU6050_REGISTER_ACCEL_XOUT_H, raw_data, 7)) {
107 auto *data =
reinterpret_cast<int16_t *
>(raw_data);
109 float accel_x = data[0] * MPU6050_RANGE_PER_DIGIT_2G *
GRAVITY_EARTH;
110 float accel_y = data[1] * MPU6050_RANGE_PER_DIGIT_2G *
GRAVITY_EARTH;
111 float accel_z = data[2] * MPU6050_RANGE_PER_DIGIT_2G *
GRAVITY_EARTH;
120 "Got accel={x=%.3f m/s², y=%.3f m/s², z=%.3f m/s²}, " 121 "gyro={x=%.3f °/s, y=%.3f °/s, z=%.3f °/s}, temp=%.3f°C",
122 accel_x, accel_y, accel_z, gyro_x, gyro_y, gyro_z, temperature);
const uint8_t MPU6050_RANGE_2G
bool read_byte(uint8_t a_register, uint8_t *data, bool stop=true)
const float DATA
For components that import data from directly connected sensors like DHT.
sensor::Sensor * gyro_y_sensor_
const float GRAVITY_EARTH
sensor::Sensor * accel_z_sensor_
const uint8_t MPU6050_BIT_SLEEP_ENABLED
const uint8_t MPU6050_REGISTER_ACCEL_XOUT_H
sensor::Sensor * accel_y_sensor_
const uint8_t MPU6050_REGISTER_ACCEL_CONFIG
sensor::Sensor * gyro_z_sensor_
const float MPU6050_RANGE_PER_DIGIT_2G
void status_clear_warning()
const uint8_t MPU6050_BIT_TEMPERATURE_DISABLED
void publish_state(float state)
Publish a new state to the front-end.
sensor::Sensor * temperature_sensor_
sensor::Sensor * accel_x_sensor_
void status_set_warning()
const float MPU6050_SCALE_DPS_PER_DIGIT_2000
float get_setup_priority() const override
bool write_byte(uint8_t a_register, uint8_t data, bool stop=true)
virtual void mark_failed()
Mark this component as failed.
const uint8_t MPU6050_REGISTER_GYRO_CONFIG
sensor::Sensor * gyro_x_sensor_
const uint8_t MPU6050_CLOCK_SOURCE_X_GYRO
const uint8_t MPU6050_SCALE_2000_DPS
void dump_config() override
const uint8_t MPU6050_REGISTER_POWER_MANAGEMENT_1
const uint8_t MPU6050_REGISTER_WHO_AM_I
bool read_bytes_16(uint8_t a_register, uint16_t *data, uint8_t len)