#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "driver/adc.h"
#include "driver/gpio.h"
#include "esp_log.h"
#define LED_PIN GPIO_NUM_2
#define TEMPO_MS 100
#define VMAX 100.0
static const char *TAG = "ADC_QUEUE";
// Fila para passar valor do ADC
QueueHandle_t adc_queue;
void init_adc(void);
void init_led(void);
void sendAdcTask(void *param);
void piscarLedTask(void *param);
void app_main(void)
{
init_adc();
init_led();
// Cria a fila (1 elemento de tipo int)
adc_queue = xQueueCreate(5, sizeof(int));
if (adc_queue == NULL) {
ESP_LOGE(TAG, "Erro ao criar fila!");
return;
}
// Cria as tasks
xTaskCreate(sendAdcTask, "Send ADC", 2048, NULL, 1, NULL);
xTaskCreate(piscarLedTask, "Blink LED", 2048, NULL, 1, NULL);
}
void init_adc(void) {
adc1_config_width(ADC_WIDTH_BIT_12);
adc1_config_channel_atten(ADC1_CHANNEL_6, ADC_ATTEN_DB_11);
}
void init_led(void) {
gpio_reset_pin(LED_PIN);
gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT);
}
void sendAdcTask(void *param) {
while (1) {
int val = adc1_get_raw(ADC1_CHANNEL_6);
float vMedia = VMAX * ((float)val / 4095.0);
int valorConvertido = (int)vMedia;
// Envia o valor para a fila (espera 10 ticks se estiver cheia)
if (xQueueSend(adc_queue, &valorConvertido, pdMS_TO_TICKS(10)) == pdPASS) {
printf( "Enviado: %d\n", valorConvertido);
} else {
printf( "Fila cheia, valor descartado\n");
}
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
void piscarLedTask(void *param) {
int vezes;
while (1) {
// Espera por um valor da fila (timeout de 1000 ms)
if (xQueueReceive(adc_queue, &vezes, pdMS_TO_TICKS(1000)) == pdTRUE) {
printf( "Piscar LED %d vezes\n", vezes);
for (int i = 0; i < vezes; i++) {
gpio_set_level(LED_PIN, 1);
vTaskDelay(pdMS_TO_TICKS(TEMPO_MS));
gpio_set_level(LED_PIN, 0);
vTaskDelay(pdMS_TO_TICKS(TEMPO_MS));
}
} else {
printf( "Nenhum valor recebido da fila\n");
}
}
}