Librería para hacer consultas HTTP con un módulo WiFi ESP8266 y Arduino

Librería para hacer consultas HTTP con un módulo WiFi ESP8266 y Arduino

Librería para hacer consultas HTTP con un módulo WiFi ESP8266 y Arduino

Una forma sencilla de enviar información de y a un microcontrolador es centralizándola en un servidor web. Si bien no es un método tan eficiente como, por ejemplo, acceder directamente a una base de datos, sí que es lo suficientemente eficaz, especialmente si se considera un proyecto basado en un microcontrolador, y se añade las ventajas de la ubicuidad (datos en la nube) y la simplicidad (puede manejarse como texto información y órdenes) El envío de información usando este sistema puede consistir en hacer peticiones HTTP POST y la recepción en analizar el contenido de la respuesta a una petición HTTP GET.

Tabla de contenidos

    El módulo WiFi ESP8266 es una opción muy económica, con un rendimiento muy adecuado para su uso con microcontroladores y muy sencillo de usar trabajando con órdenes AT.

    Para sistematizar su uso con peticiones HTTP he desarrollado una pequeña librería que da soporte a las necesidades de mi proyecto de dispositivo gestor de sueño (que he llamado SleepManager) ya que basa su infraestructura en un servidor web que permite extenderlo a un objeto IoT como servicio en la nube. No es difícil agregar a la librería otros servicios como peticiones UDP, por ejemplo, para sincronización horaria por NTP aunque, como explico en el texto enlazado, no es crítico para mis necesidades y puedo resolverlo aceptablemente con una petición HTTP a una página web preparada a ese efecto como muestro en un ejemplo de uso de esta librería.

    El funcionamiento de la librería se basa en el envío de órdenes AT cuando el dispositivo está disponible y la repetición (con un pequeño retraso) en caso de error, que se interpreta como no disponibilidad (con éxito, por las pruebas) por ejemplo del punto de acceso WiFi o del servidor al que se consulta.

    La librería aprovecha el hecho de que el módulo WiFi ESP8266 devuelva un código +IPD como aviso de la recepción de datos para ir rellenando un pequeño buffer con la información devuelta por el servidor. Para el proyecto de dispositivo gestor del sueño necesito analizar muy pocos datos devueltos desde el servidor por lo que, para economizar, el buffer y el puntero que lo recorren son especialmente pequeños; esta será una de las primeras cosas que deberás cambiar para reutilizar la librería para procesar un volumen de datos mayor.

    Las funciones que se exponen como públicas permiten (1) saber el estado del módulo: si está conectado o no, si hay datos en el buffer y cuántos y si el módulo ESP8266 ha terminado la operación que se le ha solicitado; (2) conectar a un punto de acceso WiFi en una red con un servidor DHCP y (3) hacer peticiones HTTP de tipo GET y POST aunque, como verás, el código está diseñado pensando en que sea muy sencillo añadir otras.

    En cuanto al funcionamiento interno, en primer lugar se construyen dos matrices, una con las órdenes AT y otra con las respuestas esperadas para éxito y error; luego, el programa que usa la librería, debe ir llamando cada cierto tiempo a la función enviar que se encargará de mandar las órdenes al módulo si hay disponibles y no está ocupado y a la función recibir que procesará las respuestas del módulo ESP8266 (y del servidor HTTP a través de él si procede)

    Como cabe la posibilidad de que el módulo se desconecte por pérdida de señal, el programa principal puede comprobar si el módulo ESP8266 está conectado al punto de acceso WiFi (con la función conectado) y tratar de conectar en caso contrario (con la función conectar_wifi)

    Para saber si la operación que se ha solicitado ha terminado, el programa puede usar la función operacion_terminada y en tal caso enviar otra o utilizar los datos resultantes para lo que se utiliza la función leer_buffer, que devuelve el contenido del buffer que se ha ido rellenando con los datos que llegaban al módulo ESP8266 hasta completar la operación, y la función longitud_buffer que informa de la cantidad de esos datos que el servidor ha avisado de que iban a ser enviados (con lo que poder descontar la información del propio módulo)

    El ejemplo de más abajo usa la librería de consultas HTTP con el módulo WiFi ESP8266 para enviar datos al servidor (un porcentaje obtenido de la lectura de una entrada analógica) cada cierto intervalo de tiempo. Como no espera recibir ninguna respuesta no hace uso del buffer y le basta que la operación se complete correctamente. Este sistema es el que utilizo en mi proyecto de dispositivo gestor del sueño para ir almacenando los resultados de las lecturas de los sensores en el servidor.

    El siguiente ejemplo usa una consulta HTTP GET para consultar la hora del servidor y sincronizarla con la del dispositivo microcontrolado añadiéndole el tiempo estimado de respuesta; en realidad, añade entre 4 y 6 segundos más para asegurar que la hora del dispositivo es mayor que la del servidor y poder comprobar fácilmente si la hora del reloj en tiempo real que forma parte del dispositivo es correcta o se ha perdido por descarga de la batería.

    Después de muchas pruebas he verificado que este sistema de sincronización horaria con el módulo WiFi ESP8266 es lo bastante precisa para mis necesidades; en el peor caso con un error de menos de 10 segundos que es algo irrelevante en mi caso.

    Como puede verse en el código, es necesario consultar primero la longitud del buffer ya que la lectura lo reinicia para que esté disponible para almacenar nuevos datos.

    Una vez leído el contenido del buffer, en este ejemplo se procesa para obtener la hora. En primer lugar se selecciona el texto que queda entre las llaves (el servidor responde usando la orden PHP echo «{«.time().»}») lo transforma en un «objeto tiempo» y de él obtiene en formato humano la fecha y la hora.

    El siguiente programa de ejemplo, inspirado en la consulta de un usuario, sirve para buscar la dirección IP pública usando el servicio CheckIP de AWS (Amazon Web Services) cada cinco minutos.

    Como en los ejemplos anteriores, se hacen una serie de presunciones que habrá que cambiar conforme a la configuración de la red que se use (192.168.1.X, en el ejemplo) el SSID y la clave del WiFi… La forma de encontrar la dirección IP no es muy elegante, supone que es la última línea de la respuesta a la petición HTTP GET aunque puede que exista una API para hacerlo de manera más ortodoxa.


    Aquí puedes descargar la librería ESP8266 para consultas HTTP con Arduino Uno (sin consola) y desde aquí puedes descargar la librería ESP8266 de consultas HTTP para Arduino que usa consola, es decir que necesita implementar un puerto serie por software o usar como hardware, por ejemplo, una placa Arduino Mega o Arduino Leonardo.

    Publicar comentario

    Puede que te hayas perdido