#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"
#include "esp_timer.h"
// Definições de pinos
#define LED_PIN 23 // LED no pino 23
// 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");
}
// Função principal
void app_main() {
// Inicializa a comunicação serial
ESP_LOGI(TAG, "Iniciando aplicação...");
// 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);
// 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
}
}