co2-firmware/main/CO2_Sense.c
2022-03-23 22:20:15 +01:00

131 lines
3.3 KiB
C

#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include <stdio.h>
#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"
struct fetch_sensor_config {
uint16_t delay;
uint16_t co2;
int32_t temperature;
int32_t humidity;
};
typedef struct fetch_sensor_config fetch_sensor_config_t;
void fetch_sensor_task(void* pvParameters){
fetch_sensor_config_t* conf = (fetch_sensor_config_t*) pvParameters;
while(1){
vTaskDelay(conf->delay * 1000 / portTICK_PERIOD_MS);
int16_t error = scd4x_read_measurement(&conf->co2, &conf->temperature, &conf->humidity);
if (error)
ESP_LOGE("sensor fetch", "Error executing scd4x_read_measurement(): %i\n", error);
}
}
void app_main(void){
// init LEDs driver
led_disp_config_t led_configs[] = {
[0] = {
.output = 4,
.min = 1500,
.max = 10000,
.intensity = 100,
.blink_duty_cycle = 1,
.blink_delay = 255,
},
[1] = {
.output = 5,
.min = 700,
.max = 1499,
.intensity = 100,
.blink_duty_cycle = 1,
.blink_delay = 255,
},
[2] = {
.output = 6,
.min = 0,
.max = 699,
.intensity = 100,
.blink_duty_cycle = 1,
.blink_delay = 255,
},
};
init_led_driver(led_configs, sizeof(led_configs)/sizeof(led_disp_config_t));
// init wifi AP (and nvs)
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);
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 = "/*",
};
ESP_ERROR_CHECK(start_server(serv_config));
// 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
fetch_sensor_config_t sensor_conf = {
.delay = 5,
.co2 = 0,
.temperature = 0,
.humidity = 0,
};
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_conf.co2, sensor_conf.temperature, sensor_conf.humidity);
update_led_status(led_configs, sizeof(led_configs)/sizeof(led_disp_config_t), sensor_conf.co2);
}
}