Introducción a la librería WIFIMANAGER.

PARA LA FAMILIA ESP.

INTRODUCCIÓN.

En el mundo del IoT que utiliza los populares ESP8266 disponen de WiFi y debe saber que, para conectar una placa como ESP8266 o NodeMCU a una red WiFi, tenemos que empezar por configurar en el programa o código, un cierto nivel de seguridad los parámetros de red SSID y el Password de la red a la que conectarnos. En otros palabras, en el setup(), configuramos el ESP8266 como cliente WiFi en modo estación (STA), iniciando la conexión a la que le pasamos el nombre de nuestra red y la contraseña, veamos.

 	#include  // librería.
 	const char* SSID = "yourssid"; // ssid de la red
 	const char* PASSWORD = "yourpassword"; // clave de la red
 	
 	WiFi.mode(WIFI_STA); // Modo cliente WiFi
 	WiFi.begin("Nombre_WiFi", "Contraseña"); // por ejemplo.
 	...
 	// sigue el programa.

Verificamos y cargamos el programa en el ESP, y si todo es correcto el proyecto queda en funcionamiento. Este proceso a la larga presenta un inconveniente ¿qué sucede si uno de estos dos parámetros cambia? o sea, si nos vamos a otro lugar con otra red WiFi. En cualquiera de estos casos nos saltará un error que nos impide la normal conexión.

Entonces, tenemos que modificar y cargar de nuevo el programa, cada vez que cambiamos de red WiFi a la que se ha de conectar, repetiremos la operación, no es que sea un problema insalvable. Aunque sería más práctico no tener que cambiar el programa y volverlo a cargar.

También yo he realizado algunas pruebas conectando el ESP8266 a una red local utilizando credenciales codificadas con métodos que almacenan el SSID y el Password de una red, pero no es muy conveniente ni práctico para los proyectos acabados. Sería mejor poder elegir la red a usar en tiempo de ejecución. Eso es exactamente lo que nos aporta la librería WifiManager y otras similares que por el momento no veremos aquí.

Alguien dijo: Por lo general, uno debe programar la lógica de su sistema, implementar la comunicación, implementar el control y crear la infraestructura para ejecutar todo esto. Aunque hay sistemas que resuelven algunos de estos problemas, ya sea de código abierto o comercial, son complejos de programar.

En todas las compañías que ofertan estas posibilidades, usted siempre tiene que registrarse, para lo cual tiene que ingresar datos relevantes sobre usted. Hay una opción que no necesita depender de estas empresas, con crear un AP (Punto de Acceso) y así poder conectarse a la red.

Esta es una razón más que interesante para utilizar la librería WifiManager.

LIBRERÍA WIFIMANAGER.

Efectivamente, ese mismo problema lo había padecido entre otros, un tal Tzapu, al que se le ocurrió crear una librería que sirve precisamente para resolver el problema, se trata de una librería que nos permite dotar a los dispositivos del IoT de algo más de libertad, las pruebas de Tzapu ya eran registradas en 2015.

La librería WiFiManager es una librería de código abierto que permite configurar los parámetros de una red WiFi desde un móvil en un ESP8266, de forma rápida sin cargar un nuevo código y además tiene otras funcionalidades. Esta librería, no necesitamos descargarla ya viene integrada en el Gestor de bibliotecas de Arduino.

Fig. 1 Gestor de librerías WiFiManager.

Como de costumbre, analicemos un caso. Cuando nos llevamos el proyecto basado en el ESP8266 a otro sitio donde hay otra red WiFi, como se ha dicho, tenemos que editar el código y modificar el SSID y el Password de la nueva red WiFi. En esta ocasión considero que usted tiene conocimientos suficientes de los entornos Arduino y ESP8266. Si lo cree necesario puede leer el contenido de la documentación de ESP8266 Arduino Core, para salir de dudas.

Fig. 2 Pinout del nodeMCU-ESP12

Librerías que se debe incluir en el boceto:

