Skip to content
Snippets Groups Projects
main.c 4.29 KiB
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/i2c.h"
#include "mlx90614.h"
#include "esp_log.h"
#include "dual_servo.c"
#include "speaker.c"

#define I2C_SCL_GPIO 38
#define I2C_SDA_GPIO 39
#define I2C_SCL_GPIO_2 5
#define I2C_SDA_GPIO_2 4

#define NUM_READINGS_AVERAGE 3  

float BURNER_ON_THRESHOLD = 10;

static const char* TAG = "MyModule";
// I2C parameters for sensor 1
i2c_config_t i2c_config_1 = {
    .mode = I2C_MODE_MASTER,
    .sda_io_num = I2C_SDA_GPIO,
    //.sda_pullup_en = GPIO_PULLUP_ENABLE,
    .scl_io_num = I2C_SCL_GPIO,
    //.scl_pullup_en = GPIO_PULLUP_ENABLE,
    .master.clk_speed = 100000 // 100 kHz
};

// I2C parameters for sensor 2
i2c_config_t i2c_config_2 = {
    .mode = I2C_MODE_MASTER,
    .sda_io_num = I2C_SDA_GPIO_2,
    //.sda_pullup_en = GPIO_PULLUP_ENABLE,
    .scl_io_num = I2C_SCL_GPIO_2,
    //.scl_pullup_en = GPIO_PULLUP_ENABLE,
    .master.clk_speed = 100000 // 100 kHz
};

void measure_temp(float* average_temperature_1, float* average_temperature_2){
    mlx90614_init(I2C_NUM_0);
    // Average multiple readings for sensor 1 (left burner)
    *average_temperature_1 = mlx90614_read_temperature();
    for (int i = 0; i < NUM_READINGS_AVERAGE; ++i)
    {
        *average_temperature_1 += mlx90614_read_temperature();
    }
    *average_temperature_1 /= NUM_READINGS_AVERAGE;
    ESP_LOGI(TAG,"BURNER 1 is measuring %f\n",*average_temperature_1);

    // Average multiple readings for sensor 2 (right burner)
    mlx90614_init(I2C_NUM_1);  // Switch to the second I2C bus
    *average_temperature_2 = mlx90614_read_temperature();
    for (int i = 0; i < NUM_READINGS_AVERAGE; ++i)
    {
        *average_temperature_2 += mlx90614_read_temperature();
    }
    *average_temperature_2 /= NUM_READINGS_AVERAGE;
    ESP_LOGI(TAG,"BURNER 2 is measuring %f\n",*average_temperature_2);
}

void app_main(){
    servo_setup();
    example_ledc_init();
    // I2C driver for sensor 1
    i2c_param_config(I2C_NUM_0, &i2c_config_1);
    i2c_driver_install(I2C_NUM_0, i2c_config_1.mode, 0, 0, 0);

    // I2C driver for sensor 2
    i2c_param_config(I2C_NUM_1, &i2c_config_2);
    i2c_driver_install(I2C_NUM_1, i2c_config_2.mode, 0, 0, 0);

    // Initialize sensors
    mlx90614_init(I2C_NUM_0);
    float average_temperature_1 = 0;
    mlx90614_init(I2C_NUM_1);
    float average_temperature_2 = 0;
    bool burner_1_on = false;
    bool burner_2_on = false;

    float prev1 = 0;
    float prev2 = 0;

    bool prevon1 = false;
    bool prevon2 = false;
    gpio_reset_pin(18);
    gpio_set_direction(18,GPIO_MODE_INPUT);

    measure_temp(&average_temperature_1,&average_temperature_2); //initial reading to get a baseline
    BURNER_ON_THRESHOLD += (average_temperature_1+average_temperature_2)/2;
    ESP_LOGI(TAG,"threshold is %f",BURNER_ON_THRESHOLD);


    while (1)
    {
        prev1 = average_temperature_1;
        prev2 = average_temperature_2;
        measure_temp(&average_temperature_1,&average_temperature_2);

        if((average_temperature_1 - prev1)>30){
            ESP_LOGI(TAG,"Fire in burner 1?");
            fire_sound();
            vTaskDelay(pdMS_TO_TICKS(1000));
            suppression_activate(1);
        }
        else if ((average_temperature_2 - prev2)>30){
            ESP_LOGI(TAG,"Fire in burner 2?");
            fire_sound();
            vTaskDelay(pdMS_TO_TICKS(1000));
            suppression_activate(2);
        }
        

        prevon1 = burner_1_on;
        prevon2 = burner_2_on;

        // Determine burner status based on averaged temperature readings
        burner_1_on = burner_2_on ? (average_temperature_1 > (BURNER_ON_THRESHOLD+35)) : (average_temperature_1 > BURNER_ON_THRESHOLD);
        burner_2_on = burner_1_on ? (average_temperature_2 > BURNER_ON_THRESHOLD+35) : (average_temperature_2 > BURNER_ON_THRESHOLD);

        if(prevon1==false && burner_1_on==true)
            single_beep();
        if(prevon2==false && burner_2_on==true)
            double_beep();

        if(gpio_get_level(18)==0)
            end_fire_sound();
        
        if(burner_1_on) {
            ESP_LOGI(TAG,"BURNER 1 IS ON");
        }

        if(burner_2_on) {
            ESP_LOGI(TAG,"BURNER 2 IS ON\n");
        }

        // if(!burner_1_on && !burner_2_on){
        //     suppression_deactivate();
        // }

       
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}