diff --git a/main/squeeze.c b/main/squeeze.c new file mode 100644 --- /dev/null +++ b/main/squeeze.c @@ -0,0 +1,78 @@ +#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; + } +} \ No newline at end of file