// Implementation based on: // - ESPEasy: https://github.com/letscontrolit/ESPEasy/blob/mega/src/_P034_DHT12.ino // - DHT12_sensor_library: https://github.com/xreef/DHT12_sensor_library/blob/master/DHT12.cpp #include "dht12.h" #include "esphome/core/log.h" namespace esphome { namespace dht12 { static const char *const TAG = "dht12"; void DHT12Component::update() { uint8_t data[5]; if (!this->read_data_(data)) { this->status_set_warning(); return; } const uint16_t raw_temperature = uint16_t(data[2]) * 10 + (data[3] & 0x7F); float temperature = raw_temperature / 10.0f; if ((data[3] & 0x80) != 0) { // negative temperature *= -1; } const uint16_t raw_humidity = uint16_t(data[0]) * 10 + data[1]; float humidity = raw_humidity / 10.0f; ESP_LOGD(TAG, "Got temperature=%.2f°C humidity=%.2f%%", temperature, humidity); if (this->temperature_sensor_ != nullptr) this->temperature_sensor_->publish_state(temperature); if (this->humidity_sensor_ != nullptr) this->humidity_sensor_->publish_state(humidity); this->status_clear_warning(); } void DHT12Component::setup() { ESP_LOGCONFIG(TAG, "Running setup"); uint8_t data[5]; if (!this->read_data_(data)) { this->mark_failed(); return; } } void DHT12Component::dump_config() { ESP_LOGD(TAG, "DHT12:"); LOG_I2C_DEVICE(this); if (this->is_failed()) { ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL); } LOG_SENSOR(" ", "Temperature", this->temperature_sensor_); LOG_SENSOR(" ", "Humidity", this->humidity_sensor_); } float DHT12Component::get_setup_priority() const { return setup_priority::DATA; } bool DHT12Component::read_data_(uint8_t *data) { if (!this->read_bytes(0, data, 5)) { ESP_LOGW(TAG, "Updating DHT12 failed!"); return false; } uint8_t checksum = data[0] + data[1] + data[2] + data[3]; if (data[4] != checksum) { ESP_LOGW(TAG, "DHT12 Checksum invalid!"); return false; } return true; } } // namespace dht12 } // namespace esphome