#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, 26, 33};
int buttons[] = {4, 16, 17, 18};
int states[5] = {0, 0, 0, 0, 0}; // Estado de cada LED
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<5; 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<4; 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 Button_Control_Task(void *params)
{
}*/
void LED_Control_Task(void *params)
{
int pinNumber, count = 0, iButton = 0, iLed = 0;
while (true)
{
if(xQueueReceive(handlerQueue, &pinNumber, portMAX_DELAY))
{
for(int i = 0; i < 4; i++)
{
if(pinNumber == buttons[i])
{
iButton = i;
iLed = i;
while(gpio_get_level(buttons[iButton]) == 1)
{
gpio_set_level(leds[iLed], 1);
}
gpio_set_level(leds[iLed], 0);
}
}
switch(iButton)
{
case 0:
printf("Se ingreso 1 peso\n");
break;
case 1:
printf("Se ingreso 5 pesos\n");
break;
case 2:
printf("Se ingreso 10 pesos\n");
break;
case 3:
printf("Se ingreso 20 pesos\n");
break;
}
}
}
}
void app_main()
{
gpio_init();
handlerQueue = xQueueCreate(10, sizeof(int));
xTaskCreate(LED_Control_Task, "LED_Control_Task", 2048, NULL, 2, NULL);
//xTaskCreate(Button_Control_Task, "Button_Control_Task", 2048, NULL, 1, NULL);
}