81 uint8_t data[5] = {0, 0, 0, 0, 0};
117 for (i = -1; i < 40; i++) {
118 uint32_t start_time =
micros();
122 if (
micros() - start_time > 90) {
135 uint32_t end_time = start_time;
140 if (end_time - start_time > 90) {
155 if (end_time - start_time >= 40) {
156 data[byte] |= 1 << bit;
166 if (!report_errors && error_code != 0)
169 switch (error_code) {
171 ESP_LOGW(TAG,
"Waiting for DHT communication to clear failed!");
174 ESP_LOGW(TAG,
"Rising edge for bit %d failed!", i);
177 ESP_LOGW(TAG,
"Requesting data from DHT failed!");
180 ESP_LOGW(TAG,
"Falling edge for bit %d failed!", i);
188 "Data: Hum=0b" BYTE_TO_BINARY_PATTERN BYTE_TO_BINARY_PATTERN
189 ", Temp=0b" BYTE_TO_BINARY_PATTERN BYTE_TO_BINARY_PATTERN
", Checksum=0b" BYTE_TO_BINARY_PATTERN,
190 BYTE_TO_BINARY(data[0]), BYTE_TO_BINARY(data[1]), BYTE_TO_BINARY(data[2]), BYTE_TO_BINARY(data[3]),
191 BYTE_TO_BINARY(data[4]));
193 uint8_t checksum_a = data[0] + data[1] + data[2] + data[3];
198 if (checksum_a != data[4] && checksum_b != data[4]) {
200 ESP_LOGW(TAG,
"Checksum invalid: %u!=%u", checksum_a, data[4]);
206 if (checksum_a == data[4]) {
209 const uint16_t raw_temperature = uint16_t(data[2]) * 10 + (data[3] & 0x7F);
211 if ((data[3] & 0x80) != 0) {
216 const uint16_t raw_humidity = uint16_t(data[0]) * 10 + data[1];
217 *humidity = raw_humidity / 10.0f;
225 uint16_t raw_humidity = (uint16_t(data[0] & 0xFF) << 8) | (data[1] & 0xFF);
226 uint16_t raw_temperature = (uint16_t(data[2] & 0xFF) << 8) | (data[3] & 0xFF);
228 if (raw_temperature & 0x8000) {
229 if (!(raw_temperature & 0x4000))
230 raw_temperature = ~(raw_temperature & 0x7FFF);
231 }
else if (raw_temperature & 0x800) {
232 raw_temperature |= 0xf000;
235 if (raw_temperature == 1 && raw_humidity == 10) {
237 ESP_LOGW(TAG,
"Invalid temperature+humidity! Sensor reported 1°C and 1%% Hum");
242 *humidity = raw_humidity * 0.1f;
248 if (*
temperature == 0.0f && (*humidity == 1.0f || *humidity == 2.0f)) {
250 ESP_LOGW(TAG,
"DHT reports invalid data. Is the update interval too high or the sensor damaged?");