Imagina que eres un piloto a punto de volar de SF a NYC. Antes de llegar a la pista, un piloto debe confirmar un chequeo previo al vuelo antes del despegue. Los pilotos se aseguran de que los flaps funcionen, que haya combustible disponible con reservas, que el tren de aterrizaje esté en orden y que las comunicaciones con el Control estén operativas. Así como el piloto pasa por un "prevuelo" para garantizar la seguridad de los pasajeros durante el vuelo, Ubidots también sugiere una lista de verificación "previa al vuelo" antes de lanzar tu solución IoT. Verificar que tu dispositivo sea capaz de alcanzar Internet y enviar/recibir datos es la lista de verificación previa al vuelo de Ubidots que asegura que tus datos viajen de manera eficiente y segura con Ubidots.
Esta lista de verificación previa al vuelo es para el módulo ESP8266 como independiente, pero esto no significa que no puedas seguir esta guía si estás utilizando el ESP8266 como módulo Wi-Fi para un microcontrolador, porque los pasos mencionados a continuación son los mismos para cualquier ESP8266. Por supuesto, las configuraciones por dispositivo son diferentes, pero el proceso de configuración sigue siendo el mismo :)
El ESP8266 como módulo Wi-Fi se inicia en el modo módem serie como su configuración predeterminada y se comunica con tu microcontrolador a través de comandos AT. Cuando tu dispositivo está correctamente conectado con el microcontrolador, verifica la comunicación del módulo utilizando comandos AT.
Verifica la comunicación con el módulo utilizando el siguiente comando AT
Comando ->
AT
Si todo está funcionando correctamente, recibirás la respuesta a continuación:
Respuesta ->
OK
Si no puedes recibir un mensaje de respuesta, verifica las conexiones al módulo.
NOTA IMPORTANTE 1: Como se mencionó anteriormente, esta lista de verificación es para el módulo ESP8266 como independiente, pero recuerda que los pasos son siempre los mismos, la única diferencia es que debes usar comandos AT. Consulta esta documentación para obtener una lista de todos los comandos AT disponibles para el módulo ESP8266. Además, consulta la referencia de la API REST de Ubidots para construir las solicitudes que se enviarán desde el módulo.
NOTA 2: Si estás utilizando el ESP32, esta guía también te servirá. Simplemente cambia los códigos de importación de la biblioteca proporcionados en esta guía de #include <ESP8266WiFi.h> a #include <WiFi.h> y confirma todos los chequeos previos al vuelo.
Configurando la plataforma ESP8266 en el IDE de Arduino
1. Descarga el IDE de Arduino si aún no lo tienes. Abre el IDE de Arduino, selecciona Archivos -> Preferencias e ingresa http://arduino.esp8266.com/stable/package_esp8266com_index.json en el campo de URLs adicionales del gestor de placas. Puedes agregar múltiples URLs, separándolas con comas.
NOTA: Si eres un usuario de Mac, ten en cuenta que Arduino y Archivo contienen diferentes funciones desplegables en comparación con los usuarios de Windows. Además, debes instalar el siguiente controlador para poder cargar tu NodeMCU.
2. Abre Gestor de placas desde Herramientas -> Placa -> Gestor de placas e instala la plataforma esp8266. Para encontrar el dispositivo correcto, busca ESP8266 en la barra de búsqueda.
3. Ahora que la plataforma ESP8266 está correctamente instalada, selecciona la placa ESP8266 del menú Herramientas > Placa.
Lista de verificación previa al vuelo de Espressif ESP8266:
1. ¿Puedes conectarte a WiFi?
Una vez que hayas configurado correctamente el módulo, debes confirmar que puede conectarse a una red WiFi. Para verificar esto, carga el código a continuación en el ESP8266 utilizando el IDE de Arduino. No olvides asignar el Nombre SSID y la Contraseña SSID donde se indica en el código.
/******************************** * Bibliotecas incluidas *******************************/#include <ESP8266WiFi.h>/******************************** * Constantes y objetos *******************************/char const * SSID_NAME = "...."; // Pon aquí tu nombre SSIDchar const * SSID_PASS = "...."; // Pon aquí tu contraseña/******************************** * Funciones principales *******************************/void setup() { Serial.begin(9600); /* Conecta al AP */ WiFi.begin(SSID_NAME, SSID_PASS); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } WiFi.setAutoReconnect(true); Serial.println(""); Serial.println(F("WiFi conectado")); Serial.println(F("Dirección IP: ")); Serial.println(WiFi.localIP());}void loop() {}
Una vez que el código se haya cargado correctamente, abre el Monitor Serial para visualizar el estado de la conexión. Recibirás el mensaje "WiFi Conectado" y la dirección IP asignada al módulo si está conectado.
2. ¿Puedes acceder a Internet desde tu dispositivo?
Si el ESP8266 puede conectarse a una red WiFi, podrás acceder a Internet y hacer cualquier solicitud HTTP sin problemas. Para verificar si el módulo puede acceder a Internet, haz una solicitud simple GET de las variables en tu cuenta de Ubidots utilizando el código a continuación.
Pega y carga este código en tu IDE de Arduino y asigna el nombre SSID, contraseña SSID. ¿No puedes encontrar tu Token de Ubidots? Haz clic aquí.
#include <ESP8266WiFi.h>const char* ssid = "...."; // Asigna el nombre SSIDconst char* password = "...."; // Asigna la contraseña SSIDconst char* host = "industrial.api.ubidots.com";const char* token = "...."; // Asigna tu Token de Ubidotsvoid setup() { Serial.begin(115200); delay(10); // Comenzamos conectándonos a una red WiFi Serial.println(); Serial.println(); Serial.print("Conectando a "); Serial.println(ssid); /* Establece explícitamente el ESP8266 como un cliente WiFi, de lo contrario, por defecto, intentarías actuar como cliente y punto de acceso y podría causar problemas de red con tus otros dispositivos WiFi en tu red WiFi. */ WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi conectado"); Serial.println("Dirección IP: "); Serial.println(WiFi.localIP());}int value = 0;void loop() { delay(5000); ++value; Serial.print("conectando a "); Serial.println(host); // Usamos la clase WiFiClient para crear conexiones TCP WiFiClient client; const int httpPort = 80; if (!client.connect(host, httpPort)) { Serial.println("conexión fallida"); return; } // Ahora creamos una URI para la solicitud String url = "/api/v1.6/variables?token="; url += token; Serial.print("Solicitando URL: "); Serial.println(url); // Esto enviará la solicitud al servidor client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); unsigned long timeout = millis(); while (client.available() == 0) { if (millis() - timeout > 5000) { Serial.println(">>> Tiempo de espera del cliente!"); client.stop(); return; } } // Lee todas las líneas de la respuesta del servidor y las imprime en Serial while(client.available()){ String line = client.readStringUntil('\r'); Serial.print(line); } Serial.println(); Serial.println("cerrando conexión");}
Una vez que el código se cargue correctamente en el módulo, abre el monitor serial para visualizar la respuesta del servidor. Si todo está funcionando correctamente, recibirás una respuesta exitosa (200 OK
)
3. ¿Estás familiarizado con HTTP?
Es importante saber con qué parámetros estás trabajando al construir una solución IoT. El parámetro más valioso de la World Wide Web es la comunicación HTTP. ¿Qué es HTTP? HTTP significa Protocolo de Transferencia de Hipertexto, y es el protocolo subyacente utilizado por la World Wide Web para comunicarse entre usuarios y solicitudes/acciones de sitios web. Este protocolo define cómo se formatean y transmiten los mensajes, y también define qué acciones tomarán los navegadores y los servidores web en respuesta a varios comandos de entrada de un usuario (es decir, un clic del mouse en una página web). Todas las solicitudes HTTP contienen 3 indentaciones: URL, Encabezados, y Cuerpo.
HTTP es un protocolo de solicitud/respuesta. Por ejemplo, cuando haces una solicitud para algún archivo en una página web (por ejemplo, "Consígueme el archivo 'webside.html'"), estás enviando una solicitud y el servidor web envía de vuelta la respuesta ("aquí está el archivo"). Este es el mismo proceso que utiliza el ESP8266. El módulo ESP8266 está enviando una solicitud GET al servidor de Ubidots para recuperar las variables configuradas en tu cuenta de Ubidots. Una vez que se envía la solicitud, el servidor devuelve la respuesta con el estado de la solicitud y la respuesta esperada, que, en este caso, son las variables ya creadas en tu cuenta de Ubidots.
Ahora que tienes una idea sobre HTTP, vamos a profundizar un poco más y explorar los parámetros necesarios para construir una solicitud HTTP: URL, Encabezados y Cuerpo.
URL: Como todos saben, una URL es la dirección global de documentos y otros recursos en la World Wide Web. La URL es la pieza de información más importante incluida en cualquier solicitud HTTP porque determina exactamente a dónde en Internet enviarás datos y con quién te comunicarás. Simplemente, cuando ingresas una URL en tu navegador, estás enviando un comando HTTP al servidor web que luego recuerda el sitio web correcto para que lo veas/interactúes.
Encabezados: Los encabezados permiten al cliente identificar parámetros clave en tu solicitud HTTP. Los encabezados identifican de manera clara y rápida cosas como: nombres de campo, valores de campo y límite de tamaño. Ubidots permite a sus usuarios enviar datos en formato JSON y es importante que el servidor sepa qué tipo de datos está enviando el cliente para verificar la forma de codificación correcta. En este caso, un encabezado común al trabajar con Ubidots es
Content-Type: application/json
. Aquí podemos ver que los campos se identifican como Content-Type como el tipo de encabezado y los datos enviados están en formato JSON. Ubidots solo acepta datos en formato JSON.
Cuerpo: El cuerpo es simplemente los datos que se transmitirán en una solicitud HTTP. Es importante mencionar que el cuerpo solo se utiliza para solicitudes que transfieren datos al servidor, como POST y PUT; el cuerpo no es necesario al usar métodos GET.
4. ¿Puedes enviar una solicitud HTTP POST desde tu dispositivo?
Ahora que tu dispositivo está conectado a WiFi y tiene acceso a Internet, es hora de enviar una solicitud HTTP POST desde tu dispositivo a Ubidots.
La estructura de una solicitud POST a Ubidots debería replicar lo siguiente:
POST /api/v1.6/devices/{LABEL_DEVICE}/?token={TOKEN} HTTP/1.1Host: industrial.api.ubidots.comContent-Type: application/jsonContent-Length: 41{"temperature": 28.00, "humidity": 54.00}
NOTA: Consulta la referencia de la API REST de Ubidots para obtener información adicional sobre las diferentes estructuras de solicitudes disponibles en Ubidots.
Para publicar datos en Ubidots, pega y carga el código a continuación en tu IDE de Arduino asignando el nombre SSID, contraseña SSID, y tu Token de Ubidots donde se indica:
#include <ESP8266WiFi.h>const char* ssid = "...."; // Asigna el nombre SSIDconst char* password = "...."; // Asigna la contraseña SSIDconst char* host = "industrial.api.ubidots.com";const char* device_label = "esp8266";const char* token = "...."; // Asigna tu Token de Ubidotsvoid setup() { Serial.begin(115200); delay(10); // Comenzamos conectándonos a una red WiFi Serial.println(); Serial.println(); Serial.print("Conectando a "); Serial.println(ssid); /* Establece explícitamente el ESP8266 como un cliente WiFi, de lo contrario, por defecto, intentarías actuar como cliente y punto de acceso y podría causar problemas de red con tus otros dispositivos WiFi en tu red WiFi. */ WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi conectado"); Serial.println("Dirección IP: "); Serial.println(WiFi.localIP());}int value = 0;void loop() { delay(5000); ++value; Serial.print("conectando a "); Serial.println(host); // Usamos la clase WiFiClient para crear conexiones TCP WiFiClient client; const int httpPort = 80; if (!client.connect(host, httpPort)) { Serial.println("conexión fallida"); return; } // Ahora creamos una URI para la solicitud String url = "/api/v1.6/devices/"; url += device_label; url += "/?token="; url += token; // Ahora creamos el cuerpo a publicar String body = "{\"temperature\": 28.00, \"humidity\": 54.00}"; Serial.print("Solicitando URL: "); Serial.println(url); // Esto enviará la solicitud al servidor client.print(String("POST ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Content-Type: application/json\r\n" + "Content-Length: 41\r\n" + "Connection: close\r\n\r\n" + body + "\r\n\r\n"); unsigned long timeout = millis(); while (client.available() == 0) { if (millis() - timeout > 5000) { Serial.println(">>> Tiempo de espera del cliente!"); client.stop(); return; } } // Lee todas las líneas de la respuesta del servidor y las imprime en Serial while(client.available()){ String line = client.readStringUntil('\r'); Serial.print(line); } Serial.println(); Serial.println("cerrando conexión");}
Una vez que el código se cargue correctamente en el módulo, abre el monitor serial para visualizar la respuesta del servidor. Si todo funciona correctamente, recibirás una respuesta exitosa (200 OK
) y los datos se publicarán en tu cuenta de Ubidots. Puedes visualizar esta confirmación accediendo a tu cuenta de Ubidots para encontrar un nuevo dispositivo creado y titulado "esp8266":
Resultado
Si sigues todos los pasos anteriores con éxito, puedes estar seguro de que tu ESP8266 está funcionando correctamente y ahora estás listo para diseñar aplicaciones IoT personalizadas con tu ESP8266 y Ubidots.
Esta guía ayuda a los usuarios con la configuración y la solución de problemas inicial para el módulo Espressif ESP8266. Para más información sobre Ubidots y el ESP8266, consulta las bibliotecas a continuación para obtener consejos y trucos rápidos para aprovechar al máximo tu modelo ESP8266.
¡Feliz hackeo!