Introduction: Esp8266 Servidor De Configuración Y De Páginas Dinámicas (Software En Lua)

Hola soy Jacinto, de la España de los corruptos, parado de larga duración, es mi primer instructable y voy a presentar un proyecto en el que llevo un tiempo trabajando.

Es un servidor web para el Esp8266 basado escrito en lua. En un principio lo desarrollé para configurar el Esp8266 mediante un interfaz web, pero se me empezaron a ocurrir nuevas ideas/problemas y lo fuí ampliando. De momento el software es capaz de:

  • Configurar el Esp8266 via web. Le puedes cambiar todos los parámetros, ponerlo como Station, como Ap y como ambos. Configurar las ip,macs, gateway, scanear redes cercanas para conectarte, etc.
  • Via web puedo hacer: subir ficheros al esp8266 por wifi, borrar ficheros, renombrarlos y compilarlos. No importa el tamaño del/los ficheros siempre que quepan en el esp8266.
  • Puede servir ficheros html,js,jpg, lo que te dé la gana, no importa el tamaño. Eso sí, cuanto más grande, más lento en enviar los ficheros a quien se los haya pedido.
  • Acepta multiples peticiones. En realidad las pone en una cola y las va atendiendo cuando termina la anterior, por orden de llegada.
  • Se puede hacer html dinámico, me explico: tengo una página web muy bonita, que me muestra la temperatura, la tengo en html guardada en el Esp8266. Esa página tiene un elemento dinámico la temperatura que tiene que ser actualizada. El software tiene dos maneras de actualizar el elemento dinámico, mediante Ajax, o por sustitución. Por sustitución sería que en el html tengo una palabra clave por ejemplo LUA_TEMPERATURA, luego le digo al software que en el fichero html tiene que sustituir la palabra LUA_TEMPERATURA por el valor real del sensor de temperatura y enviar el fichero html ya con una temperatura. No sé si me explico, lo que hace es una sustitución en el fichero html, de LUA_TEMPERATURA por 21º por ejemplo.

Luego tiene muchos fallos o mejoras: faltan muchas validaciones en los campos de entrada, que pueden provocar reseteos del Esp8266 al intentar ciertas configuraciones. Mejoras por ejemplo, servir ficheros comprimidos .zip, con lo cual si son páginas estáticas serían mucho más rápidas de enviar.

Step 1: Descarga La Ultima Versión Del Firmware Del Nodemcu

El software en principio sólo funciona en los Esp8266 con un mega mínimo. Con los de 512k podría funcionar supongo si se suben directamente los ficheros .lua compilados y que no los tenga que compilar el Esp8266.

Lo primero que tenemos que hacer es instalar el último firmware disponible. Conozco dos maneras de hacerlo, una, la más fácil es ir a la página:

https://nodemcu-build.com/

Existen una serie de módulos que puedes añadir, el software sólo necesita los seleccionados por defecto. Luego si tu vas a hacer algo con PWM, pues seleccionas el módulo y ya tendrías una librería incluida que te ayudará a hacer el PWM y así con lo demás. Entiendo que si pones todos, pues dependiendo del Esp8266 que tengas se quedará sin memoria o no. También puedes coger las por defecto y más adelante cargar las librerías que necesites dinámicamente (que es más óptimo por tema de memoria).

Una vez le das a Start your build, te pedirá un correo. Cuando se termine de hacer la compilación te enviarán un correo diciendoté que ya te puedes descargar el firmware.

La manera dificil, es en linux instalarte una serie de programas y compilar tú mismo el firmware. Yo lo he hecho dos veces pero no merece la pena, siempre que la anterior página funcione.

Adjunto el último que he usado generado por la página

https://nodemcu-build.com/

Step 2: Carga El Firmware Descargado En Tu Esp8266

Para cargar el firmware existen muchas opciones:

Si te has descargado el firmware de:

https://nodemcu-build.com/

  1. Descarga el programa esp8266_flasher.exe (para windows)
  2. https://github.com/Stadslab/ESP8266_example/tree/m...
  3. Donde pone bin, pones el fichero.
  4. Enchufa el Esp8266
  5. Configura el puerto donde se ha conectado el Esp8266
  6. Pulsa en el Esp8266 el botón reset y el botón GPIO0/FLASH
  7. Suelta el reset y mantén pulsado el GPIO0/FLASH
  8. Sin soltar el botón en todo el rato pulsa DOWNLOAD en la aplicación
  9. Sin soltar el botón espera hasta que llegue al 100% y diga algo así como failed to leave
  10. Ya puedes soltar el GPIO0/FLASH resetea el Esp8266

Si te has generado los ficheros tu mismo:

En windows se usa el programa esptool.py

  1. Descarga el programa esptool.py. Tienes que tener python instalado.
  2. https://github.com/espressif/esptool

  3. Enchufa el Esp8266
  4. Pulsa en el Esp8266 el botón reset y el botón GPIO0/FLASH

  5. Suelta el reset y mantén pulsado el GPIO0/FLASH

  6. Ejecuta en la línea de comandos con el puerto donde esté el Esp8266: esptool.py -p COM1 write_flash 0x00000 ./0x00000.bin 0x10000 ./0x10000.bin

  7. Sin soltar el botón espera hasta que llegue al 100%

  8. Cuando llegue al 100% ya puedes soltar el botón GPIO0/FLASH

Para linux se puede usar también el esptool.py, así de memoria el comando queda así:

esptool.py -p /dev/ttyUSB0 write_flash 0x00000 ./0x00000.bin 0x10000 ./0x10000.bin

Con el esptool.py se puede también cargar el firmware descargado de https://nodemcu-build.com/

esptool.py -p /dev/ttyUSB0 write_flash 0x00000 ./fichero_descargado_nodemcu-build.bin

En Linux:

esptool.py -p /dev/ttyUSB0 write_flash 0x00000 ./nodemcu-master-7-modules-2017-07-04-16-20-19-integer.bin

En Windows:

esptool.py -p COM1 write_flash 0x00000 ./nodemcu-master-7-modules-2017-07-04-16-20-19-integer.bin

Step 3: Prueba Que El Firmware Funciona

Me ha pasado que a veces cargo un firmware y el Esp8266 no funciona correctamente. Al Esp8266 no le mola ese firmware, o he soltado el GPIO0/FLASH porque me he distraido, o un fallo al grabar, no sé. En este caso, repito todos los pasos o al final busco un nuevo firmware.

Bajamos el programa ESPlorer, que por cierto necesita java. Funciona tanto en windows como en linux

https://esp8266.ru/esplorer/

Con el Esp8266 enchufado le indicamos el puerto donde le tenemos y damos a open (la velocidad suele ser 115200). Nos dirá que no reconoce el firmare, pulsamos reset en el Esp8266.

Si salen símbolos raros todo el rato, probad a cambiar la velocidad del puerto a 9600 a ver si hay suerte. Si no funciona habría que probar otro firmware.

Yo lo he probado haciendo un print("hola") y dándole al send.




Step 4: Subiendo Los Ficheros Al Esp8266 Para Que Funcione El Software

Ahora es el momento de subir los ficheros necesarios para que el servidor web funcione en el Esp8266.

Vamos al github donde tengo alojados los ficheros del servidor:

https://github.com/kajum1978/esp8266-nodeMcu-webCo...

Nos bajamos/clonamos el repositorio y todos sus ficheros.

También lo adjunto por si alguno se los quiere bajar de aquí.

Una vez subidos los ficheros (que tardará un rato) hay que pulsar reset en el Esp8266 o en el ESPlorer pulsar el reset, cualquiera de las dos formas debería valer.

Si surge algún problema al subir los ficheros, lo vuelves a intentar desde el fichero en que dió el error.

Step 5: Inicio Del Software En El Esp8266

Tras el reset, nos saldrán una serie de mensajes. Se compilaran los ficheros .lua que hemos subido al Esp8266 y se arrancará el servidor en modo AP (access point). Esto se puede configurar en el fichero config.ini que explicaré más adelante.

