arduino

Crear servidor web con NodeMCU ESP8266

En este artículo te mostraré cómo configurar la tarjeta NodeMCU como punto de acceso, AP o SoftAP para poder conectarte a ella usando WiFi y pode consultar un web server.

Dentro de la tarjeta vamos a “embeber” un servidor web, que no es otra cosa más que responder con HTML a las peticiones, pero podemos modificar ese HTML ya que tenemos el lenguaje C++ en la tarjeta.

De hecho eso hacen todos los lenguajes de programación del lado del servidor: leen peticiones y modifican HTML para mostrarlo.

Esto abre un mundo de posibilidades, pues podremos hacer bastantes cosas, pero comencemos con lo básico y es convertir la tarjeta en un servidor web.

Nota: si tú no quieres crear una red WiFi y solo quieres crear el servidor web para que se conecte a tu red WiFi (de modo que puedas acceder a él en tu red local con su IP), mira este tutorial que a su vez es más fácil.

Lecturas recomendadas

Te recomiendo configurar tu entorno con PlatformIO y después hacer el Hola mundo. Si ya has probado lo básico con esta tarjeta entonces vamos al tutorial.

Configuración de la red y el servidor web

Vamos a crear un softAP. Necesitamos definir la IP, puerta de enlace, máscara de subred, SSID (nombre de la red) y contraseña del punto de acceso.

También vamos a crear un servidor web que escuchará en el puerto 80. Todo eso se define en algunas constantes:

const char *NOMBRE_RED = "Parzibyte",
           *CLAVE_RED = "00000000"; // Son 8 ceros

const int PUERTO = 80;

IPAddress ip(192, 168, 1, 1);
IPAddress puertaDeEnlace(192, 168, 1, 1);
IPAddress mascaraDeRed(255, 255, 255, 0);

ESP8266WebServer servidor(PUERTO);

Antes de iniciar el punto de acceso necesitamos definir algunas funciones manejadoras.

Funciones del servidor

Podemos hacer que, dependiendo de la ruta que se consulte al wifi de la esp8266 se realice algo. Por ejemplo, si visitan la ruta “encender” se puede encender una bombilla, y si visitan la ruta “apagar” se puede apagar.

Por el momento solo vamos a escuchar a la raíz / y también vamos a manejar las rutas que no se encuentren, es decir, mostrar el error 404.

Si has programado con la web y los enrutadores de la misma, esto se te hará familiar. Tenemos dos funciones:

/*
Definimos funciones que serán invocadas cuando la URL solicitada
cumpla con cierta característica
*/
void rutaRaiz()
{
  const char *HtmlRespuesta = "<h1>ESP8266 como servidor web</h1>"
                              "<p>Podemos tener c&oacute;digo HTML</p>"
                              "<a href='https://parzibyte.me/blog'>By parzibyte</a>";
  servidor.send(200, "text/html", HtmlRespuesta);
}

void rutaNoEncontrada()
{
  servidor.send(404, "text/plain", "404");
}

La más importante es la que maneja la raíz. Creamos una respuesta HTML en una string, misma respuesta puede ser concatenada con variables y ser creada a partir de funciones, comparaciones, etcétera.

Para responder invocamos al método send que recibe el código HTTP (200 porque es de OK, encontrado), el tipo de respuesta (que será html) y finalmente el cuerpo.

También tenemos la función rutaNoEncontrada que envía el texto 404 así como el código HTTP 404.

Encender AP y servidor web

En el método setup vamos a crear el punto de acceso, iniciar el servidor y definir las funciones que se llamarán dependiendo de una ruta.

Fíjate en servidor.on, pues ahí definimos las ruta solicitada y la función. Después, el servidor comienza a “escuchar” con begin.

void setup()
{

  // Configurar como un access point
  WiFi.softAP(NOMBRE_RED, CLAVE_RED);
  WiFi.softAPConfig(ip, puertaDeEnlace, mascaraDeRed);
  delay(100);

  // Configuramos la ruta y la función que responderá a la solicitud de dicha ruta
  servidor.on("/", rutaRaiz);
  servidor.onNotFound(rutaNoEncontrada);
  // Empezar a escuchar
  servidor.begin();
}

Ahora, para manejar las peticiones, dentro del loop invocamos a servidor.handleClient y eso es todo:

// En el loop manejamos al cliente conectado y eso es todo ;)
void loop()
{
  servidor.handleClient();
}

Código completo

Todo el código queda como se ve a continuación:

/*

    Programado por Luis Cabrera Benito 
  ____          _____               _ _           _       
 |  _ \        |  __ \             (_) |         | |      
 | |_) |_   _  | |__) |_ _ _ __ _____| |__  _   _| |_ ___ 
 |  _ <| | | | |  ___/ _` | '__|_  / | '_ \| | | | __/ _ \
 | |_) | |_| | | |  | (_| | |   / /| | |_) | |_| | ||  __/
 |____/ \__, | |_|   \__,_|_|  /___|_|_.__/ \__, |\__\___|
         __/ |                               __/ |        
        |___/                               |___/         
    
    
    Blog:       https://parzibyte.me/blog
    Ayuda:      https://parzibyte.me/blog/contrataciones-ayuda/
    Contacto:   https://parzibyte.me/blog/contacto/
*/#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

const char *NOMBRE_RED = "Parzibyte",
           *CLAVE_RED = "00000000"; // Son 8 ceros

const int PUERTO = 80;

IPAddress ip(192, 168, 1, 1);
IPAddress puertaDeEnlace(192, 168, 1, 1);
IPAddress mascaraDeRed(255, 255, 255, 0);

ESP8266WebServer servidor(PUERTO);

/*
Definimos funciones que serán invocadas cuando la URL solicitada
cumpla con cierta característica
*/
void rutaRaiz()
{
  const char *HtmlRespuesta = "<h1>ESP8266 como servidor web</h1>"
                              "<p>Podemos tener c&oacute;digo HTML</p>"
                              "<a href='https://parzibyte.me/blog'>By parzibyte</a>";
  servidor.send(200, "text/html", HtmlRespuesta);
}

void rutaNoEncontrada()
{
  servidor.send(404, "text/plain", "404");
}

void setup()
{

  // Configurar como un access point
  WiFi.softAP(NOMBRE_RED, CLAVE_RED);
  WiFi.softAPConfig(ip, puertaDeEnlace, mascaraDeRed);
  delay(100);

  // Configuramos la ruta y la función que responderá a la solicitud de dicha ruta
  servidor.on("/", rutaRaiz);
  servidor.onNotFound(rutaNoEncontrada);
  // Empezar a escuchar
  servidor.begin();
}

// En el loop manejamos al cliente conectado y eso es todo ;)
void loop()
{
  servidor.handleClient();
}

Conectar al AP y visitar página

Ahora sube el código a la tarjeta, después conecta tu teléfono o computadora a la red recién creada. Debe aparecer como una red WiFi completamente normal.

Conectar a la red creada por ESP8266

Abre el navegador y visita la IP configurada previamente que, si no modificaste, es 192.168.1.1; se debe ver lo siguiente:

Servidor web en tarjeta NodeMCU ESP8266

¡Enhorabuena! tenemos un servidor web embebido en nuestra tarjeta. Con esto podemos hacer miles de cosas.

En próximos tutoriales te mostraré cómo encender y apagar un LED usando este servidor, y también vamos a explorar cómo convertirlo en cliente.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

5 días hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.