#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "driver/gpio.h"
#include "esp_timer.h"
int leds[] = {13, 14, 27};
int buttons[] = {4, 16};
QueueHandle_t handlerQueue;
uint64_t time_aux = 0;
static void IRAM_ATTR gpio_interrupt_handler(void *args)
{
int pinNumber = (int)args;
uint64_t time = esp_timer_get_time() / 1000; // Retorna el tiempo en milisegundos
if(time - time_aux > 200)
{
time_aux = time;
xQueueSendFromISR(handlerQueue, &pinNumber, NULL);
}
}
void gpio_init()
{
gpio_install_isr_service(0); //instalar servicio de interrupcione
for(int i = 0; i<3; i++){
gpio_reset_pin(leds[i]); // volver a su estado por defecto
gpio_set_direction(leds[i], GPIO_MODE_OUTPUT); // pin de salida
}
for(int i = 0; i<2; i++){
gpio_reset_pin(buttons[i]); // volver a su estado por defecto
gpio_set_direction(buttons[i], GPIO_MODE_INPUT); // pin de salida
gpio_pulldown_en(buttons[i]);//habilitar pulldown boton
gpio_pullup_dis(buttons[i]); //deshabilitar pullup botton
gpio_set_intr_type(buttons[i], GPIO_INTR_POSEDGE); //interrupción por flanco de subida
gpio_isr_handler_add(buttons[i], gpio_interrupt_handler, (void *)buttons[i]);
}
}
void LED_Control_Task(void *params)
{
int pinNumber,iButton = 0, ledstate = 0;
while (true)
{
if(xQueueReceive(handlerQueue, &pinNumber, portMAX_DELAY))
{
switch(pinNumber)
{
case 4:
if(ledstate == 0)
{
gpio_set_level(leds[2], 0);
for(int j = 0; j < 2; j++)
{
gpio_set_level(leds[j], 1);
vTaskDelay(1000 / portTICK_PERIOD_MS);
gpio_set_level(leds[j], 0);
}
gpio_set_level(leds[2], 1);
printf("Abriendo...");
ledstate = 1;
}
break;
case 16:
if(ledstate == 1)
{
gpio_set_level(leds[2], 0);
for(int j = 2; j >= 0; j--)
{
gpio_set_level(leds[j], 1);
vTaskDelay(1000 / portTICK_PERIOD_MS);
gpio_set_level(leds[j], 0);
}
gpio_set_level(leds[0], 1);
printf("Cerrando...");
ledstate = 0;
}
break;
}
}
}
}
void app_main()
{
gpio_init();
printf("Sistema de estacionamiento\n");
handlerQueue = xQueueCreate(10, sizeof(int));
xTaskCreate(LED_Control_Task, "LED_Control_Task", 2048, NULL, 2, NULL);
}