// Cargamos la libreria WiFi
#include <WiFi.h>
// Despues debemos definir un nombre SSID y una contraseña para acceder al ESP32.
// Personalizamos con el nombre que se quiere que la Red tenga
const char* ssid= "Prueba-ConexionESP32";
const char* password = "123456789";
// Posteriormente definimos un puerto para el Web Server del ESP 32.
// Ponemos el Puerto del Web Server en 80
WiFiServer server(80);
//Creamos una variable para almacenar el header (Encabezado) de la petición HTTP.
// Variable para guardar la peticion HTTP
String header;
// Creamos variables para almacenar el estado de nuestras salidas.
// Si se desea agregar mas salidas y su estado, se deben crear mas variables.
String output26State = "off";
String output27State = "off";
// Posteriormente asignaremos un GPIO a cada una de las salidas, en este ejemplo
// usaremos el GPIO 2 y el GPIO 27 (Puede usarse cualquier GPIO que cumpla con la característica de ser salida).
// Asignar las variables de salida a los pines GPIO
const int output26 = 2;
const int output27 = 27;
void setup() {
Serial.begin(115200);
// Inicializamos las variables de salida como salidas
pinMode(output26, OUTPUT);
pinMode(output27, OUTPUT);
// Ponemos las salidas en BAJO
digitalWrite(output26, LOW);
digitalWrite(output27, LOW);
// Se da el texto que indica que se iniciara conexión Wi-Fi
// con SSID y contraseña
Serial.print("Setting AP (Access Point)…");
// Una vez indicado esto hay que programar que el ESP32 funcionara como AP.
// Se configura el ESP32 como AP, si se desea que el AP este abierto a cualquier persona
// se deberá eliminar el parametro password.
WiFi.softAP(ssid, password);
IPAddress IP = WiFi.softAPIP();
Serial.print("AP IP address: ");
Serial.println(IP);
//Se inicializa el servidor. Y con ello cerramos el SETUP.
server.begin();
}
void loop(){
//El loop() es la parte de programa que se encarga de realizar alguna
//acción cuando un nuevo cliente establece conexión con el ESP32 y su web server.
//Para ello el ESP32 deberá ‘’escuchar’’ (Esperar) por clientes nuevos con la siguiente línea de codigo:
WiFiClient client = server.available(); // Se escucha a los clients que vienen
if (client) { // Si un nuevo cliente se conecta,
Serial.println("New Client."); // Se imprime un mensaje en el Puerto serial
String currentLine = ""; // Se genera una string para almacenar la información que el cliente envia
while (client.connected()) { // Se genera un while que sirve como bucle mientras el cliente se mantenga conectado
if (client.available()) { // Si hay bytes que leer del cliente
char c = client.read(); // Se lee el byte, entonces
Serial.write(c); // Se imprime en el monitor serial
header += c;
if (c == '\n') { // Si el byte es un caracter newlines (Si es un nuevo caracter y hay espaciado)
//(El caracter newline implica un movimiento a siguiente linea en una página)
// Si la linea esta en blanco, Se obtienen 2 caracteres de newline seguidos.
// Ese es el fin de la petición HTTP del cliente, asi que se envia una respuesta:
if (currentLine.length() == 0) {
// Los encabezados HTTP siempre inician con un codigo de respuesta(p.ej.HTTP/1.1 200 OK)
// Y un tipo de contenido, asi el cliente sabra que viene y luego una linea en blanco:
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println("Connection: close");
client.println();
// Prende y apaga los GPIOs
if (header.indexOf("GET /on") >= 0) {
Serial.println("GPIO 26 on");
output26State = "on";
digitalWrite(output26, HIGH);
} else if (header.indexOf("GET /off") >= 0) {
Serial.println("GPIO 26 off");
output26State = "off";
digitalWrite(output26, LOW);
//Por ejemplo si presionas en el boton de encendido del GPIO 26,
//el ESP32 recibe una petición en la URL de /On
//(Esa información se puede verificar en el encabezado HTTP del monitor serial).
//Asi que Podemos revisar que el encabezado contenga la expression GET /on. Si la contiene,
//cambiamos el estado de salida 26 (Output26state) a ON, y el ESP32 prende el Led.
//El funcionamiento es similar en todos los botones,
//lo unico que hay que hacer es modificar esta seccion de codigo.
}
// Desplegar la Pagina HTML
//La información puede ser desplegada en una pagina HTML,
//esta parte no la usaremos ya que haremos una Apk con MIT APP INVENTOR,
//por lo que únicamente tendremos que agregar la siguiente sección de código
client.println("<!DOCTYPE html><html>");
client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
client.println("<link rel=\"icon\" href=\"data:,\">");
client.println("</head>");
client.println("<body></body>");
client.println("</html>");
client.println();
// Salir (Break out) del loop del while
break;
} else { //// Si obtienes una nueve linea (newline), entonces limpia la linea actual
currentLine = "";
}
} else if (c != '\r') { // Si obtuviste un acarreo entonces regresa el caracter,
currentLine += c; // Agregalo a la linea actual
}
}
}
//Finalmente, cuando la respuesta acaba, limpiamos la variable del encabezado (header),
//y detenemos la conexión con el cliente client.stop().
header = "";
// Cerramos/Terminamos la conexión
client.stop();
Serial.println("Client disconnected.");
Serial.println("");
}
}