8static const char *
const TAG =
"bmi160";
13enum class Cmd : uint8_t {
123 if (!this->
read_byte(BMI160_REGISTER_CHIPID, &chipid) || (chipid != 0b11010001)) {
128 ESP_LOGV(TAG,
" Bringing accelerometer out of sleep");
133 ESP_LOGV(TAG,
" Waiting for accelerometer to wake up");
140 ESP_LOGV(TAG,
" Bringing gyroscope out of sleep");
145 ESP_LOGV(TAG,
" Waiting for gyroscope to wake up");
151 ESP_LOGV(TAG,
" Setting up Gyro Config");
153 ESP_LOGV(TAG,
" Output gyro_config: 0b" BYTE_TO_BINARY_PATTERN, BYTE_TO_BINARY(gyro_config));
154 if (!this->
write_byte(BMI160_REGISTER_GYRO_CONFIG, gyro_config)) {
158 ESP_LOGV(TAG,
" Setting up Gyro Range");
160 ESP_LOGV(TAG,
" Output gyro_range: 0b" BYTE_TO_BINARY_PATTERN, BYTE_TO_BINARY(gyro_range));
161 if (!this->
write_byte(BMI160_REGISTER_GYRO_RANGE, gyro_range)) {
166 ESP_LOGV(TAG,
" Setting up Accel Config");
167 uint8_t accel_config =
169 ESP_LOGV(TAG,
" Output accel_config: 0b" BYTE_TO_BINARY_PATTERN, BYTE_TO_BINARY(accel_config));
170 if (!this->
write_byte(BMI160_REGISTER_ACCEL_CONFIG, accel_config)) {
174 ESP_LOGV(TAG,
" Setting up Accel Range");
176 ESP_LOGV(TAG,
" Output accel_range: 0b" BYTE_TO_BINARY_PATTERN, BYTE_TO_BINARY(accel_range));
177 if (!this->
write_byte(BMI160_REGISTER_ACCEL_RANGE, accel_range)) {
188 ESP_LOGCONFIG(TAG,
"BMI160:");
189 LOG_I2C_DEVICE(
this);
191 ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL);
193 LOG_UPDATE_INTERVAL(
this);
204 uint8_t raw_data[
len * 2];
210 for (
int i = 0; i <
len; i++) {
211 value[i] = (int16_t) ((uint16_t) raw_data[i * 2] | ((uint16_t) raw_data[i * 2 + 1] << 8));
221 ESP_LOGV(TAG,
" Updating BMI160");
228 float gyro_x = (float) data[0] / (
float) INT16_MAX * 2000.f;
229 float gyro_y = (float) data[1] / (
float) INT16_MAX * 2000.f;
230 float gyro_z = (float) data[2] / (
float) INT16_MAX * 2000.f;
231 float accel_x = (float) data[3] / (
float) INT16_MAX * 16 *
GRAVITY_EARTH;
232 float accel_y = (float) data[4] / (
float) INT16_MAX * 16 *
GRAVITY_EARTH;
233 float accel_z = (float) data[5] / (
float) INT16_MAX * 16 *
GRAVITY_EARTH;
235 int16_t raw_temperature;
240 float temperature = (float) raw_temperature / (
float) INT16_MAX * 64.5f + 23.f;
243 "Got accel={x=%.3f m/s², y=%.3f m/s², z=%.3f m/s²}, "
244 "gyro={x=%.3f °/s, y=%.3f °/s, z=%.3f °/s}, temp=%.3f°C",
245 accel_x, accel_y, accel_z, gyro_x, gyro_y, gyro_z,
temperature);
virtual void mark_failed()
Mark this component as failed.
void status_set_warning(const char *message=nullptr)
void status_clear_warning()
void set_timeout(const std::string &name, uint32_t timeout, std::function< void()> &&f)
Set a timeout function with a unique name.
sensor::Sensor * accel_z_sensor_
i2c::ErrorCode read_le_int16_(uint8_t reg, int16_t *value, uint8_t len)
reads len 16-bit little-endian integers from the given i2c register
sensor::Sensor * gyro_y_sensor_
sensor::Sensor * gyro_x_sensor_
void dump_config() override
sensor::Sensor * accel_x_sensor_
sensor::Sensor * gyro_z_sensor_
void internal_setup_(int stage)
sensor::Sensor * temperature_sensor_
sensor::Sensor * accel_y_sensor_
float get_setup_priority() const override
bool write_byte(uint8_t a_register, uint8_t data, bool stop=true)
ErrorCode read_register(uint8_t a_register, uint8_t *data, size_t len, bool stop=true)
reads an array of bytes from a specific register in the I²C device
bool read_byte(uint8_t a_register, uint8_t *data, bool stop=true)
void publish_state(float state)
Publish a new state to the front-end.
const uint8_t BMI160_REGISTER_DATA_ACCEL_X_LSB
const uint8_t BMI160_REGISTER_DATA_ACCEL_Z_MSB
const uint8_t BMI160_REGISTER_DATA_TEMP_MSB
const uint8_t BMI160_REGISTER_DATA_ACCEL_X_MSB
const uint8_t BMI160_REGISTER_GYRO_RANGE
const uint8_t BMI160_REGISTER_DATA_ACCEL_Z_LSB
const uint8_t BMI160_REGISTER_DATA_GYRO_Y_LSB
const uint8_t BMI160_REGISTER_DATA_GYRO_Z_LSB
const uint8_t BMI160_REGISTER_ACCEL_RANGE
const uint8_t BMI160_REGISTER_DATA_TEMP_LSB
const uint8_t BMI160_REGISTER_DATA_GYRO_X_LSB
const uint8_t BMI160_REGISTER_GYRO_CONFIG
const uint8_t BMI160_REGISTER_DATA_GYRO_Z_MSB
const uint8_t BMI160_REGISTER_DATA_ACCEL_Y_LSB
const uint8_t BMI160_REGISTER_DATA_GYRO_Y_MSB
const uint8_t BMI160_REGISTER_CMD
const uint8_t BMI160_REGISTER_CHIPID
const uint8_t BMI160_REGISTER_DATA_ACCEL_Y_MSB
const uint8_t BMI160_REGISTER_DATA_GYRO_X_MSB
const float GRAVITY_EARTH
const uint8_t BMI160_REGISTER_ACCEL_CONFIG
ErrorCode
Error codes returned by I2CBus and I2CDevice methods.
@ ERROR_OK
No error found during execution of method.
const float DATA
For components that import data from directly connected sensors like DHT.
Providing packet encoding functions for exchanging data with a remote host.