#include  < ESP8266WiFi.h >  // Biblioteca básica de ESP8266 WiFi 
#include  < DNSServer.h >  // Servidor DNS local usado para redirigir todas 
			    // las solicitudes al portal de configuración 
#include  < ESP8266WebServer.h >  // Servidor web local usado para 
                               // servir el portal de configuración. 
	  // https://github.com/tzapu/WiFiManager WiFi Configuration Magic
#include  < WiFiManager.h >

EL CÓDIGO

La autoría del código pertenece a Fernando Koyanagi, al que saludo y agradezco su trabajo desde esta página.

// config_wifimanager.ino
//
 
#if defined(ESP8266)
#include < ESP8266WiFi.h > //ESP8266WiFi.h .- ESP8266 Core WiFi Library
#else
#include < WiFi.h >  //WiFi.h .- ESP32 Core WiFi Library
#endif
 
#if defined(ESP8266)
 
#include < ESP8266WebServer.h > //ESP8266WebServer.h .- Servidor web local utilizado para servir el portal de configuración
 
#else
 
#include < WebServer.h > //WebServer.h .- Servidor DNS local utilizado para redireccionar todas las solicitudes al portal de configuración (https://github.com/zhouhan0126/DNSServer---esp32)
#endif
 
#include < DNSServer.h >//DNSServer.h .- Local WebServer usado para servir el portal de configuración (https://github.com/zhouhan0126/DNSServer---esp32)
#include < WiFiManager.h > //WiFiManager.h .- WiFi Configuration Magic (https://github.com/zhouhan0126/DNSServer---esp32) >> https://github.com/zhouhan0126/DNSServer---esp32 (ORIGINAL)
 
const int PIN_AP = 2; // pulsador para volver al modo AP
 
void configModeCallback (WiFiManager *myWiFiManager) {
 Serial.println("Modo de configuración ingresado");
 Serial.println(WiFi.softAPIP());
 
 Serial.println(myWiFiManager->getConfigPortalSSID());
}
 
//flag for saving data
bool shouldSaveConfig = false;
 
// En https://github.com/tzapu/WiFiManager
//callback notifying us of the need to save config
 
void saveConfigCallback () {
 Serial.println("Debería guardar la configuración");
 shouldSaveConfig = true;
}
 
void setup() {
 Serial.begin(9600);
 pinMode(PIN_AP, INPUT);
 //declaración de objeto wifiManager
 WiFiManager wifiManager;
 
 // utilizando ese comando, como las configuraciones se apagarán en la memoria
 // en caso de que la redacción se conecte automáticamente, ella é apagada.
 // wifiManager.resetSettings();
 
 //devolución de llamada para cuando entra en el modo de configuración AP
 wifiManager.setAPCallback(configModeCallback);
 //devolución de llamada cuando se conecta a una red, es decir, cuando pasa a trabajar en modo EST
 wifiManager.setSaveConfigCallback(saveConfigCallback);
 
 //crea una red de nombre ESP_AP con pass 12345678
 wifiManager.autoConnect("ESP_AP", "12345678");
}
 
void loop() {
 
 WiFiManager wifiManager;
 //si el botón se ha presionado
 if ( digitalRead(PIN_AP) == HIGH ) {
  Serial.println("reajustar"); //resetear intenta abrir el portal
  if(!wifiManager.startConfigPortal("ESP_AP", "12345678") ){
   Serial.println("No se pudo conectar");
   delay(2000);
   ESP.restart();
   delay(1000);
  }
  Serial.println("conectado ESP_AP!!!");
 }
}

Abra el monitor serial y debe obtener un resultado similar al mostrado en la figura.

Fig. 3 Monitor AutoConnect

Cuando se realiza una conexión exitosa, el ESP8266 recuerda las credenciales e intenta conectarse a la misma red la próxima vez. Si no puede conectarse, usa el modo AP para mostrar la página de conexión nuevamente.

