#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_timer.h"
#define GPIO_BTN_A 1
#define GPIO_LED_BIT0 4
#define BTN_PIN_SEL (1ULL << GPIO_BTN_A)
#define LED_PIN_SEL (1ULL << GPIO_LED_BIT0)
#define DEBOUNCE_TIME 50000 // 50ms em microsegundos
#define AUTO_OFF_TIME 10000000 // 10s em microsegundos
void app_main() {
gpio_config_t io_conf = {
.intr_type = GPIO_INTR_DISABLE,
.mode = GPIO_MODE_OUTPUT,
.pin_bit_mask = LED_PIN_SEL,
.pull_down_en = 0,
.pull_up_en = 0
};
gpio_config(&io_conf);
io_conf.mode = GPIO_MODE_INPUT;
io_conf.pin_bit_mask = BTN_PIN_SEL;
io_conf.pull_up_en = 1;
gpio_config(&io_conf);
int64_t ultimo_tempo_clique = 0;
int64_t tempo_ligou = 0;
int led_ligado = 0;
int ultimo_estado_btn = 1;
while (true) {
int64_t tempo_atual = esp_timer_get_time();
int leitura_btn = gpio_get_level(GPIO_BTN_A);
if (leitura_btn == 0 && ultimo_estado_btn == 1) {
if ((tempo_atual - ultimo_tempo_clique) >= DEBOUNCE_TIME) {
led_ligado = !led_ligado; // Inverte o estado
gpio_set_level(GPIO_LED_BIT0, led_ligado);
if (led_ligado) tempo_ligou = tempo_atual; // Marca quando ligou
ultimo_tempo_clique = tempo_atual;
}
}
ultimo_estado_btn = leitura_btn;
// Lógica para desligar sozinho após 10 segundos
if (led_ligado && (tempo_atual - tempo_ligou >= AUTO_OFF_TIME)) {
led_ligado = 0;
gpio_set_level(GPIO_LED_BIT0, 0);
printf("LED desligado por timeout (10s)\n");
}
vTaskDelay(20 / portTICK_PERIOD_MS); // Loop mais rápido para não perder o clique
}
}