#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"
#include "esp_timer.h"
#include "driver/adc.h"
// Definições de pinos
#define LED_PIN 23 // LED no pino 23
#define ADC_PIN ADC1_CHANNEL_0 // Pino ADC (GPIO34, ADC1_CHANNEL_0)
#define ADC_WIDTH ADC_WIDTH_BIT_12 // Resolução do ADC (12 bits)
#define NUM_SAMPLES 1000 // Número de amostras (1kHz por 1 segundo)
// Variáveis globais
static const char *TAG = "ADC Sampling";
volatile bool ledState = false; // Estado do LED (0 = apagado, 1 = aceso)
volatile int adcValues[NUM_SAMPLES]; // Vetor para armazenar os valores do ADC
volatile int sampleCount = 0; // Contador de amostras
// Função de interrupção do temporizador
void IRAM_ATTR timer_isr_handler(void* arg) {
// Realiza a leitura do ADC a cada 1ms (1 kHz)
if (sampleCount < NUM_SAMPLES) {
adcValues[sampleCount] = adc1_get_raw(ADC_PIN); // Lê o valor do ADC
sampleCount++;
}
}
// Função para imprimir os dados coletados
void print_adc_values() {
for (int i = 0; i < NUM_SAMPLES; i++) {
if (i > 0) {
printf(","); // Adiciona vírgula entre os valores
}
printf("%d", adcValues[i]);
}
printf("\n");
}
// Função principal
void app_main() {
// Inicializa a comunicação serial
printf("Iniciando coleta de dados...\n");
// Configuração do LED (pino 23)
gpio_config_t ledConfig = {
.pin_bit_mask = (1ULL << LED_PIN),
.mode = GPIO_MODE_OUTPUT,
.pull_up_en = GPIO_PULLUP_DISABLE,
.pull_down_en = GPIO_PULLDOWN_DISABLE,
.intr_type = GPIO_INTR_DISABLE
};
gpio_config(&ledConfig);
// Configuração do ADC (GPIO34 para ADC1_CHANNEL_0)
adc1_config_width(ADC_WIDTH); // Configura a largura do ADC (12 bits)
adc1_config_channel_atten(ADC_PIN, ADC_ATTEN_DB_0); // Configura a atenuação do ADC (0dB para leitura de 0 a 3.3V)
// Criação do temporizador (1 ms)
esp_timer_handle_t timer;
esp_timer_create_args_t timer_args = {
.callback = timer_isr_handler, // Função de callback para a interrupção
.arg = NULL, // Argumento da função
.dispatch_method = ESP_TIMER_TASK, // A interrupção será tratada na task do FreeRTOS
.name = "adc_timer" // Nome do temporizador
};
// Inicializa o temporizador
ESP_ERROR_CHECK(esp_timer_create(&timer_args, &timer));
// Inicia o temporizador para disparar a cada 1 ms (1.000 microssegundos)
ESP_ERROR_CHECK(esp_timer_start_periodic(timer, 1000)); // 1 ms = 1000 microssegundos
// Aguarda até que as 1000 amostras sejam coletadas
while (sampleCount < NUM_SAMPLES) {
vTaskDelay(pdMS_TO_TICKS(1)); // Delay de 1 ms para garantir que a coleta de amostras continue
}
// Após coletar as amostras, parar o temporizador
ESP_ERROR_CHECK(esp_timer_stop(timer));
// Imprime os dados coletados
printf("Dados coletados: ");
print_adc_values();
}