WifiManager usa el modo de punto de acceso y el modo de estación juntos. Utiliza el modo AP para la página de conexión que está disponible bajo la red propia del ESP8266 y en una dirección IP conocida (192.168.4.1) y luego usa el modo STA para conectarse a la red local.

Cuando está conectado a Internet y cuando está conectado a la red del dispositivo ESP, cualquier solicitud a cualquier nombre de dominio se redirige a este nombre de dominio en el dispositivo. La dirección IP 192.168.1.4 también funciona pero no existe en Internet.

La librería WiFiManager permite que el ESP8266 se conecte a la red local WiFi preconfigurada. En el caso de que no pueda realizar la conexión guardada previamente, pasa al modo de punto de acceso (AP), activa un portal cautivo, un servidor DNS y un servidor web (IP predeterminado 192.168.4.1). Entonces, desde cualquier dispositivo con WiFi, se conecta a ese punto de acceso. La siguiente es una vista desde un móvil.

Fig. 4 Portal cautivo.

Así, mediante el portal cautivo y el servidor DNS, se obtendrá un tipo de ventana emergente como la mostrada, que nos permite elegir y configurar una red. Pulse sobre el botón Configure WiFi , se mostrarán las redes a su alcance, elija una e ingrese la contraseña de la red elegida y haga clic en guardar, sin necesidad de editar una sola línea de código. Si tiene éxito, le devuelve el control a su aplicación, si no, vuelva a conectarse a AP y reconfigure.

Fig. 5 Listado de redes.

Para volver a conectarse, tiene la opción de conectar un pulsador con una resistencia como se muestra en la figura 3, al pulsar vuelve a iniciarse en modo AP. Esta es una de las utilidades de esta librería, si prevemos que nuestro proyecto puede utilizar diferentes redes WiFi.

Fig. 6 Reconectar a AP.

Recapitulando: Con nuestro ESP8266 WiFi usando la librería WiFiManager, se crea un punto de acceso (AP), después mediante el portal cautivo y el servidor DNS, a través del IP predeterminado 192.168.4.1 nos mostrará una ventana emergente AutoConnectAP, así, obtenemos las redes locales accesibles, seleccionamos una y una vez configurada la guardamos, para en otra ocasión poder conectarnos a ella.

A continuación el ESP8266 se reiniciará e intentará conectarse a la red, funcionando en modo STA como estación y ya no como AP punto de acceso. Para volver iniciar en modo AP sólo, a través del botón de la figura anterior.

El ESP se inicia e intenta conectarse a un Punto de acceso guardado previamente, si esto no tiene éxito (o si no se guardó ninguna red anterior), el ESP pasa al modo de Punto de acceso y hace funcionar un DNS y un Servidor web (ip predeterminado 192.168.4.1). Ahora, utilizando cualquier dispositivo (computadora, teléfono, tableta) habilitado para WiFi con un navegador, conéctese al punto de acceso recién creado. Mediante el portal cautivo y al servidor DNS, obtendrá una ventana emergente u obtendrá cualquier dominio al que intente acceder redirigido al portal de configuración.

Observese que los ESP8266 y su familia no disponen de un hardware de seguridad que encripte la comunicación, sin embargo la librería WIFI incluye funciones de encriptación por software, por lo tanto podemos acceder de forma similar a los sitios HTTPS, con el inconveniente de ocupar sobre 20kB de memoria, lo que debe tenerse en cuenta.

FILTRO DE REDES.

Puede filtrar redes según la calidad de la señal y mostrar/ocultar redes duplicadas. Para filtrar redes de baja calidad de señal, puede indicar a WiFiManager que no muestre redes por debajo de un % de calidad arbitrario;

wifiManager.setMinimumSignalQuality (10);

Con lo que no mostrará redes con un 10% de calidad de señal.

Además, puede eliminar o mostrar redes duplicadas (la opción predeterminada es eliminar). Utilice esta función para mostrar (u ocultar) todas las redes.

wifiManager.setRemoveDuplicateAPs(false);

