Files @ aee85174089e
Branch filter:

Location: protofusion-esp32-template/main/squeeze.c - annotation

Ethan Zonca
Add missing files for squeeze and nv storage
#include "driver/adc.h"
#include "esp_adc_cal.h"
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

#include "squeeze.h"

static const char *TAG = "squeeze";

esp_adc_cal_characteristics_t adc1_chars;

// Private prototypes
static void squeeze_process(void);


void squeeze_init(void)
{
    // ADC1 chan0 is PIN1
    adc1_config_channel_atten(ADC1_CHANNEL_0, ADC_ATTEN_DB_12);
    esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_12, ADC_WIDTH_BIT_DEFAULT, 0, &adc1_chars);
    xTaskCreatePinnedToCore(squeeze_process, "squeeze", 1024*2, NULL, 10, NULL, 1);
}


// Definitions
#define ALPHA_FAST 0.02f
#define ALPHA_SLOW 0.005f

// Private variables
static float reading_fast = 0.0f;
static float reading_slow = 0.0f;
static float delta_last = 0.0f;
static uint8_t triggered_flag = 0;


static void squeeze_process(void)
{
    for(;;)
    {
        uint32_t millivolts = esp_adc_cal_raw_to_voltage(adc1_get_raw(ADC1_CHANNEL_0), &adc1_chars);

        reading_fast = (ALPHA_FAST * millivolts) + ((1.0-ALPHA_FAST) * reading_fast);
        reading_slow = (ALPHA_SLOW * millivolts) + ((1.0-ALPHA_SLOW) * reading_slow);
        float delta = reading_fast - reading_slow;

        //ESP_LOGI(TAG, "ADC read %lu fast=%g slow=%g delta=%g", millivolts, reading_fast, reading_slow, delta);

        if(delta > 4.0 && delta_last < 4.0)
        {
            ESP_LOGI(TAG, "Trigger at delta %g", delta);

            // set flag, consumed on read by squeeze_triggered()
            triggered_flag = 1;
        }
        delta_last = delta;
        vTaskDelay(10 / portTICK_PERIOD_MS);
    }
}

float squeeze_value(void)
{
    return reading_fast;
}

uint8_t squeeze_triggered(void)
{
    if(triggered_flag == 1)
    {
        // consume
        triggered_flag = 0;
        return 1;
    }
    else
    {
        return 0;
    }
}