diff --git a/components/dht22/dht22.c b/components/dht22/dht22.c index 2e3dedd..30a25f4 100644 --- a/components/dht22/dht22.c +++ b/components/dht22/dht22.c @@ -56,7 +56,7 @@ uint32_t wait_for_signal_to_change_from(int signal_level) { } dht22_error dht22_read() { - uint8_t data[5] = {0}; + uint8_t data[5] = {0, 0, 0, 0, 0}; uint32_t elapsed_time; /* @@ -102,8 +102,12 @@ dht22_error dht22_read() { * - if 70us -> 1 bit */ //portENABLE_INTERRUPTS(); - for (int byte_i = 0; byte_i <= 4; byte_i++) { - for (int bit_i = 7; bit_i >= 0; bit_i--) { + uint8_t byte_i = 0; + uint8_t bit_i = 7; + for (int i = 0; i < 40; i++) { + + //for (int byte_i = 0; byte_i <= 4; byte_i++) { + // for (int bit_i = 7; bit_i >= 0; bit_i--) { elapsed_time = wait_for_signal_to_change_from(0); if (elapsed_time == DHT22_TIMEOUT_ERROR) { @@ -116,18 +120,46 @@ dht22_error dht22_read() { elapsed_time = wait_for_signal_to_change_from(1); if (elapsed_time < 60 || elapsed_time > 80) { data[byte_i] |= (1 << bit_i); + // TODO: check why this doesn't work + //data[i / 8] |= (1 << (7 - (i % 8)); } //ESP_LOGE(TAG, "bit: %i, byte: %i, elapsed_time: %lu", bit_i, byte_i, elapsed_time); - } + //} + ///* + if (bit_i == 0) { + bit_i = 7; + byte_i++; + } else { + bit_i--; + } } + portENABLE_INTERRUPTS(); + + ESP_LOGE(TAG, "data[0-4]: %x %x %x %x %x", data[0], data[1], data[2], data[3], data[4]); // TODO test that data[x] << 8 will be promoted to 16bits otherwise I'm // shifting them to just zeros _dht22_relative_humidity = (data[0] << 8) | data[1]; _dht22_temperature = ((data[2] & 0x7f) << 8) | data[3]; + + float relative_humidity = data[0]; + relative_humidity *= 0x100; + relative_humidity += data[1]; + relative_humidity /= 10; + + float temp = data[2] & 0x7f; + temp *= 0x100; + temp += data[3]; + temp /= 10; + if (data[2] & 0x80) { + temp *= -1; + } + + ESP_LOGE(TAG, "rh: %f, temp: %f", relative_humidity, temp); if (data[2] & 0x80) { _dht22_temperature = -1 * _dht22_temperature; } + ESP_LOGE(TAG, "rh: %i, temp: %i", _dht22_relative_humidity / 10, _dht22_temperature / 10); uint8_t checksum_val = (data[0] + data[1] + data[2] + data[3]) & 0xff; if (checksum_val != data[4]) { _dht22_relative_humidity = UINT16_MAX;