#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "freertos/timers.h"
#define LED_GREEN 18 //pino do led verde
#define LED_YELLOW 17 //pino do led amaarelo
#define LED_RED 16 //pino do led vermelho
#define PIN_BUTTON 4 //pino do botão
TimerHandle_t xTimers; // timer é um typedef que cria uma variaavel chamada xtimers
int interval = 3000; // tempo de acionamento do evento
int timerId = 1; //id que indentifica o timer
bool led_task_triggered = false; // Flag para acionar a tarefa dos LEDs
void initPin(); //inicia os pinos
void vTimerCallback(TimerHandle_t xTimer); //função que é chamada depois que o timer é acionado
void set_timer(); //configura o timer
void led_control(); //controle do comportamento dos leds
void app_main() {
uint8_t button_state; // declara variavel que verifica o estado do botão
initPin(); //configura os pinos
set_timer(); // Configurar o timer
while (1) {
// Ler o estado do botão
gpio_set_level(LED_GREEN, 1); //coloca o sinal sempre em verde
button_state = gpio_get_level(PIN_BUTTON); //guarda o estado do botão
// Se o botão for pressionado (estado alto)
if (button_state) {
// Iniciar o timer se o timer for diferente de pdPASS DEU ERRO NA INICIALIZAÇÃO
//pdPASS é uma constante do FreeRTOS que indica que uma operação foi bem-sucedida
if (xTimerStart(xTimers, 0) != pdPASS) {
printf("Failed to start the timer\n");
}
// Aguardar até o botão ser solto para evitar múltiplos acionamentos
while (gpio_get_level(PIN_BUTTON)); // Aguarda enquanto o botão estiver pressionado
}
//se o if for verdadeiro ele executa o que está dentro
if( led_task_triggered ){
led_control();
}
vTaskDelay(10 / portTICK_PERIOD_MS); // Pequena pausa para evitar sobrecarga na CPU
}
}
void initPin() {
gpio_set_direction(LED_GREEN, GPIO_MODE_OUTPUT);
gpio_set_direction(LED_YELLOW, GPIO_MODE_OUTPUT);
gpio_set_direction(LED_RED, GPIO_MODE_OUTPUT);
gpio_set_direction(PIN_BUTTON, GPIO_MODE_INPUT);
gpio_pulldown_en(PIN_BUTTON); // Habilita o resistor pull-down
gpio_pullup_dis(PIN_BUTTON); // Desabilita o pull-up
}
//função callback
void vTimerCallback(TimerHandle_t xTimer) {
led_task_triggered = true;
}
//função controle de led
void led_control(){
led_task_triggered = false;
int led_state = 1;
vTaskDelay(2000 / portTICK_PERIOD_MS);
gpio_set_level(LED_GREEN, 0);
gpio_set_level(LED_YELLOW, 1);
vTaskDelay(3000 / portTICK_PERIOD_MS);
gpio_set_level(LED_YELLOW, 0);
gpio_set_level(LED_RED, 1);
vTaskDelay(3000 / portTICK_PERIOD_MS);
for (int i = 0; i <= 11; i++) {
led_state = !led_state; // Alterna o estado do LED
gpio_set_level(LED_RED, !led_state); // Pisca o LED vermelho
vTaskDelay(500 / portTICK_PERIOD_MS);
}
}
//função do tipo esp_err_t que configrua o timer
void set_timer(){
printf("Timer init confgiration\n"); //mostra uma mensagem na tela
// 1 PARAMETRO xtimerCreate = nome do timer
// 2 PARAMETRO tempo que será chamada a função vTimerCallback
//3 PARAMETRO se o timer vai se repetir ou não
// NULL ponteiro que pode ser usado para entrar com parametros para a função vTimerCAllback
//função que será chamada após o tempo expirar !!!
xTimers = xTimerCreate("Timer",
(pdMS_TO_TICKS(interval)),
pdFALSE,
NULL,
vTimerCallback
); // parametros acima para configurar o timer
//se o xtimer estiver com NULL que dizer que não foi configurado
if (xTimers == NULL){
//The timer was not create
printf("The timer was not created.\n");
}
/* Se o timer foi criado com sucesso, você tenta iniciar o timer usando xTimerStart.
O segundo parâmetro (0) indica que você não deseja aguardar (blocking) até que o timer seja iniciado.
Se xTimerStart não retornar pdPASS, significa que o timer não pôde ser ativado, e outra mensagem de erro
é registrada.*/
}