#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "driver/gpio.h"
#include "esp_timer.h"
#define INPUT_PIN 17
#define LED_PIN 2
#define tiempo_rebote_ms 50000 // 50ms
QueueHandle_t handlerQueue;
static esp_timer_handle_t temporizador_rebote;
static void IRAM_ATTR gpio_interrupt_handler(void *args);
static void eliminar_rebote(void *args);
void LED_Control_Task(void *params);
void app_main()
{
gpio_reset_pin(LED_PIN);
gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT);
gpio_reset_pin(INPUT_PIN);
gpio_set_direction(INPUT_PIN, GPIO_MODE_INPUT);
gpio_pulldown_en(INPUT_PIN);
gpio_pullup_dis(INPUT_PIN);
gpio_set_intr_type(INPUT_PIN, GPIO_INTR_POSEDGE);
handlerQueue = xQueueCreate(10, sizeof(int));
xTaskCreate(LED_Control_Task, "LED_Control_Task", 2048, NULL, 1, NULL);
gpio_install_isr_service(0);
gpio_isr_handler_add(INPUT_PIN, gpio_interrupt_handler, (void *)INPUT_PIN);
const esp_timer_create_args_t timer_args = {
.callback = &eliminar_rebote,
.arg = (void *)INPUT_PIN,
.dispatch_method = ESP_TIMER_TASK,
.name = "temporizador_rebote"};
esp_timer_create(&timer_args, &temporizador_rebote);
}
static void IRAM_ATTR gpio_interrupt_handler(void *args)
{
esp_timer_start_once(temporizador_rebote, tiempo_rebote_ms);
}
static void eliminar_rebote(void *args)
{
int pinNumber = (int)args;
if (gpio_get_level(pinNumber) == 1)
{
xQueueSendFromISR(handlerQueue, &pinNumber, NULL);
}
}
void LED_Control_Task(void *params)
{
int pinNumber, count = 0;
while (true)
{
if (xQueueReceive(handlerQueue, &pinNumber, portMAX_DELAY))
{
printf("GPIO %d was pressed %d times. The state is %d\n",
pinNumber, count++, gpio_get_level(INPUT_PIN));
gpio_set_level(LED_PIN, gpio_get_level(INPUT_PIN));
while (gpio_get_level(INPUT_PIN) == 1)
vTaskDelay(pdMS_TO_TICKS(10));
printf("GPIO %d was pressed %d times. The state is %d\n",
pinNumber, count++, gpio_get_level(INPUT_PIN));
gpio_set_level(LED_PIN, 0);
}
}
}