#include "CO2_Sense.h" #include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include #include "nvs_flash.h" #include "lwip/err.h" #include "lwip/sys.h" #include "esp_wifi.h" #include "esp_log.h" #include "esp_vfs_fat.h" #include "APlib.h" #include "HTTPServe.h" #include "ledController.h" #include "scd4x_i2c.h" #include "sensirion_i2c_hal.h" #include "scd4x_data.h" #define LED1_PIN CONFIG_LED_1_PIN #define LED2_PIN CONFIG_LED_2_PIN #define LED3_PIN CONFIG_LED_3_PIN #define LED_NUMBER 3 void app_main(void){ init_nvs(); nvs_handle_t nvs_handle; ESP_ERROR_CHECK(nvs_open("main", NVS_READWRITE, &nvs_handle)); // init LEDs driver led_disp_config_t* led_configs = generate_led_conf(nvs_handle,LED_NUMBER); init_led_driver(led_configs, LED_NUMBER); // init wifi AP (and nvs) wifi_config_t wifi_config = wifi_config_generator("CO2Sense","testtest",1); wifi_init_softap(wifi_config); // mount http server fat partition const esp_vfs_fat_mount_config_t mount_config = { .max_files = 10, .format_if_mount_failed = false, .allocation_unit_size = CONFIG_WL_SECTOR_SIZE }; esp_err_t err; err = esp_vfs_fat_rawflash_mount("/http", "http", &mount_config); if (err != ESP_OK) { ESP_LOGE("MAIN", "Failed to mount FATFS (%s)", esp_err_to_name(err)); return; } // start http server HTTP_serve_config_t serv_config = { .mountpoint = "/http", .getUri = "/*", .postUri = "/*", .apiUri = "/api", }; scd4x_data_t sensor_data = { .co2 = 0, .temperature = 0, .humidity = 0, }; configuration_data_t conf_data = { .measure = &sensor_data, }; ESP_ERROR_CHECK(start_server(serv_config, &conf_data)); // init scd41 sensor sensirion_i2c_hal_init(0,1); scd4x_wake_up(); scd4x_stop_periodic_measurement(); scd4x_reinit(); int16_t error = scd4x_start_periodic_measurement(); if (error) { ESP_LOGE("MAIN", "Error executing scd4x_start_periodic_measurement(): %i\n",error); } // start fetch sensor task scd4x_config_t sensor_conf = { .delay = 5, .measure = &sensor_data, }; TaskHandle_t sensor_fetch_handle; xTaskCreate(fetch_sensor_task, "FETCH_SENSOR", 4096, &sensor_conf, tskIDLE_PRIORITY, &sensor_fetch_handle); while(1){ vTaskDelay(1000 / portTICK_PERIOD_MS); ESP_LOGI("MAIN", "co2 : %u ppm, temp : %d m°C, hum : %d mRH", sensor_data.co2, sensor_data.temperature, sensor_data.humidity); update_led_status(led_configs, LED_NUMBER, sensor_data.co2); } } void fetch_sensor_task(void* pvParameters){ scd4x_config_t* conf = (scd4x_config_t*) pvParameters; scd4x_data_t* measures = conf->measure; while(1){ vTaskDelay(conf->delay * 1000 / portTICK_PERIOD_MS); int16_t error = scd4x_read_measurement(&measures->co2, &measures->temperature, &measures->humidity); if (error) ESP_LOGE("sensor fetch", "Error executing scd4x_read_measurement(): %i\n", error); } } void init_nvs(void){ esp_err_t ret = nvs_flash_init(); if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { ESP_ERROR_CHECK(nvs_flash_erase()); ret = nvs_flash_init(); } ESP_ERROR_CHECK(ret); } led_disp_config_t* generate_led_conf(nvs_handle_t nvs, unsigned int nb){ led_disp_config_t* led_configs = malloc(nb * sizeof(led_disp_config_t)); size_t conf_size = sizeof(led_disp_config_t); for(int i = 0; i < nb; i++){ char key[15]; sprintf(key, "led%i_conf", i+1); ESP_ERROR_CHECK(nvs_get_blob(nvs, key, &led_configs[i], &conf_size)); } return led_configs; }