Skip to content

Commit

Permalink
Sensor calibration with temperature offset and altitude, externalized…
Browse files Browse the repository at this point in the history
… as esp32-scd4x library, OTA config ssl certificate
  • Loading branch information
ma-lwa-re committed Jul 23, 2022
1 parent 2d68ae0 commit a28625a
Show file tree
Hide file tree
Showing 8 changed files with 158 additions and 162 deletions.
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "lib/esp32-scd4x"]
path = lib/esp32-scd4x
url = https://github.com/ma-lwa-re/esp32-scd4x
18 changes: 14 additions & 4 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,28 @@ set(SENSORS ON)
# OPTIONAL: Set the temperature scale (C | F | K)
set(SENSORS_SCALE "C")

# OPTIONAL: Set the temperature offset in celcius
set(SENSORS_TEMPERATURE_OFFSET 4.0)

# OPTIONAL: Set the sensor altitude in meters
set(SENSORS_SENSOR_ALTITUDE 0)

# OPTIONAL: Enable Over The Air (OTA) updates (ON | OFF)
set(OTA_UPDATES ON)

# OPTIONAL: Set the project version
set(PROJECT_VER "2.4.0.2")
set(PROJECT_VER "2.4.0.3")

# Include Sensirion SCD4x sensors lib
include_directories(esp32-scd4x)
set(EXTRA_COMPONENT_DIRS ${EXTRA_COMPONENT_DIRS} ${CMAKE_CURRENT_LIST_DIR}/lib/esp32-scd4x/)

if(HOME_AUTOMATION STREQUAL "HOMEKIT")
set(EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/../esp-apple-homekit-adk/)
set(EXTRA_COMPONENT_DIRS ${EXTRA_COMPONENT_DIRS} $ENV{IDF_PATH}/../esp-apple-homekit-adk/)
elseif(HOME_AUTOMATION STREQUAL "NEST")
set(EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/../esp-google-iot/)
set(EXTRA_COMPONENT_DIRS ${EXTRA_COMPONENT_DIRS} $ENV{IDF_PATH}/../esp-google-iot/)
elseif(HOME_AUTOMATION STREQUAL "ALEXA")
set(EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/../esp-aws-iot/)
set(EXTRA_COMPONENT_DIRS ${EXTRA_COMPONENT_DIRS} $ENV{IDF_PATH}/../esp-aws-iot/)
endif()

include($ENV{IDF_PATH}/tools/cmake/project.cmake)
Expand Down
10 changes: 10 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,16 @@ dreamdesk
├── CMakeLists.txt
├── LICENSE
├── README.md
├── lib
│   └── esp32-scd4x
│   ├── CMakeLists.txt
│   ├── LICENSE
│   ├── README.md
│   ├── images
│   │   └── SCD4x.png
│   ├── main.c
│   ├── scd4x.c
│   └── scd4x.h
├── main
│   ├── CMakeLists.txt
│   ├── dreamdesk.c
Expand Down
1 change: 1 addition & 0 deletions lib/esp32-scd4x
Submodule esp32-scd4x added at 3a1f49
5 changes: 3 additions & 2 deletions main/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ endif()

if(SENSORS)
set(INCLUDE_SENSORS ./sensors.c)
add_definitions(-DSENSORS_SCALE_${SENSORS_SCALE})
add_definitions(-DSENSORS_SCALE_${SENSORS_SCALE} -DSENSORS_TEMPERATURE_OFFSET=${SENSORS_TEMPERATURE_OFFSET}
-DSENSORS_SENSOR_ALTITUDE=${SENSORS_SENSOR_ALTITUDE})
endif()

if(OTA_UPDATES)
Expand All @@ -33,4 +34,4 @@ idf_component_register(SRCS ./main.c ./dreamdesk.c ./lin.c ${INCLUDE_DESK} ${INC
${INCLUDE_HOME} ${INCLUDE_SENSORS} ${INCLUDE_OTA_UPDATES} INCLUDE_DIRS ".")

add_definitions(-DPROJECT_NAME="${CMAKE_PROJECT_NAME}" -DPROJECT_VER="${PROJECT_VER}" -D${DESK_TYPE}
-DWIFI_${WIFI} -D${HOME_AUTOMATION} -DSENSORS_${SENSORS} -DOTA_UPDATES_${OTA_UPDATES})
-D${HOME_AUTOMATION} -DSENSORS_${SENSORS} -DOTA_UPDATES_${OTA_UPDATES} -DWIFI_${WIFI})
94 changes: 46 additions & 48 deletions main/ota.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,51 +25,6 @@