La red que se ha montado es SSID:ESP8266-LINK1 password:12341234 (en realidad es una red abierta, pero siempre hay que ponerle password al ESP8266 para que funcione; también se puede cambiar en el config.ini).

A partir de ahora cada vez que el módulo se reinicie se ejecutará el software. Si queremos parar la ejecución por algún motivo, tenemos 5 segundos antes de cargue todo después de un reset. En donde pone send en ESPlorer envíariamos un q, para parar la ejecución. Esto sirve por si estamos desarrollando algo y no funciona, parar el Esp8266 para que no se quede bloqueado y reiniciando todo el rato.

Step 6: Manejo Del Esp8266 Mediante El Navegador Web

Instalado el software en el Esp8266 ya podemos manejarlo desde el navegador.

En nuestro ordenador buscamos la red wifi que se ha creado y nos conectamos a ella ESP8266-LINK1.

Una vez conectados:

Por defecto tiene dos páginas el index.html y el config.html. Se accede así:

La página inicial, la uso para manejar unos relés y sirve además de ejemplo.

Nos metemos en http://192.168.1.1/config.html y nos aparecerá la página de configuración. La parte de arriba es para cambiar el modo del esp8266 y la parte de abajo es informativa si está en modo estación o modo punto de acceso mostrará que ips tiene, como se llama, su mac, etc..

En la parte Izquierda hay un menú:

  • Inicio: me lleva a index.html
  • General: Configuración general del Esp8266 y Información de su estado.
  • Estación: configura el modo Estación (para conectarme a la wifi de casa por ejemplo). Para poder entrar hay primero que cambiar a modo Esta y P.access (estación y punto de acceso)
  • P.Acceso: configura el modo como punto de acceso
  • Grabar: graba la configuración actual. Cada vez que realizamos un cambio, éste se prueba, pero no se graba. Sólo se graba si pulsamos grabar.
  • Ficheros: para manejar los ficheros de la flash. Permite subir ficheros, borrarlos, compilarlos, etc..
  • Restart: Reinicia el módulo. Todos los cambios que no se hayan grabado se perderán

Step 7: Conectarme a Una Red, Por Ejemplo La De Mi Casa

En la página inicial de configuración cambiamos el modo a Esta. y P. Acceso y pulsamos cambiar. Nos aparecerá un mensaje de que está esperando respuesta. Si todo va bien el mensaje se quita y ya podremos acceder en el menú de la izquierda a Estación.t

Para conectarte a tu red pulsa scanear, seleccionala, introduce el password y dale a conectar. Te volverá a aparecer el mensaje de espera. Si todo va bien, puedes volver a General y ver que ip te ha dado tu router.

Mi router me ha dado la ip 192.168.0.105 (abajo a la izquierda). Dale a GRABAR, conectaté a tu red wifi y entra en http://192.168.0.105/config (a tu ip claro). ,Deberás ver otra vez la página web de configuración.

Si quieres cambia el modo a Estación sólo en General, para que nadie pueda entrar en tu ESP8266 (sólo tú, desde tu red) o a la configuración de P.Acceso ponle un password.

Nota 1: si no has dado a grabar, no has hecho nada, en el próximo reinicio del ESP8266 estará como al principio.

Nota 2: todo esto lo puedes hacer modificando el fichero config.ini.

Step 8: Vale, Muy Bonito, ¿pero Que Puedo Hacer?

Puedes subir paginas html, js, podrías tener bootstrap, lo que quieras y que aguante la flash del esp8266

para ello hay que modificar el fichero paginas.lua y cuando lo tengas luego compilarlo. Lo puedes subir con la interfaz web y compilarlo o mediante el ESPlorer.

Tres tipos de páginas puedes tener:

  • Ficticia, no existe un fichero, es una acción y le devuelves un texto plano. Yo las uso con peticiones en Ajax.

Aquí estoy encendiendo un relé y le digo a quien me ha dicho que lo encienda que OK,ON1. http://192.168.0.105/ON1

PAGINAS["/ON1"]=function() --Entre corchetes es la página por la que pregunta el cliente

