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.
1 2 3 4 5 6 7 8 |
#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:
1 2 3 4 5 6 7 |
#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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
// 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.
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.
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.
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;
1 |
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.
1 |
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:
1 2 |
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/
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
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.
Con un transistor npn o pnp dependiendo del problema de cada uno. Solo pasará la señal cuando se active. Busca un poco más sobre los transistores es muy sencillo.
Cordial saludo:
Como puedo editar en el pantallazo del access point, como puedo editar para que no salga el texto «wifimanager» y que se pueda poner una imagen de fondo?
Te dejo link con la solucion
Agradezco te suscribas al mi canal,
Recien empiezo y la idea es dejar muy buen contenido
Link con tutorial para actualizar portal cautivo———————> https://youtu.be/nb4AvYcy2G8
Link with tutorial to update captive portal ———————> https://youtu.be/nb4AvYcy2G8
buen día, saludos desde México, antes que nada gracias por la aportación, tengo una pregunta, también servirá este sistema para configurara el wifi en el modulo esp32?
Hola Adrian Sanchez.
Lamentablemente directamente no es posible, porque cambian en parte las propias librerías sobre todo.
Tendrás que hacerlo con el método acierto/error, lo siento no puedo ayudarte.
Saludos.
Hola , se tendría que guardar las credenciales del wifi en eeprom y al apagarse la nodemcu se tendría de conectar de nuevo correcto?? porque no pasa asi conmigo.
que podría ser?
Hola Fer.
Entiendo tu frustración, el problema es bastante recurrente y tendrás que acudir a preguntas frecuentes de la librería WiFi al parecer tenían que actualizar dicha librería y daban cierta información para superar el problema. Lamento no disponer en estos momentos de más información al respecto.
Saludos.
Estimado, estoy con una ESP32 y usando la libreria AsyncWiFiManager, se pone en AP, luego elijo la red WiFi que deseo usar y va perfecto. El tema es cuando quiero cambiar de red WiFi, no se como resetear o borrar las credenciales de la red WiFi que estaba configurada anteriormente( Aclaro, tengo 2 redes Wifi en mi casa, y quiero alternar de vez en cuando el uso de las mismas con la ESP), y no quiero apagar el Router para que se ponga la ESP32 en modo AP, quiero ponerla manualmente o por software en modo AP. Use wifiManager.resetSettings(); pero no pasa nada, al reiniciar la ESP32 vuelve a conectarse al wifi guardado, agradezco cualquier ayuda
Hola Waldo.
De lo que me indicas deduzco que deberías añadir una opción en el código que elimine el contenido de parte de la memoria en la que se queda al momento de hacer el cambio, no se si me he explicado.
Es lo primero que se me ha ocurrido. No he tenido la ocasión de probarlo, pues estoy en otra etapa y no tengo tiempo para probar esto.
Espero haber aclarado mi intuición. Ya me dices que tal te parece.
Saludos
Saludos cordiales, una consulta los datos de la configuración de la red a la que te unes, se guarda en spiffs o la eeprom?. gracias de antemano por la respuesta.
Adicionalmente se que es un poco tardía la respuesta a la pregunta anterior de Waldo, hay una opción para que mediante un pulsador puedes poner en modo AP, ya esta implementada en uno de los ejemplos. Coloco la respuesta por si alguien mas lo necesita.
Hola Eduardo
Si no se dice lo contrario, un programa guarda la información en la propia EEPROM. Para guardar información en el SPIFFS, se ha de llamar expresamente a SPIFFS, que es una parte de la EEPROM reservada para casos muy concretos.
Saludos y cuídate.
Dejo link para los interesados en personalizar el portal cautivo de la libreria Wifimanager para el ESP32: https://youtu.be/nb4AvYcy2G8