8 static const char *
const TAG =
"dht";
11 ESP_LOGCONFIG(TAG,
"Setting up DHT...");
17 ESP_LOGCONFIG(TAG,
"DHT:");
18 LOG_PIN(
" Pin: ", this->
pin_);
22 ESP_LOGCONFIG(TAG,
" Model: DHT11");
24 ESP_LOGCONFIG(TAG,
" Model: DHT22 (or equivalent)");
27 LOG_UPDATE_INTERVAL(
this);
38 success = this->
read_sensor_(&temperature, &humidity,
false);
44 success = this->
read_sensor_(&temperature, &humidity,
true);
48 ESP_LOGD(TAG,
"Got Temperature=%.1f°C Humidity=%.1f%%", temperature, humidity);
58 str =
" and consider manually specifying the DHT model using the model option";
60 ESP_LOGW(TAG,
"Invalid readings! Please check your wiring (pull-up resistor, pin number)%s.", str);
80 uint8_t data[5] = {0, 0, 0, 0, 0};
111 for (i = -1; i < 40; i++) {
112 uint32_t start_time =
micros();
116 if (
micros() - start_time > 90) {
129 uint32_t end_time = start_time;
133 if ((end_time =
micros()) - start_time > 90) {
148 if (end_time - start_time >= 40) {
149 data[byte] |= 1 << bit;
158 if (!report_errors && error_code != 0)
161 switch (error_code) {
163 ESP_LOGW(TAG,
"Waiting for DHT communication to clear failed!");
166 ESP_LOGW(TAG,
"Rising edge for bit %d failed!", i);
169 ESP_LOGW(TAG,
"Requesting data from DHT failed!");
172 ESP_LOGW(TAG,
"Falling edge for bit %d failed!", i);
180 "Data: Hum=0b" BYTE_TO_BINARY_PATTERN BYTE_TO_BINARY_PATTERN
181 ", Temp=0b" BYTE_TO_BINARY_PATTERN BYTE_TO_BINARY_PATTERN
", Checksum=0b" BYTE_TO_BINARY_PATTERN,
182 BYTE_TO_BINARY(data[0]), BYTE_TO_BINARY(data[1]), BYTE_TO_BINARY(data[2]), BYTE_TO_BINARY(data[3]),
183 BYTE_TO_BINARY(data[4]));
185 uint8_t checksum_a = data[0] + data[1] + data[2] + data[3];
190 if (checksum_a != data[4] && checksum_b != data[4]) {
192 ESP_LOGW(TAG,
"Checksum invalid: %u!=%u", checksum_a, data[4]);
198 if (checksum_a == data[4]) {
201 const uint16_t raw_temperature = uint16_t(data[2]) * 10 + (data[3] & 0x7F);
202 *temperature = raw_temperature / 10.0f;
203 if ((data[3] & 0x80) != 0) {
208 const uint16_t raw_humidity = uint16_t(data[0]) * 10 + data[1];
209 *humidity = raw_humidity / 10.0f;
213 *temperature = data[2];
217 uint16_t raw_humidity = (uint16_t(data[0] & 0xFF) << 8) | (data[1] & 0xFF);
218 uint16_t raw_temperature = (uint16_t(data[2] & 0xFF) << 8) | (data[3] & 0xFF);
220 if (raw_temperature & 0x8000) {
221 if (!(raw_temperature & 0x4000))
222 raw_temperature = ~(raw_temperature & 0x7FFF);
223 }
else if (raw_temperature & 0x800) {
224 raw_temperature |= 0xf000;
227 if (raw_temperature == 1 && raw_humidity == 10) {
229 ESP_LOGW(TAG,
"Invalid temperature+humidity! Sensor reported 1°C and 1%% Hum");
234 *humidity = raw_humidity * 0.1f;
237 *temperature = int16_t(raw_temperature) * 0.1f;
240 if (*temperature == 0.0f && (*humidity == 1.0f || *humidity == 2.0f)) {
242 ESP_LOGW(TAG,
"DHT reports invalid data. Is the update interval too high or the sensor damaged?");
virtual void digital_write(bool value)=0
sensor::Sensor * temperature_sensor_
const float DATA
For components that import data from directly connected sensors like DHT.
void set_dht_model(DHTModel model)
Manually select the DHT model.
void status_set_warning(const char *message="unspecified")
sensor::Sensor * humidity_sensor_
virtual void pin_mode(gpio::Flags flags)=0
uint32_t IRAM_ATTR HOT micros()
float get_setup_priority() const override
HARDWARE_LATE setup priority.
void dump_config() override
void status_clear_warning()
void publish_state(float state)
Publish a new state to the front-end.
bool read_sensor_(float *temperature, float *humidity, bool report_errors)
virtual bool digital_read()=0
void setup() override
Set up the pins and check connection.
void update() override
Update sensor values and push them to the frontend.
Helper class to disable interrupts.
This is a workaround until we can figure out a way to get the tflite-micro idf component code availab...
void IRAM_ATTR HOT delayMicroseconds(uint32_t us)