PAGINAS.GPIO_OUTPUT(1,1) --Eso es una función que hay en páginas para poner a high o low los pines

return "OK,ON1"

end

  • Un fichero en el que quiero que algo de él, sea sustituido por algo calculado en mi programa

Esta sería el index.html. Si abres el fichero index.html, verás que existe el texto LUA_STATUS_OUTPUT1 y LUA_STATUS_OUTPUT2. Con el array varsDinamicas, le decimos que queremos sustitir y con que. En este caso el estado de los relés. Imagina que hemos encendido un relé, se te cierra el navegador, vuelves a entrar a conectarte, pues te gustaría saber el estado de los relés, eso es lo que hace. Actualiza los botones con el estado real de los reles (encendido o apagado).

http://192.168.0.105 o http://192.168.0.105

PAGINAS["/"]=function() --Entre corchetes es la página por la que pregunta el cliente

varsDinamicas={}

varsDinamicas["LUA_STATUS_OUTPUT1"]=gpio.read(3) --Sustituciones en la página real

varsDinamicas["LUA_STATUS_OUTPUT2"]=gpio.read(4)

return {nombreFichero="index.html",tipoFichero="text/html"} --La página real enviada con el tipo de fichero

end

  • Cualquier fichero tal cual

PAGINAS["/config.js"]=function() --Entre corchetes es la página por la que pregunta el cliente

return {nombreFichero="config.js",tipoFichero="text/javascript"} --El nombre y tipo del fichero

end

Este sería el ejemplo de una imagen:

PAGINAS["/foto.png"]=function()
return {nombreFichero="foto.png",tipoFichero="image/png"}

end

Nota: Los Ficheros deben estar en la Flash del Esp8266 y si se modifica el paginas.lua hay que compilarlo.

IMPORTANTE: predominan los ficheros compilados sobre los que terminan en .lua (excepto el init.lua) que no se debe ni borrar ni compilar.

Step 9: Descripción De Los Ficheros Del Software

  • config.ini: Fichero de configuración del Esp8266, es todo texto plano y vienen comentarios con que se puede o no poner
  • servidor.lua: Es la lógica del servidor que permite enviar ficheros grandes, recibir varias peticiones y atenderlas, llamar al resto de ficheros que realizan las peticiones del cliente.
  • conexion.lua: Se ejecuta al iniciarse el Esp8266, y es el encargado de configurarlo. También se ejecuta cuando se le pide un cambio de configuración, por ejemplo conectarse a una wifi.
  • init.lua: Primer fichero que se ejecuta, carga el fichero config.ini que luego lo interpretará el conexion.lua. Tiene algunas funciones y variables globales.
    • ERROR_404="Error 404. Pagina no encontrada" --Se podría enviar un fichero html, en vez de un texto plano. Lo que se quiera. Ej: ERROR_404={nombreFichero="error.png",tipoFichero="image/png"}
    • TIEMPO_ESPERA_PARA_ARRANCAR --El tiempo que deja el ESP8266, para que se pueda parar la ejecución enviando una "q". Por defecto son 5000, que son 5 segundos.

  • internalCompile.comp: un fichero plano, que si existe compila ficheros que existan en él. Una vez compilados se borra.

  • configHtmlfiles: Manejo de las peticiones que nos envían, relevantes a la gestión de ficheros. Subir fichero, borrarlo, renombrarlo y compilarlo.

  • configHtml.lua, configHtmlaccion.lua y configHtmlgetStatus.lua: manejan peticiones de la configuración del Esp8266

Futuras mejoras:

  • Servir ficheros .zip. Servir htmls comprimidos haría más rápido la carga de los ficheros.
  • Hacer una ventana de login para entrar en config.
  • Usar una librería de criptografía para almacenar los passwords en el config.ini.
  • Usar bootstrap o angular para mejorar el interfaz.
  • Corregir muchos errores que tiene.

Los ficheros tienen comentarios por si los queréis modificar y saber lo que van haciendo. A mi este proyecto me ha servido para aprender el Esp8266 y el lenguaje lua.

Espero que a alguien le sirva para sus proyectos.