1
0
mirror of https://github.com/esphome/esphome.git synced 2025-04-06 19:00:29 +01:00
esphome/esphome/components/tof10120/tof10120_sensor.cpp
2021-04-29 11:49:46 +12:00

54 lines
1.5 KiB
C++

#include "tof10120_sensor.h"
#include "esphome/core/log.h"
// Very basic support for TOF10120 distance sensor
namespace esphome {
namespace tof10120 {
static const char *TAG = "tof10120";
static const uint8_t TOF10120_READ_DISTANCE_CMD[] = {0x00};
static const uint8_t TOF10120_DEFAULT_DELAY = 30;
static const uint8_t TOF10120_DIR_SEND_REGISTER = 0x0e;
static const uint8_t TOF10120_DISTANCE_REGISTER = 0x00;
static const uint16_t TOF10120_OUT_OF_RANGE_VALUE = 2000;
void TOF10120Sensor::dump_config() {
LOG_SENSOR("", "TOF10120", this);
LOG_UPDATE_INTERVAL(this);
LOG_I2C_DEVICE(this);
}
void TOF10120Sensor::setup() {}
void TOF10120Sensor::update() {
if (!this->write_bytes(TOF10120_DISTANCE_REGISTER, TOF10120_READ_DISTANCE_CMD, sizeof(TOF10120_READ_DISTANCE_CMD))) {
ESP_LOGE(TAG, "Communication with TOF10120 failed on write");
this->status_set_warning();
return;
}
uint8_t data[2];
if (!this->read_bytes(TOF10120_DISTANCE_REGISTER, data, 2, TOF10120_DEFAULT_DELAY)) {
ESP_LOGE(TAG, "Communication with TOF10120 failed on read");
this->status_set_warning();
return;
}
uint32_t distance_mm = (data[0] << 8) | data[1];
ESP_LOGI(TAG, "Data read: %dmm", distance_mm);
if (distance_mm == TOF10120_OUT_OF_RANGE_VALUE) {
ESP_LOGW(TAG, "Distance measurement out of range");
this->publish_state(NAN);
} else {
this->publish_state(distance_mm / 1000.0);
}
this->status_clear_warning();
}
} // namespace tof10120
} // namespace esphome