#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include <driver/gpio.h>
#include "esp_log.h"
#include "esp_timer.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
uint32_t VERDE_PRESSIONADO = 0;
uint32_t AMARELO_PRESSIONADO = 0;
// Debounce
#define DEBOUNCE_MS 200
//variaveis
uint8_t contador = 0;
uint8_t passo = 1; // incrementar 1
/*Configuracao Pull-UP */
void configure_botao(int botao_pin) {
gpio_set_direction(botao_pin, GPIO_MODE_INPUT);
gpio_pullup_en(botao_pin); // Ativa o pull-up interno
gpio_pulldown_dis(botao_pin); // Desativa o pull-down
}
void app_main() {
// Configure Digital I/O for LEDs
gpio_set_direction(LED_VERDE, GPIO_MODE_OUTPUT);
gpio_set_direction(LED_AMARELO, GPIO_MODE_OUTPUT);
gpio_set_direction(LED_AZUL, GPIO_MODE_OUTPUT);
gpio_set_direction (LED_BRANCO, GPIO_MODE_OUTPUT);
const uint32_t debounce_time = 200 / portTICK_PERIOD_MS; // Tempo de debounce
while (true) {
// Leitura atual dos botões (0 se pressionado, 1 se não)
int VERDE_ATUAL = gpio_get_level(BOTAO_VERDE);
int AMARELO_ATUAL = gpio_get_level(BOTAO_AMARELO);
// Verifica o botão verde
if (VERDE_ATUAL == 0 && (xTaskGetTickCount() - VERDE_PRESSIONADO) > debounce_time) {
// Incrementa contador com a unidade atual
contador += passo;
// Lógica de estouro (overflow)
if (contador > 0xF) {
contador = contador % 0x10; // Mantém dentro do intervalo de 4 bits
}
VERDE_PRESSIONADO = xTaskGetTickCount();
}
// Verifica o botão amarelo
if (AMARELO_ATUAL == 0 && (xTaskGetTickCount() - AMARELO_PRESSIONADO) > debounce_time){ // Alterna unidade de incremento entre 1 e 2
passo = (passo == 1) ? 2 : 1;
AMARELO_PRESSIONADO = xTaskGetTickCount(); // Atualiza o tempo do último acionamento
}
// Atualiza os LEDs de acordo com o valor do contador
gpio_set_level(LED_BRANCO, (contador & 0x01)); // LED Branco - Bit 3 (MSB)
gpio_set_level(LED_AZUL, (contador & 0x02) >> 1); // LED Azul - Bit 2
gpio_set_level(LED_AMARELO, (contador & 0x04) >> 2); // LED Amarelo - Bit 1
gpio_set_level(LED_VERDE, (contador & 0x08) >> 3); // LED Verde - Bit 0 (LSB)
// Incrementa o contador e faz um loop de 4 bits
contador = (contador + 1) % 16; // 16 = 2^4
vTaskDelay(pdMS_TO_TICKS(1000));
}
}