mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	Fix SHTC3 sensor detection (#3365)
Co-authored-by: Samuel Sieb <samuel@sieb.net>
This commit is contained in:
		| @@ -35,15 +35,17 @@ void SHTCXComponent::setup() { | |||||||
|     return; |     return; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   uint16_t device_id_register[1]; |   uint16_t device_id_register; | ||||||
|   if (!this->read_data_(device_id_register, 1)) { |   if (!this->read_data_(&device_id_register, 1)) { | ||||||
|     ESP_LOGE(TAG, "Error reading Device ID"); |     ESP_LOGE(TAG, "Error reading Device ID"); | ||||||
|     this->mark_failed(); |     this->mark_failed(); | ||||||
|     return; |     return; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   if (((device_id_register[0] << 2) & 0x1C) == 0x1C) { |   this->sensor_id_ = device_id_register; | ||||||
|     if ((device_id_register[0] & 0x847) == 0x847) { |  | ||||||
|  |   if ((device_id_register & 0x3F) == 0x07) { | ||||||
|  |     if (device_id_register & 0x800) { | ||||||
|       this->type_ = SHTCX_TYPE_SHTC3; |       this->type_ = SHTCX_TYPE_SHTC3; | ||||||
|     } else { |     } else { | ||||||
|       this->type_ = SHTCX_TYPE_SHTC1; |       this->type_ = SHTCX_TYPE_SHTC1; | ||||||
| @@ -51,11 +53,11 @@ void SHTCXComponent::setup() { | |||||||
|   } else { |   } else { | ||||||
|     this->type_ = SHTCX_TYPE_UNKNOWN; |     this->type_ = SHTCX_TYPE_UNKNOWN; | ||||||
|   } |   } | ||||||
|   ESP_LOGCONFIG(TAG, "  Device identified: %s", to_string(this->type_)); |   ESP_LOGCONFIG(TAG, "  Device identified: %s (%04x)", to_string(this->type_), device_id_register); | ||||||
| } | } | ||||||
| void SHTCXComponent::dump_config() { | void SHTCXComponent::dump_config() { | ||||||
|   ESP_LOGCONFIG(TAG, "SHTCx:"); |   ESP_LOGCONFIG(TAG, "SHTCx:"); | ||||||
|   ESP_LOGCONFIG(TAG, "  Model: %s", to_string(this->type_)); |   ESP_LOGCONFIG(TAG, "  Model: %s (%04x)", to_string(this->type_), this->sensor_id_); | ||||||
|   LOG_I2C_DEVICE(this); |   LOG_I2C_DEVICE(this); | ||||||
|   if (this->is_failed()) { |   if (this->is_failed()) { | ||||||
|     ESP_LOGE(TAG, "Communication with SHTCx failed!"); |     ESP_LOGE(TAG, "Communication with SHTCx failed!"); | ||||||
| @@ -75,21 +77,28 @@ void SHTCXComponent::update() { | |||||||
|     this->wake_up(); |     this->wake_up(); | ||||||
|   } |   } | ||||||
|   if (!this->write_command_(SHTCX_COMMAND_POLLING_H)) { |   if (!this->write_command_(SHTCX_COMMAND_POLLING_H)) { | ||||||
|  |     ESP_LOGE(TAG, "sensor polling failed"); | ||||||
|  |     if (this->temperature_sensor_ != nullptr) | ||||||
|  |       this->temperature_sensor_->publish_state(NAN); | ||||||
|  |     if (this->humidity_sensor_ != nullptr) | ||||||
|  |       this->humidity_sensor_->publish_state(NAN); | ||||||
|     this->status_set_warning(); |     this->status_set_warning(); | ||||||
|     return; |     return; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   this->set_timeout(50, [this]() { |   this->set_timeout(50, [this]() { | ||||||
|  |     float temperature = NAN; | ||||||
|  |     float humidity = NAN; | ||||||
|     uint16_t raw_data[2]; |     uint16_t raw_data[2]; | ||||||
|     if (!this->read_data_(raw_data, 2)) { |     if (!this->read_data_(raw_data, 2)) { | ||||||
|  |       ESP_LOGE(TAG, "sensor read failed"); | ||||||
|       this->status_set_warning(); |       this->status_set_warning(); | ||||||
|       return; |     } else { | ||||||
|  |       temperature = 175.0f * float(raw_data[0]) / 65536.0f - 45.0f; | ||||||
|  |       humidity = 100.0f * float(raw_data[1]) / 65536.0f; | ||||||
|  |  | ||||||
|  |       ESP_LOGD(TAG, "Got temperature=%.2f°C humidity=%.2f%%", temperature, humidity); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     float temperature = 175.0f * float(raw_data[0]) / 65536.0f - 45.0f; |  | ||||||
|     float humidity = 100.0f * float(raw_data[1]) / 65536.0f; |  | ||||||
|  |  | ||||||
|     ESP_LOGD(TAG, "Got temperature=%.2f°C humidity=%.2f%%", temperature, humidity); |  | ||||||
|     if (this->temperature_sensor_ != nullptr) |     if (this->temperature_sensor_ != nullptr) | ||||||
|       this->temperature_sensor_->publish_state(temperature); |       this->temperature_sensor_->publish_state(temperature); | ||||||
|     if (this->humidity_sensor_ != nullptr) |     if (this->humidity_sensor_ != nullptr) | ||||||
|   | |||||||
| @@ -27,6 +27,7 @@ class SHTCXComponent : public PollingComponent, public i2c::I2CDevice { | |||||||
|   bool write_command_(uint16_t command); |   bool write_command_(uint16_t command); | ||||||
|   bool read_data_(uint16_t *data, uint8_t len); |   bool read_data_(uint16_t *data, uint8_t len); | ||||||
|   SHTCXType type_; |   SHTCXType type_; | ||||||
|  |   uint16_t sensor_id_; | ||||||
|   sensor::Sensor *temperature_sensor_; |   sensor::Sensor *temperature_sensor_; | ||||||
|   sensor::Sensor *humidity_sensor_; |   sensor::Sensor *humidity_sensor_; | ||||||
| }; | }; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user