Cuando se realiza una conexión exitosa, el ESP8266 recuerda las credenciales e intenta conectarse a la misma red la próxima vez. Si no puede conectarse, usa el modo AP para mostrar la página de conexión nuevamente.

WifiManager usa el modo de punto de acceso y el modo de estación juntos. Utiliza el modo AP para la página de conexión que está disponible bajo la red propia del ESP8266 y en una dirección IP conocida (192.168.4.1) y luego usa el modo STA para conectarse a la red local.

SOLUCIÓN DE ALGUNOS PROBLEMAS.

Ante errores de compilación, la mayoría de las veces, es posible que deba instalar una versión más reciente o anterior del núcleo ESP8266 para Arduino, en mi experiencia desinstalé la versión 2.5.0 beta y volví a instalar la versión 2.4.1 y pude compilar sin problemas.

Si se conecta al punto de acceso de configuración creado pero el portal de configuración no se muestra, simplemente abra un navegador y escriba la IP del portal web, de forma predeterminada 192.168.4.1.

Personalmente he utilizado el siguiente código y se que funciona bien. Pruebe usted si consigue poner en servicio esta librería. Copie y guarde este código con un nombre, compile y suba a su ESP y compruebe su funcionalidad.

Si su boceto no se compila y devuelve un error similar a este:

FindFirstFile C:\Users\XXXX\AppData\Local\Temp\arduino_build_358945: El sistema no puede encontrar el archivo especificado. 
Error compilando para la tarjeta NodeMCU 1.0 (ESP-12E Module).

Lo más probable es que esté utilizando Firmware Beta 2.5.0 para el ESP8266. Esta actualización rompe la compatibilidad con ArduinoHttpClient(que es utilizada por Adafruit IO, actualmente no es compatible con este firmware beta).

Para que funcione, bajaremos el firmware del ESP8266 a una versión estable, vaya a: Herramientas/ Tarjetas/ Administrador de tarjetas y seleccione la versión 2.4.2 de ESP8266 by ESP8266 Community, esto es así, en estos momentos.

Esto es todo, por este simple tutorial.

REFERENCIAS.
  • http://pdacontroles.com/introduccion-libreria-wifimanager/
  • https://www.youtube.com/watch?v=8_R7nzvuVZI
  • https://texolab.net/2018/10/24/wifi-manager-para-esp8266/
  • https://programarfacil.com/esp8266/wifimanager-configura-wifi-esp8266/

2 comentarios sobre «Introducción a la librería WIFIMANAGER.»

  1. Buen dia,estoy utilizando el ESP 8266 0.9 (LOLIN) y al cortarse la alimentacion y volver quedan todas las salidas en estado alto,dejando todas las lamparas encendidas,cual seria la solucion ,gracias

    1. Hola victor luis quintili.
      Supongo ya que no lo especificas que estás utilizando relés para encender las lamparas.
      Aunque no conozco exactamente el ESP8266 0.9 (LOLIN), creo recordar que las salidas se ponen en estado de alta impedancia, es decir, no tienen establecido un valor digital, por lo tanto cada fabricante de la placa en concreto realiza un software según su idea de usabilidad en su dispositivo. Tengo entendido que no todas las salidas son a Alto, ya que los GPIOs se utilizan según el fabricante.
      Motivo por el cual no tengo capacidad de respuesta. Si la salida por defecto es Alta, prueba a activar las pull-down para que en cualquier caso sus salidas sean a Bajo, que es lo que te interesa.

      También, puedes probar a utilizar una salida del relé inversa, me explico, si utilizas un contacto NO (normalmente abierto) al iniciarse el ESP, lo cambias por un contacto NC (normalmente cerrado).

      Espero te sirva lo descrito.

      Saludos.

      P.D. 07.04.2019
      Hola victor, he encontrado una referencias a un hecho similar al que tu indicas, no se si te sirve, lo puedes encontrar en este enlace: https://community.openhab.org/t/power-cut-recovery/71568
      Espero te sirva de orientación.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.