static const char *OTA_TAG = "ota_updates";

/*
* Certificate:
* Data:
* Version: 3 (0x2)
* Serial Number:
* 82:10:cf:b0:d2:40:e3:59:44:63:e0:bb:63:82:8b:00
* Signature Algorithm: sha256WithRSAEncryption
* Issuer: C = US, O = Internet Security Research Group, CN = ISRG Root X1
* Validity
* Not Before: Jun 4 11:04:38 2015 GMT
* Not After : Jun 4 11:04:38 2035 GMT
* Subject: C = US, O = Internet Security Research Group, CN = ISRG Root X1
*/
const char *LETS_ENCRYPT_X1_ROOT_CA = "-----BEGIN CERTIFICATE-----\n"
"MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\n"
"TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\n"
"cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\n"
"WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\n"
"ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\n"
"MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\n"
"h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\n"
"0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\n"
"A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\n"
"T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\n"
"B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\n"
"B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\n"
"KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\n"
"OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\n"
"jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\n"
"qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\n"
"rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\n"
"HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\n"
"hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\n"
"ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\n"
"3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\n"
"NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\n"
"ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\n"
"TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\n"
"jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\n"
"oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\n"
"4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\n"
"mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\n"
"emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=\n"
"-----END CERTIFICATE-----";

void print_app_desc(esp_app_desc_t app_desc, char *app, esp_log_level_t log_level) {
ESP_LOG_LEVEL(log_level, OTA_TAG, "%s firmware project: %s", app, app_desc.project_name);
ESP_LOG_LEVEL(log_level, OTA_TAG, "%s firmware version: %s", app, app_desc.version);
Expand All @@ -78,14 +33,57 @@ void print_app_desc(esp_app_desc_t app_desc, char *app, esp_log_level_t log_leve
}

esp_err_t validate_image_header(esp_https_ota_handle_t *https_ota_handle) {
esp_http_client_config_t config = {
esp_http_client_config_t ota_client_config = {
.url = OTA_UPDATE_URL,
.cert_pem = LETS_ENCRYPT_X1_ROOT_CA,
/*
* Certificate:
* Data:
* Version: 3 (0x2)
* Serial Number:
* 82:10:cf:b0:d2:40:e3:59:44:63:e0:bb:63:82:8b:00
* Signature Algorithm: sha256WithRSAEncryption
* Issuer: C = US, O = Internet Security Research Group, CN = ISRG Root X1
* Validity
* Not Before: Jun 4 11:04:38 2015 GMT
* Not After : Jun 4 11:04:38 2035 GMT
* Subject: C = US, O = Internet Security Research Group, CN = ISRG Root X1
*/
.cert_pem = "-----BEGIN CERTIFICATE-----\n"
"MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\n"
"TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\n"
"cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\n"
"WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\n"
"ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\n"
"MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\n"
"h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\n"
"0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\n"
"A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\n"
"T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\n"
"B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\n"
"B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\n"
"KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\n"
"OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\n"
"jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\n"
"qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\n"
"rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\n"
"HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\n"
"hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\n"
"ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\n"
"3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\n"
"NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\n"
"ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\n"
"TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\n"
"jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\n"
"oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\n"
"4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\n"
"mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\n"
"emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=\n"
"-----END CERTIFICATE-----",
.user_agent = OTA_UPDATE_USER_AGENT
};

esp_https_ota_config_t ota_config = {
.http_config = &config
.http_config = &ota_client_config
};

const esp_partition_t *running_partition = esp_ota_get_running_partition();
Expand Down
152 changes: 75 additions & 77 deletions main/sensors.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,9 @@
* SOFTWARE.
*/
#include "sensors.h"
#include "driver/i2c.h"
#include "esp_log.h"
#include "scd4x.h"
#include "driver/i2c.h"

static const char *SENSORS_TAG = "sensors";

Expand All @@ -33,10 +34,6 @@ float co2_level = 0.0;
float co2_peak_level = 0.0;
enum air_quality_t air_quality = UNKNOWN;

uint8_t scd41_start_periodic_measurement[] = {0x21, 0xB1};
uint8_t scd41_read_measurement[] = {0xEC, 0x05};
uint8_t scd41_stop_periodic_measurement[] = {0x3F, 0x86};

char get_temperature_scale() {
return scale;
}
Expand Down Expand Up @@ -81,55 +78,6 @@ void set_air_quality(float co2_level) {
}
}

void start_periodic_measurement() {
i2c_cmd_handle_t cmd = i2c_cmd_link_create();

i2c_master_start(cmd);
i2c_master_write_byte(cmd, (SCD41_SENSOR_ADDR << 1) | I2C_MASTER_WRITE, I2C_ACK_CHECK_EN);

i2c_master_write(cmd, scd41_start_periodic_measurement, sizeof(scd41_start_periodic_measurement), I2C_ACK_CHECK_EN);

i2c_master_stop(cmd);
i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);

i2c_cmd_link_delete(cmd);
}

void read_measurement(uint8_t *measurements, uint8_t size) {
i2c_cmd_handle_t cmd = i2c_cmd_link_create();

i2c_master_start(cmd);
i2c_master_write_byte(cmd, (SCD41_SENSOR_ADDR << 1) | I2C_MASTER_WRITE, I2C_ACK_CHECK_EN);

i2c_master_write(cmd, scd41_read_measurement, sizeof(scd41_read_measurement), I2C_ACK_CHECK_EN);

i2c_master_start(cmd);

i2c_master_write_byte(cmd, ( SCD41_SENSOR_ADDR << 1 ) | I2C_MASTER_READ, I2C_ACK_CHECK_EN);

i2c_master_read(cmd, measurements, size - 1, I2C_ACK_VAL);
i2c_master_read_byte(cmd, measurements + size - 1, I2C_NACK_VAL);

i2c_master_stop(cmd);
i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);

i2c_cmd_link_delete(cmd);
}

