#include <stdio.h>
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
// Definiciones de pines
#define LED_ROJO 23 // Pin 23 para el LED 1 rojo
#define LED_AZUL 22 // Pin 22 para el LED 2 azul
#define BOTON 19 // Pin 19 para el botón
uint8_t led_valor = 0; //00000000 & el negado 00000001 en 8 bits
// Variable global para indicar si se ha presionado el botón
volatile bool botonEstado = false;
// Manejador de interrupciones para el botón
static void interrupcionBoton() {
botonEstado = true; // Marca que el botón ha sido presionado
}
// Configuración del botón
void button_config() {
printf("configurando botón\n");
gpio_set_direction(BOTON, GPIO_MODE_INPUT); // Configura el pin del botón como entrada
gpio_pullup_en(BOTON); // Habilita la resistencia pull-up interna para el botón
// Configuración de la Interrupción
gpio_install_isr_service(0); // Instala el servicio de interrupciones GPIO
gpio_set_intr_type(BOTON, GPIO_INTR_NEGEDGE); // Configura la interrupción para el flanco de bajada (cuando se presiona el botón)
gpio_isr_handler_add(BOTON, interrupcionBoton, NULL); // Añade el manejador de interrupciones para el botón
printf("configuración completa\n");
}
// Configuración del led rojo y led azul
void led_config() {
gpio_set_direction(LED_ROJO, GPIO_MODE_OUTPUT); // Configura el pin del LED rojo como salida
gpio_set_direction(LED_AZUL, GPIO_MODE_OUTPUT); // Configura el pin del LED azul como salida
gpio_set_level(LED_ROJO, 0); // Inicializa el LED rojo en estado apagado (nivel bajo)
gpio_set_level(LED_AZUL, 0); // Inicializa el LED azul en estado apagado (nivel bajo)
}
// Función principal del programa
void app_main() {
int contadorPresiones = 2; //contador de presiones del botton
button_config(); // Configura el botón
led_config(); // Configura el led rojo y azul
while (1) {
if (botonEstado) {
//printf("*botón Presionado\n"); // Imprime un asterisco cuando el botón es presionado
botonEstado = false; // Reinicia el estado de la variable botonEstado
// Incrementa el contador de presiones y reinícia si excede el número máximo de estados (3)
contadorPresiones = (contadorPresiones + 1) % 3; // El contador de presiones se saca el modulo para las posiciones
switch (contadorPresiones) {
case 0:
printf("Opción 1: led 1 encendido, led 2 apagado\n");
// Primera presión: Enciende el LED rojo y el LED azul sigue apagado
gpio_set_level(LED_ROJO,!led_valor);
break;
case 1:
printf("Opción 2: led 1 apagado, led 2 encendido\n");
// Segunda presión: Apaga el LED rojo y enciende el LED azul
gpio_set_level(LED_ROJO,led_valor);
gpio_set_level(LED_AZUL,!led_valor);
break;
case 2:
printf("Opción 3: led 1 apagado, led 2 apagado\n");
// Tercera presión: Apaga el LED azul y el LED rojo permanece apagado
gpio_set_level(LED_AZUL,led_valor);
break;
default:
break;
}
}
vTaskDelay(100 / portTICK_PERIOD_MS); // Espera antes de la próxima iteración del bucle
}
}