#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_intr_alloc.h"
// LEDS
#define LED_VERDE 4
#define LED_AMARELO 5
#define LED_AZUL 6
#define LED_BRANCO 7
// BOTOES
#define BOTAO_VERDE 1 // BOTAO A
#define BOTAO_AMARELO 2 // BOTAO B
// Debounce
#define DEBOUNCE_MS 200
volatile uint8_t contador = 0;
volatile uint8_t passo = 1;
volatile TickType_t last_press_verde = 0;
volatile TickType_t last_press_amarelo = 0;
portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED;
void atualizar_leds(uint8_t valor) {
gpio_set_level(LED_BRANCO, (valor & 0x01));
gpio_set_level(LED_AZUL, (valor & 0x02) >> 1);
gpio_set_level(LED_AMARELO, (valor & 0x04) >> 2);
gpio_set_level(LED_VERDE, (valor & 0x08) >> 3);
}
// ISR do botão verde
static void IRAM_ATTR isr_botao_verde(void *arg) {
TickType_t agora = xTaskGetTickCountFromISR();
if (agora - last_press_verde > pdMS_TO_TICKS(DEBOUNCE_MS)) {
portENTER_CRITICAL_ISR(&mux);
contador = (contador + passo) & 0x0F;
portEXIT_CRITICAL_ISR(&mux);
last_press_verde = agora;
}
}
// ISR do botão amarelo
static void IRAM_ATTR isr_botao_amarelo(void *arg) {
TickType_t agora = xTaskGetTickCountFromISR();
if (agora - last_press_amarelo > pdMS_TO_TICKS(DEBOUNCE_MS)) {
portENTER_CRITICAL_ISR(&mux);
passo = (passo == 1) ? 2 : 1;
portEXIT_CRITICAL_ISR(&mux);
last_press_amarelo = agora;
}
}
void configure_led(int pin) {
gpio_set_direction(pin, GPIO_MODE_OUTPUT);
}
void configure_botao(int pin, gpio_int_type_t tipo, gpio_isr_t isr_handler) {
gpio_config_t io_conf = {
.pin_bit_mask = 1ULL << pin,
.mode = GPIO_MODE_INPUT,
.pull_up_en = GPIO_PULLUP_ENABLE,
.pull_down_en = GPIO_PULLDOWN_DISABLE,
.intr_type = tipo
};
gpio_config(&io_conf);
gpio_isr_handler_add(pin, isr_handler, NULL);
}
void app_main() {
// Configurar LEDs
configure_led(LED_VERDE);
configure_led(LED_AMARELO);
configure_led(LED_AZUL);
configure_led(LED_BRANCO);
// Inicializar interrupções
gpio_install_isr_service(0);
// Configurar botões com interrupção
configure_botao(BOTAO_VERDE, GPIO_INTR_NEGEDGE, isr_botao_verde);
configure_botao(BOTAO_AMARELO, GPIO_INTR_NEGEDGE, isr_botao_amarelo);
while (true) {
// Atualiza LEDs de forma contínua conforme valor de contador
uint8_t valor_atual;
portENTER_CRITICAL(&mux);
valor_atual = contador;
portEXIT_CRITICAL(&mux);
atualizar_leds(valor_atual);
vTaskDelay(pdMS_TO_TICKS(100));
}
}
Loading
esp32-s3-devkitc-1
esp32-s3-devkitc-1