74 uint8_t data[5] = {0, 0, 0, 0, 0};
110 for (i = -1; i < 40; i++) {
111 uint32_t start_time =
micros();
115 if (
micros() - start_time > 90) {
128 uint32_t end_time = start_time;
133 if (end_time - start_time > 90) {
148 if (end_time - start_time >= 40) {
149 data[byte] |= 1 << bit;
159 if (!report_errors && error_code != 0)
163 ESP_LOGW(TAG, ESP_LOG_MSG_COMM_FAIL);
168 "Data: Hum=0b" BYTE_TO_BINARY_PATTERN BYTE_TO_BINARY_PATTERN
169 ", Temp=0b" BYTE_TO_BINARY_PATTERN BYTE_TO_BINARY_PATTERN
", Checksum=0b" BYTE_TO_BINARY_PATTERN,
170 BYTE_TO_BINARY(data[0]), BYTE_TO_BINARY(data[1]), BYTE_TO_BINARY(data[2]), BYTE_TO_BINARY(data[3]),
171 BYTE_TO_BINARY(data[4]));
173 uint8_t checksum_a = data[0] + data[1] + data[2] + data[3];
178 if (checksum_a != data[4] && checksum_b != data[4]) {
180 ESP_LOGW(TAG,
"Checksum invalid: %u!=%u", checksum_a, data[4]);
186 if (checksum_a == data[4]) {
189 const uint16_t raw_temperature =
static_cast<uint16_t
>(data[2]) * 10 + (data[3] & 0x7F);
190 *
temperature =
static_cast<float>(raw_temperature) / 10.0f;
191 if ((data[3] & 0x80) != 0) {
196 const uint16_t raw_humidity =
static_cast<uint16_t
>(data[0]) * 10 + data[1];
197 *humidity =
static_cast<float>(raw_humidity) / 10.0f;
208 if (raw_temperature & 0x8000) {
209 if (!(raw_temperature & 0x4000))
210 raw_temperature = ~(raw_temperature & 0x7FFF);
211 }
else if (raw_temperature & 0x800) {
212 raw_temperature |= 0xf000;
215 if (raw_temperature == 1 && raw_humidity == 10) {
217 ESP_LOGW(TAG,
"Invalid data");
222 *humidity =
static_cast<float>(raw_humidity) * 0.1f;
223 if (*humidity > 100.0f)
225 *
temperature =
static_cast<int16_t
>(raw_temperature) * 0.1f;
228 if (*
temperature == 0.0f && (*humidity == 1.0f || *humidity == 2.0f)) {
230 ESP_LOGW(TAG,
"Invalid data");