void stop_periodic_measurement() {
i2c_cmd_handle_t cmd = i2c_cmd_link_create();

i2c_master_start(cmd);
i2c_master_write_byte(cmd, (SCD41_SENSOR_ADDR << 1) | I2C_MASTER_WRITE, I2C_ACK_CHECK_EN);

i2c_master_write(cmd, scd41_stop_periodic_measurement, sizeof(scd41_stop_periodic_measurement), I2C_ACK_CHECK_EN);

i2c_master_stop(cmd);
i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);

i2c_cmd_link_delete(cmd);
}

void sensors_task(void *arg) {
i2c_config_t i2c_config = {
.mode = I2C_MODE_MASTER,
Expand All @@ -141,8 +89,9 @@ void sensors_task(void *arg) {
};

ESP_ERROR_CHECK(i2c_param_config(I2C_MASTER_NUM, &i2c_config));
ESP_ERROR_CHECK(i2c_driver_install(I2C_MASTER_NUM, i2c_config.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0));

ESP_ERROR_CHECK(i2c_driver_install(I2C_MASTER_NUM, i2c_config.mode,
I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0));

esp_log_level_set(SENSORS_TAG, ESP_LOG_INFO);

#if defined(SENSORS_SCALE_F)
Expand All @@ -151,36 +100,85 @@ void sensors_task(void *arg) {
scale = SCALE_KELVIN;
#endif

for(;;) {
measurements_t measurements = {
.co2 = {0x00, 0x00},
.co2_crc = 0x00,
.temperature = {0x00, 0x00},
.temperature_crc = 0x00,
.humidity = {0x00, 0x00},
.humidity_crc = 0x00
};
vTaskDelay(INIT_DELAY / portTICK_PERIOD_MS);
ESP_LOGI(SENSORS_TAG, "Sensor serial number 0x%012llX", get_serial_number());

vTaskDelay(INIT_DELAY / portTICK_PERIOD_MS);
float temperature_offset = get_temperature_offset();

vTaskDelay(INIT_DELAY / portTICK_PERIOD_MS);
uint16_t sensor_altitude = get_sensor_altitude();

if(temperature_offset != SCD41_READ_ERROR && sensor_altitude != SCD41_READ_ERROR) {

if(temperature_offset != TEMPERATURE_OFFSET) {
ESP_LOGW(SENSORS_TAG, "Temperature offset calibration from %.1f °%c to %.1f °%c",
temperature_offset, scale, TEMPERATURE_OFFSET, scale);

vTaskDelay(INIT_DELAY / portTICK_PERIOD_MS);
ESP_ERROR_CHECK_WITHOUT_ABORT(set_temperature_offset(TEMPERATURE_OFFSET));

vTaskDelay(INIT_DELAY / portTICK_PERIOD_MS);
ESP_ERROR_CHECK_WITHOUT_ABORT(persist_settings());

vTaskDelay(INIT_DELAY / portTICK_PERIOD_MS);
temperature_offset = get_temperature_offset();
}

if(sensor_altitude != SENSOR_ALTITUDE) {
ESP_LOGW(SENSORS_TAG, "Sensor altitude calibration from %d m to %d m",
sensor_altitude, SENSOR_ALTITUDE);

vTaskDelay(INIT_DELAY / portTICK_PERIOD_MS);
ESP_ERROR_CHECK_WITHOUT_ABORT(set_sensor_altitude(SENSOR_ALTITUDE));

vTaskDelay(INIT_DELAY / portTICK_PERIOD_MS);
ESP_ERROR_CHECK_WITHOUT_ABORT(persist_settings());

vTaskDelay(INIT_DELAY / portTICK_PERIOD_MS);
sensor_altitude = get_sensor_altitude();
}
ESP_LOGI(SENSORS_TAG, "Temperature offset %.1f °%c - Sensor altitude %d %s",
temperature_offset, scale, sensor_altitude, scale == SCALE_CELCIUS ? "m" : "ft");
} else {
ESP_LOGE(SENSORS_TAG, "Sensor offset/altitude read error!");
}

vTaskDelay(INIT_DELAY / portTICK_PERIOD_MS);

for(;;) {
start_periodic_measurement();

uint16_t average_co2_level = 0.0;
float average_temperature = 0.0;
float average_humidity = 0.0;
float average_co2_level = 0.0;

for(uint8_t i = 0; i < MEASUREMENT_COUNT; i++) {
vTaskDelay(UPDATE_INTERVAL / portTICK_PERIOD_MS);
for(uint8_t i = 0; i < MEASUREMENT_COUNT + 2; i++) {
sensors_values_t sensors_values = {
.co2 = 0x00,
.temperature = 0x00,
.humidity = 0x00
};
vTaskDelay(UPDATE_DELAY / portTICK_PERIOD_MS);

read_measurement((uint8_t*) &measurements, sizeof(measurements));
if(read_measurement(&sensors_values) != ESP_OK) {
ESP_LOGE(SENSORS_TAG, "Sensors read measurement error!");
break;
}

// Discard the first two sensor read outputs
if(i < 2) {
continue;
}

average_co2_level += (measurements.co2.high << 8) + measurements.co2.low;
average_temperature += (175 * (((measurements.temperature.high << 8) + measurements.temperature.low) / 65536.0)) - 45.0;
average_humidity += 100 * ((measurements.humidity.high << 8) + measurements.humidity.low) / 65536.0;
ESP_LOGD(SENSORS_TAG, "CO₂ %4d ppm - Temperature %2.1f °%c - Humidity %2.1f%%",
sensors_values.co2, sensors_values.temperature, scale, sensors_values.humidity);

ESP_LOG_BUFFER_HEX_LEVEL(SENSORS_TAG, &measurements, sizeof(measurements), ESP_LOG_DEBUG);
average_co2_level += sensors_values.co2;
average_temperature += sensors_values.temperature;
average_humidity += sensors_values.humidity;

if(average_co2_level == 0x0000) {
break;
}
ESP_LOG_BUFFER_HEX_LEVEL(SENSORS_TAG, &sensors_values, sizeof(sensors_values), ESP_LOG_DEBUG);
}

temperature = (average_temperature / MEASUREMENT_COUNT);
Expand Down Expand Up @@ -210,6 +208,6 @@ void sensors_task(void *arg) {
ESP_LOG_LEVEL(air_quality_level, SENSORS_TAG, "CO₂ %4.0f ppm - Temperature %2.1f °%c - Humidity %2.1f%%",
co2_level, temperature, scale, humidity);
}
vTaskDelay(SLEEP_INTERVAL_15_MIN / portTICK_PERIOD_MS);
vTaskDelay(SLEEP_DELAY / portTICK_PERIOD_MS);
}
}
Loading

0 comments on commit a28625a

Please sign in to comment.