#include <WiFi.h>
//------------------Servidor Web en puerto 80---------------------
WiFiServer server(80);
//---------------------Credenciales de WiFi-----------------------
const char* ssid = "---";
const char* password = "---";
//---------------------VARIABLES GLOBALES-------------------------
int contconexion = 0;
String header; // Variable para guardar el HTTP request
const byte sensorPin = 15;
byte estado = 0;
const byte verde = 25;
const byte amarillo = 33;
const byte rojo = 26;
//------------------Pagina-------------------------------
String paginaInicio = "<!DOCTYPE html>"
"<html>"
"<head>"
"<meta charset='utf-8' />"
"<META HTTP-EQUIV='Refresh' CONTENT='1'>"
"<title>Semáforo ESP32</title>"
"<style>"
"body { font-family: Arial, sans-serif; text-align: center; background-color: #f3f3f3; }"
".semaforo { width: 100px; height: 300px; margin: 20px auto; background-color: black; border-radius: 10px; padding: 10px; }"
".luz { width: 80px; height: 80px; margin: 10px auto; border-radius: 50%; background-color: gray; }"
".verde { background-color: green; }"
".amarillo { background-color: yellow; }"
".rojo { background-color: red; }"
"</style>"
"</head>"
"<body>"
"<h1>Semáforo Web ESP32</h1>"
"<div class='semaforo'>";
String paginaFin = "</div>"
"</body>"
"</html>";
void setup() {
Serial.begin(115200);
Serial.println("");
pinMode(sensorPin, INPUT);
pinMode(verde, OUTPUT);
pinMode(amarillo, OUTPUT);
pinMode(rojo, OUTPUT);
// Conexión WIFI
WiFi.begin(ssid, password);
// Cuenta hasta 50 si no se puede conectar lo cancela
while (WiFi.status() != WL_CONNECTED and contconexion < 50) {
++contconexion;
delay(500);
Serial.print(".");
}
if (contconexion < 50) {
// IP fija
IPAddress ip(192,168,1,180);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);
WiFi.config(ip, gateway, subnet);
Serial.println("");
Serial.println("WiFi conectado");
Serial.println(WiFi.localIP());
server.begin(); // iniciamos el servidor
} else {
Serial.println("");
Serial.println("Error de conexión");
}
}
void loop() {
// Lee el estado del sensor
estado = digitalRead(sensorPin);
int factorTiempo = (estado == HIGH) ? 2 : 1; // Reduce a la mitad el tiempo si el sensor está activado
// Ciclo de semáforo
// Luz verde
digitalWrite(verde, HIGH);
digitalWrite(amarillo, LOW);
digitalWrite(rojo, LOW);
delay(20000 / factorTiempo); // 20 segundos normal, 10 segundos con sensor activado
// Luz amarilla
digitalWrite(verde, LOW);
digitalWrite(amarillo, HIGH);
digitalWrite(rojo, LOW);
delay(5000 / factorTiempo); // 5 segundos normal, 2.5 segundos con sensor activado
// Luz roja
digitalWrite(verde, LOW);
digitalWrite(amarillo, LOW);
digitalWrite(rojo, HIGH);
delay(10000 / factorTiempo); // 10 segundos normal, 5 segundos con sensor activado
// Manejo del servidor web
WiFiClient client = server.available(); // Escucha a los clientes entrantes
if (client) { // Si se conecta un nuevo cliente
Serial.println("New Client.");
String currentLine = "";
while (client.connected()) { // Loop mientras el cliente está conectado
if (client.available()) { // Si hay bytes para leer desde el cliente
char c = client.read(); // Lee un byte
Serial.write(c); // Imprime ese byte en el monitor serial
header += c;
if (c == '\n') { // Si el byte es un caracter de salto de línea
// Si la nueva línea está en blanco significa que es el fin del
// HTTP request del cliente, entonces respondemos:
if (currentLine.length() == 0) {
String paginaEstado;
if (digitalRead(verde) == HIGH) {
paginaEstado = "<div class='luz verde'></div><div class='luz'></div><div class='luz'></div>";
} else if (digitalRead(amarillo) == HIGH) {
paginaEstado = "<div class='luz'></div><div class='luz amarillo'></div><div class='luz'></div>";
} else if (digitalRead(rojo) == HIGH) {
paginaEstado = "<div class='luz'></div><div class='luz'></div><div class='luz rojo'></div>";
}
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println("Connection: close");
client.println();
// Muestra la página web
client.println(paginaInicio + String(estado) + paginaFin);
// La respuesta HTTP termina con una línea en blanco
client.println();
break;
} else { // Si tenemos una nueva línea limpiamos currentLine
currentLine = "";
}
} else if (c != '\r') { // Si C es distinto al caracter de retorno de carro
currentLine += c; // Lo agrega al final de currentLine
}
}
}
// Limpiamos la variable header
header = "";
// Cerramos la conexión
client.stop();
Serial.println("Client disconnected.");
Serial.println("");
}
}