#include "freertos/FreeRTOS.h" //Inclusão do arquivo principal do sistema operacional usado para microcontroladores
#include "freertos/task.h" //Inclusão do arquivo de criação e gerenciamento de tarefas no sistema operacional para microcontroladores
#include "driver/gpio.h" //Inclusão do arquivo para controle dos pinos digitais
#include "esp_log.h" //Inclusão do arquivo para imprimir mensagens no console via ESP_LOGI()
// Definição dos pinos GPIOs dos LEDs e botões
#define LED1_PIN 21
#define LED2_PIN 17
#define LED3_PIN 2
#define BUTTON1_PIN 19
#define BUTTON2_PIN 18
static const char *TAG = "LED_CONTROL"; //Cria um ponteiro TAG que aponta para a string que indica o estado do LED "LED_CONTROL"
void app_main(void)
{
// Reseta os pinos dos LEDs e os configura como saída digital
gpio_reset_pin(LED1_PIN);
gpio_set_direction(LED1_PIN, GPIO_MODE_OUTPUT);
gpio_reset_pin(LED2_PIN);
gpio_set_direction(LED2_PIN, GPIO_MODE_OUTPUT);
gpio_reset_pin(LED3_PIN);
gpio_set_direction(LED3_PIN, GPIO_MODE_OUTPUT);
// Reseta os pinos dos botões, os configura como entrada digital e ativa o pull-up interno do ESP32
gpio_reset_pin(BUTTON1_PIN);
gpio_set_direction(BUTTON1_PIN, GPIO_MODE_INPUT);
gpio_pullup_en(BUTTON1_PIN);
gpio_reset_pin(BUTTON2_PIN);
gpio_set_direction(BUTTON2_PIN, GPIO_MODE_INPUT);
gpio_pullup_en(BUTTON2_PIN);
//Armazenamento do estado inicial dos LEDs e dos botões
int led1_state = 0;
int led2_state = 0;
int led3_state = 0;
int last_button1_state = 1;
int last_button2_state = 1;
TickType_t last_led3_toggle = xTaskGetTickCount(); //Retorna a quantidade de ticks(unidade de tempo) desde que os sistema iniciou
while (1) { //Laço infinito
//Leitura do estado atual dos botões
int button1_state = gpio_get_level(BUTTON1_PIN);
int button2_state = gpio_get_level(BUTTON2_PIN);
// Acende LED1 a partir do botão1
if (last_button1_state == 1 && button1_state == 0) { //Verifica se o botão foi pressionado
led1_state = !led1_state;
gpio_set_level(LED1_PIN, led1_state); //Muda estado do LED
ESP_LOGI(TAG, "LED1 %s", led1_state ? "ACESO" : "APAGADO"); // Exibe no LOG o estado do LED
vTaskDelay(200 / portTICK_PERIOD_MS); // Delay para evitar ruído
}
// Acende LED2 a partir do botão2
if (last_button2_state == 1 && button2_state == 0) {
led2_state = !led2_state;
gpio_set_level(LED2_PIN, led2_state);
ESP_LOGI(TAG, "LED2 %s", led2_state ? "ACESO" : "APAGADO");
vTaskDelay(200 / portTICK_PERIOD_MS);
}
//Atualiza o último estado do botão para voltar o processo do início
last_button1_state = button1_state;
last_button2_state = button2_state;
TickType_t now = xTaskGetTickCount(); //Pega o tempo desde que o ESP foi ligado
if ((now - last_led3_toggle) >= pdMS_TO_TICKS(1000)) { //Compara se faz mais de 1 segundo que o LED piscou
led3_state = !led3_state;
gpio_set_level(LED3_PIN, led3_state); //Muda o estado do LED
ESP_LOGI(TAG, "LED3 %s", led3_state ? "ACESO" : "APAGADO"); // Exibe no LOG o estado do LED
last_led3_toggle = now; //Atualiza a marca de tempo da última vez que o LED foi atualizado
}
vTaskDelay(10 / portTICK_PERIOD_MS);
}
}