#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_6 // Pino ADC (GPIO34, ADC1_CHANNEL_6)
#define ADC_WIDTH ADC_WIDTH_BIT_12 // Resolução do ADC (12 bits)
// Variáveis globais
static const char *TAG = "LED Timer Interrupt";
volatile bool ledState = false; // Estado do LED (0 = apagado, 1 = aceso)
// Função de interrupção do temporizador
void IRAM_ATTR timer_isr_handler(void* arg) {
// Alterna o estado do LED
ledState = !ledState;
gpio_set_level(LED_PIN, ledState); // Altera o nível do pino (acende ou apaga o LED)
ESP_LOGI(TAG, "Estado do LED: %s", ledState ? "Aceso" : "Apagado");
// Leitura do valor analógico (ADC)
int adcValue = adc1_get_raw(ADC_PIN); // Lê o valor do ADC (valor entre 0 e 4095, 12 bits)
ESP_LOGI(TAG, "Valor do ADC: %d", adcValue);
printf("Valor do Potenciomentro (ADC): %d\n", adcValue);
}
// Função principal
void app_main() {
// Inicializa a comunicação serial
ESP_LOGI(TAG, "Iniciando aplicação...");
printf("Iniciando aplicação...\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 segundo)
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 = "led_timer" // Nome do temporizador
};
// Inicializa o temporizador
ESP_ERROR_CHECK(esp_timer_create(&timer_args, &timer));
// Inicia o temporizador para disparar a cada 1 segundo (1.000.000 microssegundos)
ESP_ERROR_CHECK(esp_timer_start_periodic(timer, 1000000));
// O código fica em loop, o temporizador é que controla a alternância do LED
while (1) {
vTaskDelay(pdMS_TO_TICKS(1000)); // Pode ser usado para outras tarefas se necessário
}
}