#include <stdio.h>
#include "esp_log.h"
#include "esp_system.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_netif.h"
#include "nvs_flash.h"
#include "driver/gpio.h"
#include "esp_http_server.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
// Configuração do Wi-Fi
#define WIFI_SSID "Beth 2.4" // Substitua pelo nome da sua rede Wi-Fi
#define WIFI_PASS "BETH2330" // Substitua pela sua senha de rede Wi-Fi
static const char *TAG = "ESP32";
bool led_task_triggered = false; // Flag para acionar a tarefa dos LEDs
// Função de conexão Wi-Fi
void wifi_init_sta(void) {
esp_netif_init(); // Inicializa a pilha de rede do ESP32.
esp_event_loop_create_default(); //Cria o loop de eventos padrão, que será usado para tratar eventos de Wi-Fi.
esp_netif_create_default_wifi_sta(); //Cria uma interface de rede para Wi-Fi no modo estação.
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
esp_wifi_init(&cfg); //Inicializa o Wi-Fi com a configuração padrão.
esp_wifi_set_mode(WIFI_MODE_STA); //Configura o ESP32 para o modo estação (STA), ou seja, ele irá se conectar a uma rede Wi-Fi.
// Definir o SSID e a senha
wifi_config_t wifi_config = {
.sta = {
.ssid = WIFI_SSID,
.password = WIFI_PASS,
},
};
esp_wifi_set_config(WIFI_IF_STA, &wifi_config); // Configura o Wi-Fi com SSID e senha
esp_wifi_start(); //Inicia a interface Wi-Fi.
esp_wifi_connect(); //Solicita ao ESP32 para se conectar à rede Wi-Fi.
ESP_LOGI(TAG, "Conectando à rede Wi-Fi...");
}
// Função para exibir a página HTML
esp_err_t serve_main_page(httpd_req_t *req) {
const char *html =
"<html><body>"
"<h1>Sinal Online</h1>"
"<button onclick=\"location.href='button'\">Dar sinal</button><br><br>"
"</body></html>";
httpd_resp_send(req, html, HTTPD_RESP_USE_STRLEN);
return ESP_OK;
}
// Função para funcionar o semafaro
esp_err_t turn_on(httpd_req_t *req) {
led_task_triggered = true; // Aciona o semáforo quando o botão for pressionado
ESP_LOGI(TAG, "Dado Sinal");
//httpd_resp_send(req, "Dado Sinal", HTTPD_RESP_USE_STRLEN);
return ESP_OK;
}
// Configuração do servidor HTTP
httpd_uri_t main_page = {
.uri = "/",
.method = HTTP_GET,
.handler = serve_main_page
};
httpd_uri_t led_on = {
.uri = "/button",
.method = HTTP_GET,
.handler = turn_on
};
// Função para iniciar o servidor web
esp_err_t start_webserver(void) {
httpd_handle_t server = NULL;
httpd_config_t config = HTTPD_DEFAULT_CONFIG();
// Inicia o servidor HTTP
if (httpd_start(&server, &config) == ESP_OK) {
// Registra as rotas
httpd_register_uri_handler(server, &main_page);
httpd_register_uri_handler(server, &led_on);
return ESP_OK;
}
return ESP_FAIL;
}
//configura os pinos
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 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 principal
void app_main(void) {
esp_err_t ret = nvs_flash_init(); //Inicializa a memória NVS para armazenar configurações persistentes.
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
ESP_ERROR_CHECK(nvs_flash_erase());
ret = nvs_flash_init();
}
ESP_ERROR_CHECK(ret);
//Configura os pinos
initPin();
// Inicializa a conexão Wi-Fi
wifi_init_sta();
ESP_LOGI(TAG, "Conectado ao Wi-Fi!");
// Inicia o servidor web
start_webserver();
while (1) {
// Ler o estado do botão
gpio_set_level(LED_GREEN, 1); //coloca o sinal sempre em verde
// Se a flag foi acionada, executa o controle dos LEDs
if (led_task_triggered) {
led_control();
led_task_triggered = false; // Resetando a flag
}
vTaskDelay(10 / portTICK_PERIOD_MS); // Pequena pausa para evitar sobrecarga na CPU
}
}