mirror of
https://github.com/esphome/esphome.git
synced 2026-02-18 15:35:59 -07:00
Co-authored-by: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com>
102 lines
3.0 KiB
C++
102 lines
3.0 KiB
C++
#include "esphome/core/log.h"
|
|
#include "stts22h.h"
|
|
|
|
namespace esphome::stts22h {
|
|
|
|
static const char *const TAG = "stts22h";
|
|
|
|
static const uint8_t WHOAMI_REG = 0x01;
|
|
static const uint8_t CTRL_REG = 0x04;
|
|
static const uint8_t TEMPERATURE_REG = 0x06;
|
|
|
|
// CTRL_REG flags
|
|
static const uint8_t LOW_ODR_CTRL_ENABLE_FLAG = 0x80; // Flag to enable low ODR mode in CTRL_REG
|
|
static const uint8_t FREERUN_CTRL_ENABLE_FLAG = 0x04; // Flag to enable FREERUN mode in CTRL_REG
|
|
static const uint8_t ADD_INC_ENABLE_FLAG = 0x08; // Flag to enable ADD_INC (IF_ADD_INC) mode in CTRL_REG
|
|
|
|
static const uint8_t WHOAMI_STTS22H_IDENTIFICATION = 0xA0; // ID value of STTS22H in WHOAMI_REG
|
|
|
|
static const float SENSOR_SCALE = 0.01f; // Sensor resolution in degrees Celsius
|
|
|
|
void STTS22HComponent::setup() {
|
|
// Check if device is a STTS22H
|
|
if (!this->is_stts22h_sensor_()) {
|
|
this->mark_failed("Device is not a STTS22H sensor");
|
|
return;
|
|
}
|
|
|
|
this->initialize_sensor_();
|
|
}
|
|
|
|
void STTS22HComponent::update() {
|
|
if (this->is_failed()) {
|
|
return;
|
|
}
|
|
|
|
this->publish_state(this->read_temperature_());
|
|
}
|
|
|
|
void STTS22HComponent::dump_config() {
|
|
LOG_SENSOR("", "STTS22H", this);
|
|
LOG_I2C_DEVICE(this);
|
|
LOG_UPDATE_INTERVAL(this);
|
|
if (this->is_failed()) {
|
|
ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL);
|
|
}
|
|
}
|
|
|
|
float STTS22HComponent::read_temperature_() {
|
|
uint8_t temp_reg_value[2];
|
|
if (this->read_register(TEMPERATURE_REG, temp_reg_value, 2) != i2c::NO_ERROR) {
|
|
ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL);
|
|
return NAN;
|
|
}
|
|
|
|
// Combine the two bytes into a single 16-bit signed integer
|
|
// The STTS22H temperature data is in two's complement format
|
|
int16_t temp_raw_value = static_cast<int16_t>(encode_uint16(temp_reg_value[1], temp_reg_value[0]));
|
|
return temp_raw_value * SENSOR_SCALE; // Apply sensor resolution
|
|
}
|
|
|
|
bool STTS22HComponent::is_stts22h_sensor_() {
|
|
uint8_t whoami_value;
|
|
if (this->read_register(WHOAMI_REG, &whoami_value, 1) != i2c::NO_ERROR) {
|
|
this->mark_failed(ESP_LOG_MSG_COMM_FAIL);
|
|
return false;
|
|
}
|
|
|
|
if (whoami_value != WHOAMI_STTS22H_IDENTIFICATION) {
|
|
this->mark_failed("Unexpected WHOAMI identifier. Sensor is not a STTS22H");
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void STTS22HComponent::initialize_sensor_() {
|
|
// Read current CTRL_REG configuration
|
|
uint8_t ctrl_value;
|
|
if (this->read_register(CTRL_REG, &ctrl_value, 1) != i2c::NO_ERROR) {
|
|
this->mark_failed(ESP_LOG_MSG_COMM_FAIL);
|
|
return;
|
|
}
|
|
|
|
// Enable low ODR mode and enable ADD_INC
|
|
// Before low ODR mode can be used,
|
|
// FREERUN bit must be cleared (see sensor documentation)
|
|
ctrl_value &= ~FREERUN_CTRL_ENABLE_FLAG; // Clear FREERUN bit
|
|
if (this->write_register(CTRL_REG, &ctrl_value, 1) != i2c::NO_ERROR) {
|
|
this->mark_failed(ESP_LOG_MSG_COMM_FAIL);
|
|
return;
|
|
}
|
|
|
|
// Enable LOW ODR mode and ADD_INC
|
|
ctrl_value |= LOW_ODR_CTRL_ENABLE_FLAG | ADD_INC_ENABLE_FLAG; // Set LOW ODR bit and ADD_INC bit
|
|
if (this->write_register(CTRL_REG, &ctrl_value, 1) != i2c::NO_ERROR) {
|
|
this->mark_failed(ESP_LOG_MSG_COMM_FAIL);
|
|
return;
|
|
}
|
|
}
|
|
|
|
} // namespace esphome::stts22h
|