OBJETIVOS
El objetivo de esta práctica es es crear un servidor WiFi de área local (Wireless Local Area Network – WLAN ), configurándolo como un punto de acceso por software (Software Enabled Access Point – SoftAP o simplemente AP). Esta es una de las tres formas de conexión WiFi de que dispone el procesador ESP8266 instalado en el NodeMCU. Las otras dos formas son:
- Conexión en modo Station (STA) con un Access Point como un router, otro NodeMCU, etc. o
- Una suma de los dos modos de conexión AP + Station (AP+STA).
Este servidor lo utilizaremos para poder controlar el encendido y apagado de un LED a través los dispositivos clientes que se conecten, como PC’s, Smart Phones, Tablets, etc.
MATERIAL NECESARIO
CONCEPTOS BÁSICOS
En el modo Access Point el NodeMCU difunde un SSID (Service Set Identifier), es decir, el «nombre de red» que se visualiza desde los dispositivos WiFi clientes (salvo que lo ocultemos, por supuesto). La conexión se realiza cuando el NodeMCU autoriza las peticiones de conexión de los clientes.
Por defecto la dirección IP del NodeMCU, que nos sirve para conectar con él desde un navegador Web, es la 192.168.4.1 y asigna a los clientes las siguientes direcciones IP disponibles, 192.168.4.2, 192.168.4.3, etc.
Vamos a hacer un repaso de las funciones más importantes de la librería ESP8266WiFi.h, utilizadas por el ESP8266 para trabajar en modo Access Point (AP):
WiFi.softAP (ssid, password, channel, hidden)
El software que permite a un dispositivo que no ha sido específicamente construido como un router, convertirse en un punto de acceso WiFi (router virtual) se conoce como Software Enabled Access Point, o abreviadamente SoftAP.
Para crear el Access Point con el NodeMCU recurrimos a este software a través de la instrucción WiFi.softAP(ssid, password, channel, hidden). Los cuatro parámetros que la componen se definen a continuación:
- ssdi: es un parámetro obligatorio, el nombre de red, SSID(Service Set Identifier). Debe tener entre 8 y 63 caracteres.
- password: es un parámetro opcional, la clave. Para una conexión WPA2-PSK debe tener al menos 8 caracteres. Si no se especifica, el Access Point estará abierto a los clientes.
- channel: es un parámetro opcional, para establecer el canal WiFi de comunicación. Los canales válidos son del 1 al 13, por defecto se utiliza el canal 1.
- hidden: es un parámetro opcional, para permitir ver u ocultar el SSID. 1 permite ver la red y 0 la oculta.
WiFi.softAPdisconnect()
La instrucción para finalizar la conexión de los dispositivos conectados al Access Point es Wifi.softAPdisconnect().
WiFi.softAPConfig (local_ip, gateway, subnet)
Como hemos comentado, la red creada por softAP tiene la dirección IP 192.168.4.1. Esta dirección se puede cambiar utilizando la instrucción WiFi.softAPConfig(local_ip, gateway, subnet). Los tres parámetros que la componen se definen a continuación:
- local_ip: dirección IP del Access Point.
- gateway: es la dirección IP de la pasarela o puerta de enlace (puede coincidir con la local_ip).
- subnet: dirección IP de la subred.
WiFi.softAPIP ()
Devuelve la dirección IP con la que se ha creado la conexión (AccessPoint). Por defecto la dirección IP será: 192.168.4.1.
WiFi.softAPmacAddress(macAddr)
Para conocer la dirección MAC del AccessPoint utilizamos la función Wifi.softAPmacAddress(macAddr). El parámetro macAddr es voluntario, y es un array de seis elementos que permite almacenar cada uno de los elementos de la dirección MAC.
WiFi.softAPgetStationNum()
Para ver el número de dispositivos conectados (clientes/estaciones), utilizamos la instrucción WiFi.softAPgetStationNum(). Como máximo se pueden conectar cinco dispositivos.
Una vez repasado esto, estaremos listos para construir el circuito y subir el sketch a la placa NodeMCU.
CIRCUITO ELECTRÓNICO
El circuito que debemos conexionar es el siguiente:
El LED estará conectado en el puerto GPIO02 (D4).
Este LED, como comprobaremos, está relacionado en lógica inversa con el LED que tiene el ESP8266 del NodeMCU junto a la antena. Esto significa que cuando un LED se enciende, el otro se apaga.
SKETCH
En el sketch se hace un repaso de todas las funciones vistas de la librería ESP8266WiFi.h. Se han añadido comentarios para facilitar su seguimiento.
Así mismo, y con el mismo objetivo, podemos ver a continuación el código HTML de la página Web insertada en el sketch, que hace de interfaz gráfico, para interactuar con el LED (encenderlo y apagarlo):
<!DOCTYPE HTML> <meta charset='UTF-8'> <html> <!--Se envía el estado del LED en función del estado del puerto GPIO--> <h1>El LED está ahora: APAGADO/ENCENDIDO</h1> <!--Se crean enlaces para modificar el estado del LED--> <p>Presiona <a href='/LED=ON'>AQUÍ</a> para encender el LED</p> <p>Presiona <a href='/LED=OFF'>AQUÍ</a> para apagar el LED</p> <br> <!--Se crean cajas de comprobación (checkbox) para modificar el estado del LED--> <input type='checkbox' onClick=location.href='/LED=ON'> ENCENDER </input> <br> <input type='checkbox' onClick=location.href='/LED=OFF'> APAGAR </input> <br><br> <!--Se crean botones para modificar el estado del LED--> <button type='button' onClick=location.href='/LED=ON'> ENCENDER </button> <button type='button' onClick=location.href='/LED=OFF'> APAGAR </button> <br><br> <!--Se crean botones con estilos para modificar el estado del LED--> <button type='button' onClick=location.href='/LED=ON' style='margin:auto; background-color:green; color:#A9F5A9; padding:5px; border:2px solid black; width:200;'><h2> ENCENDER</h2> </button> <button type='button' onClick=location.href='/LED=OFF' style='margin:auto; background-color:red; color:#F6D8CE; padding:5px; border:2px solid black; width:200;'><h2> APAGAR</h2> </button> <br><br> <!--Se crea un único botón para modificar el estado del LED--> <!--Se hace la pregunta en función del estado del puerto GPIO--> <button type='button' onClick=location.href='/LED=ON/OFF'> ENCENDER/APAGAR </button> </html>
Un navegador Web visualizará la página HTML así:
Como se puede observar, se han introducido varios controles/botones para encender o apagar el LED, utilizando diferentes elementos HTML como <a>, <checkbox> o <button>.
Lo que tienen en común todos ellos, en su funcionamiento, es la forma en que se realiza la petición desde el cliente, a través del navegador al servidor (NodeMCU). En la petición, para lograr la comunicación se une la IP (obtenida con la propiedad ref) con la cadena «/LED=ON» o «/LED=OFF» en función de lo que hayamos pulsado. Quedaría así:
http://192.168.4.1/LED=ON o http://192.168.4.1/LED=ON
De esta manera el NodeMCU, recibe la petición «/LED=ON» o «/LED=OFF» y la analiza utilizando la función peticion.indexOf(), para determinar las acciones a realizar.
El sketch a subir al NodeMCU será el siguiente:
/* NodeMCU Access Point - Servidor Web por Dani No www.esploradores.com Crea un servidor Web en modo Access Point que permite encender y apagar un LED conectado a la salida D4 (GPIO02) del módulo NodeMCU. Este código de ejemplo es de público dominio. */ #include <ESP8266WiFi.h> //Incluye la librería ESP8266WiFi const char ssid[] = "NodeMCU-ESP8266"; //Definimos la SSDI de nuestro servidor WiFi -nombre de red- const char password[] = "12345678"; //Definimos la contraseña de nuestro servidor WiFiServer server(80); //Definimos el puerto de comunicaciones int PinLED = 2; //Definimos el pin de salida - GPIO2 / D4 int estado = LOW; //Definimos la variable que va a recoger el estado del LED void setup() { Serial.begin(115200); pinMode(PinLED, OUTPUT); //Inicializamos el GPIO2 como salida digitalWrite(PinLED, LOW); //Dejamos inicialmente el GPIO2 apagado server.begin(); //inicializamos el servidor WiFi.mode(WIFI_AP); WiFi.softAP(ssid, password); //Red con clave, en el canal 1 y visible //WiFi.softAP(ssid, password,3,1); //Red con clave, en el canal 3 y visible //WiFi.softAP(ssid); //Red abierta Serial.println(); Serial.print("Direccion IP Access Point - por defecto: "); //Imprime la dirección IP Serial.println(WiFi.softAPIP()); Serial.print("Direccion MAC Access Point: "); //Imprime la dirección MAC Serial.println(WiFi.softAPmacAddress()); //IPAddress local_ip(192, 168, 1, 1); //Modifica la dirección IP //IPAddress gateway(192, 168, 1, 1); //IPAddress subnet(255, 255, 255, 0); //WiFi.softAPConfig(local_ip, gateway, subnet); //Serial.println(); //Serial.print("Access Point - Nueva direccion IP: "); //Serial.println(WiFi.softAPIP()); } void loop() { // Comprueba si el cliente ha conectado WiFiClient client = server.available(); if (!client) { return; } // Espera hasta que el cliente envía alguna petición Serial.println("nuevo cliente"); while(!client.available()){ delay(1); } // Imprime el número de clientes conectados Serial.printf("Clientes conectados al Access Point: %dn", WiFi.softAPgetStationNum()); // Lee la petición String peticion = client.readStringUntil('r'); Serial.println(peticion); client.flush(); // Comprueba la petición if (peticion.indexOf('/LED=ON') != -1) { estado = HIGH; } if (peticion.indexOf('/LED=OFF') != -1){ estado = LOW; } //Enciende o apaga el LED en función de la petición digitalWrite(PinLED, estado); // Envía la página HTML de respuesta al cliente client.println("HTTP/1.1 200 OK"); client.println(""); //No olvidar esta línea de separación client.println("<!DOCTYPE HTML>"); client.println("<meta charset='UTF-8'>"); client.println("<html>"); //Imprime el estado del led client.print("<h1>El LED está ahora: "); if(estado == HIGH) { client.print("ENCENDIDO</h1>"); } else { client.print("APAGADO</h1>"); } //Se crean enlaces para modificar el estado del LED client.println("Presiona <a href='/LED=ON'>AQUÍ</a> para encender el LED<br>"); client.println("Presiona <a href='/LED=OFF'>AQUÍ</a> para apagar el LED<br><br>"); //Se crean cajas de comprobación (checkbox) para modificar el estado del LED client.println("<input type='checkbox' onClick=location.href='/LED=ON'> ENCENDER </input><br>"); client.println("<input type='checkbox' onClick=location.href='/LED=OFF'> APAGAR </input><br><br>"); //Se crean botones para modificar el estado del LED client.println("<button type='button' onClick=location.href='/LED=ON'> ENCENDER </button>"); client.println("<button type='button' onClick=location.href='/LED=OFF'> APAGAR </button><br><br>"); //Se crean botones con estilos para modificar el estado del LED client.println("<button type='button' onClick=location.href='/LED=ON' style='margin:auto; background-color:green; color:#A9F5A9; padding:5px; border:2px solid black; width:200;'><h2> ENCENDER</h2> </button>"); client.println("<button type='button' onClick=location.href='/LED=OFF' style='margin:auto; background-color:red; color:#F6D8CE; padding:5px; border:2px solid black; width:200;'><h2> APAGAR</h2> </button><br><br>"); //Se crea un único botón para modificar el estado del LED if(estado == HIGH) { client.print("<button type='button' onClick=location.href='/LED=OFF'> APAGAR </button><br><br>"); } else { client.print("<button type='button' onClick=location.href='/LED=ON'> ENCENDER </button><br><br>"); } client.println("</html>"); delay(1); Serial.println("Petición finalizada"); // Se finaliza la petición al cliente. Se inicaliza la espera de una nueva petición. //Desconexión de los clientes //WiFi.softAPdisconnect(); }
CONEXIÓN CON EL ACCESS POINT
Para poder conectar con la red WiFi realizaremos los siguientes pasos:
- Desde el dispositivo cliente -con el que queremos conectar- (PC, Smart Phone, Tablet…) buscaremos las redes WiFi visibles.
- Conectaremos con la red NodeMCU-ESP8266 con la clave 12345678.
- Abriremos nuestro navegador Web e iremos a la dirección http://192.168.4.1
En el navegador aparecerá el texto para verificar el estado del LED y los botones para controlar su encendido y apagado.
38 Comments
Leave your reply.