El Nano 33 IoT es una mejora significativa del Nano Every, permitiéndote extender funcionalidades cotidianas, como monitorear y controlar sensores y actuadores de forma remota sin necesidad de un módulo WiFi adicional para establecer una comunicación con una plataforma IoT.
Consulta la documentación oficial de Arduino y revisa todas las especificaciones de la placa.
Siguiendo esta guía podrás realizar solicitudes HTTP POST y GET a Ubidots en solo un par de minutos!
Requisitos
1.Configurando el IDE de Arduino
1. Descarga la última versión del IDE de Arduino si aún no lo tienes.
2. En el IDE de Arduino, haz clic en Sketch -> Incluir Biblioteca -> Administrar Bibliotecas.
3. Busca la biblioteca WiFiNINA e instala la última versión disponible en tu computadora. Asegúrate de que la versión del firmware de la placa coincida con la biblioteca. Si el firmware necesita una actualización, utiliza las siguientes utilidades:
CheckWiFiNINAFirmwareVersion: Lee el número de firmware requerido de la biblioteca y lo compara con el instalado en la placa o el escudo.
WiFiNINAFirmwareUpdater: El sketch que debe cargarse para permitir actualizaciones del firmware y certificados a través del plugin integrado del Software de Arduino (IDE) versión 1.8.5 o posterior.
4. Ve a Administrador de Placas desde Herramientas > Placa > Administrar Placas y busca “Arduino SAMD”. Instala el que tenga listado el “Arduino Nano 33 IoT”.
NOTA IMPORTANTE: Asegúrate de instalar la última versión de las placas. Una vez que la placa esté instalada, deberías poder visualizarla en el administrador de placas como "Arduino NANO 33 IoT". Si la placa no está listada, vuelve al Administrador de Placas y haz clic en "Actualizar".
2.Enviando datos (POST) a Ubidots
1. Para POST datos a Ubidots, primero debes seleccionar la placa y el puerto en las opciones Herramientas de la barra del IDE de Arduino.
2. Después de asegurarte de que tu placa está conectada correctamente a la computadora, pega el código de ejemplo a continuación. Una vez que hayas pegado el código, necesitarás asignar tu TOKEN de Ubidots, SSID (Nombre de WiFi) y Contraseña de la red disponible donde se indica.
/******************************** * Bibliotecas incluidas *******************************/#include <SPI.h>#include <WiFiNINA.h>#include <avr/dtostrf.h>/******************************** * Constantes y objetos *******************************/#define DEVICE_LABEL "arduino-nano-33"#define TOKEN "PUT_YOUR_TOKEN_HERE"char const * VARIABLE_LABEL_1 = "sensor";char const *SERVER="industrial.api.ubidots.com";const int HTTPPORT= 443;char const *AGENT="Arduino Nano 33 IoT";char const *HTTP_VERSION = " HTTP/1.1\r\n";char const *VERSION ="1.0";char const *PATH= "/api/v1.6/devices/";char const * SSID_NAME = "xxxxxxx"; // Pon aquí tu nombre de SSIDchar const * SSID_PASS = "xxxxxxx"; // Pon aquí tu contraseñaint status = WL_IDLE_STATUS;WiFiSSLClient client;/******************************** * Funciones Auxiliares *******************************/void printWiFiStatus() { // imprime el SSID de la red a la que estás conectado: Serial.print("SSID: "); Serial.println(WiFi.SSID()); // imprime la dirección IP de tu placa: IPAddress ip = WiFi.localIP(); Serial.print("Dirección IP: "); Serial.println(ip); // imprime la intensidad de señal recibida: long rssi = WiFi.RSSI(); Serial.print("intensidad de señal (RSSI):"); Serial.print(rssi); Serial.println(" dBm");}void getResponseServer() { Serial.println(F("\nRespuesta del servidor de Ubidots:\n")); while (client.available()) { char c = client.read(); Serial.print(c); // Descomenta esta línea para visualizar la respuesta en el Monitor Serial }}void waitServer() { int timeout = 0; while (!client.available() && timeout < 5000) { timeout++; delay(1); if (timeout >= 5000) { Serial.println(F("Error, se alcanzó el tiempo máximo de espera")); break; } }}void sendData(char* payload) { int contentLength = strlen(payload); /* Conectando el cliente */ if (client.connect(SERVER, HTTPPORT)) { Serial.println("conectado al servidor"); client.print(F("POST ")); client.print(PATH); client.print(DEVICE_LABEL); client.print(F("/")); client.print(HTTP_VERSION); client.print(F("Host: ")); client.print(SERVER); client.print(F("\r\n")); client.print(F("User-Agent: ")); client.print(AGENT); client.print(F("\r\n")); client.print(F("X-Auth-Token: ")); client.print(TOKEN); client.print(F("\r\n")); client.print(F("Connection: close\r\n")); client.print(F("Content-Type: application/json\r\n")); client.print(F("Content-Length: ")); client.print(contentLength); client.print(F("\r\n\r\n")); client.print(payload); client.print(F("\r\n")); Serial.print(F("POST ")); Serial.print(PATH); Serial.print(DEVICE_LABEL); Serial.print(F("/")); Serial.print(HTTP_VERSION); Serial.print(F("Host: ")); Serial.print(SERVER); Serial.print(F("\r\n")); Serial.print(F("User-Agent: ")); Serial.print(AGENT); Serial.print(F("\r\n")); Serial.print(F("X-Auth-Token: ")); Serial.print(TOKEN); Serial.print(F("\r\n")); Serial.print(F("Connection: close\r\n")); Serial.print(F("Content-Type: application/json\r\n")); Serial.print(F("Content-Length: ")); client.print(contentLength); client.print(F("\r\n\r\n")); client.print(payload); client.print(F("\r\n")); waitServer(); getResponseServer(); } /* Desconectando el cliente */ client.stop();}/******************************** * Funciones Principales *******************************/void setup() { //Inicializa el serial y espera a que el puerto se abra: Serial.begin(9600); while (!Serial) { ; // espera a que el puerto serial se conecte. Necesario solo para el puerto USB nativo } // verifica el módulo WiFi: if (WiFi.status() == WL_NO_MODULE) { Serial.println("¡Comunicación con el módulo WiFi fallida!"); // no continuar while (true); } // intenta conectarse a la red WiFi: while (status != WL_CONNECTED) { Serial.print("Intentando conectarse al SSID: "); Serial.println(SSID_NAME); // Conéctate a la red WPA/WPA2. Cambia esta línea si usas una red abierta o WEP: status = WiFi.begin(SSID_NAME, SSID_PASS); // espera 10 segundos para la conexión: delay(10000); } Serial.println("Conectado a wifi"); printWiFiStatus();}void loop(){ char payload[200]; char str_val_1[30]; /*4 es la longitud total del número, el número máximo aceptado es 99.99*/ float value = analogRead(A0); dtostrf(value, 4, 2, str_val_1); sprintf(payload, "%s",""); sprintf(payload, "{\""); sprintf(payload, "%s%s\":%s", payload, VARIABLE_LABEL_1, str_val_1); sprintf(payload, "%s}", payload); //Envía el payload a Ubidots sendData(payload); delay(5000);}
3. VERIFICA tu código dentro del IDE de Arduino. Para hacer esto, en la esquina superior izquierda de nuestro IDE de Arduino verás el ícono de "Marca de Verificación"; selecciónalo para verificar tu código.
4. CARGA el código en tu “Arduino Nano 33 IoT”. Para hacer esto, elige el ícono de "flecha a la derecha" al lado del ícono de "marca de verificación".
5. Para verificar la conectividad del dispositivo y la respuesta del servidor, abre el monitor serial seleccionando el ícono de "lupa" en la esquina superior derecha del IDE de Arduino para comprobar si los datos se están enviando correctamente.
6. Consulta la sección de Dispositivos de tu cuenta de Ubidots y observa cómo se creó automáticamente un nuevo dispositivo.
La variable llamada "sensor" está publicando las lecturas tomadas de la entrada analógica de la placa Arduino.
3.Recuperar (GET) datos de Ubidots
1. Con el siguiente código de ejemplo podrás GET los últimos valores de una variable. Asegúrate de asignar tu TOKEN de Ubidots, SSID (Nombre de WiFi), Contraseña, Etiqueta del Dispositivo y Etiqueta de la Variable deseadas para obtener donde se indica:
/******************************** * Bibliotecas incluidas *******************************/#include <SPI.h>#include <WiFiNINA.h>#include <avr/dtostrf.h>/******************************** * Constantes y objetos *******************************/#include <SPI.h>#include <WiFiNINA.h>#include <avr/dtostrf.h>#define DEVICE_LABEL "DEVICE_LABEL"#define TOKEN "PUT_YOUR_TOKEN_HERE"char const * VARIABLE_LABEL = "PUT_YOUR_WIFI_SSID_HERE";char const *SERVER="industrial.api.ubidots.com";//Reemplaza la línea anterior si eres un usuario educativo char const *SERVER="industrial.api.ubidots.com";const int HTTPPORT= 443;char const *AGENT="Arduino Nano 33 IoT";char const *HTTP_VERSION = " HTTP/1.1\r\n";char const *VERSION ="1.0";char const *PATH= "/api/v1.6/devices/";char ssid[] = "PUT_YOUR_WIFI_SSID_HERE";char pass[] = "PUT_YOUR_WIFI_PASSWORD_HERE";int status = WL_IDLE_STATUS;WiFiSSLClient client;/******************************** * Funciones Auxiliares *******************************/void printWiFiStatus() { // imprime el SSID de la red a la que estás conectado: Serial.print("SSID: "); Serial.println(WiFi.SSID()); // imprime la dirección IP de tu placa: IPAddress ip = WiFi.localIP(); Serial.print("Dirección IP: "); Serial.println(ip); // imprime la intensidad de señal recibida: long rssi = WiFi.RSSI(); Serial.print("intensidad de señal (RSSI):"); Serial.print(rssi); Serial.println(" dBm");}void getFromUbidots(char* response) { /* Conectando el cliente */ client.connect(SERVER, HTTPPORT); if (client.connected()) { /* Construye la solicitud GET - Por favor, consulta este enlace para conocer todas las estructuras de la solicitud https://ubidots.com/docs/api/ */ client.print(F("GET ")); client.print(PATH); client.print(DEVICE_LABEL); client.print(F("/")); client.print(VARIABLE_LABEL); client.print(F("/lv")); client.print(HTTP_VERSION); client.print(F("Host: ")); client.print(SERVER); client.print(F("\r\n")); client.print(F("User-Agent: ")); client.print(AGENT); client.print(F("/")); client.print(VERSION); client.print(F("\r\n")); client.print(F("X-Auth-Token: ")); client.print(TOKEN); client.print(F("\r\n")); client.print(F("Connection: close\r\n")); client.print(F("Content-Type: application/json\r\n\r\n")); Serial.println(F("Haciendo solicitud a Ubidots:\n")); Serial.print(F("GET ")); Serial.print(PATH); Serial.print(DEVICE_LABEL); Serial.print(F("/")); Serial.print(VARIABLE_LABEL); Serial.print(F("/lv")); Serial.print(HTTP_VERSION); Serial.print(F("Host: ")); Serial.print(SERVER); Serial.print(F("\r\n")); Serial.print(F("User-Agent: ")); Serial.print(AGENT); Serial.print(F("\r\n")); Serial.print(F("X-Auth-Token: ")); Serial.print(TOKEN); Serial.print(F("\r\n")); Serial.print("Content-Type: application/json\r\n\r\n"); waitServer(); getResponseServer(response); } else { Serial.println("Conexión fallida a ubidots - Intenta de nuevo"); }}void waitServer() { int timeout = 0; while (!client.available() && timeout < 5000) { timeout++; delay(1); if (timeout >= 5000) { Serial.println(F("Error, se alcanzó el tiempo máximo de espera")); break; } }}void getResponseServer(char* response) { /* Lee la respuesta del servidor */ int i = 0; sprintf(response, ""); if (client.available() > 0) { while (client.available()) { char c = client.read(); //Serial.print(c); // Descomenta esta línea para visualizar la respuesta en el Monitor Serial response[i++] = c; if (i >= 699){ break; } } } for (int j = i; j < strlen(response) - 1; j++) { response[j++] = '\0'; } /* Desconectando el cliente */ client.stop();}float parseUbiResponse(char* data, int dstSize=700){ float error_value = -3.4028235E+8; char parsed[20]; char dst[20]; int len = strlen(data); // Longitud del array de respuesta del servidor for (int i = 0; i < len - 2; i++) { if ((data[i] == '\r') && (data[i + 1] == '\n') && (data[i + 2] == '\r') && (data[i + 3] == '\n')) { strncpy(parsed, data + i + 4, 20); // Copia el resultado a parsed parsed[20] = '\0'; break; } } /* Extrae el valor */ uint8_t index = 0; // Crea punteros para dividir el valor char* pch = strchr(parsed, '\n'); if (pch == NULL) { return error_value; } char* pch2 = strchr(pch + 1, '\n'); if (pch2 == NULL) { return error_value; } index = (int)(pch2 - pch - 1); sprintf(dst, "%s", pch); dst[strlen(dst) - 1] = '\0'; float result = atof(dst); return result;}/******************************** * Funciones Principales *******************************/void setup() { //Inicializa el serial y espera a que el puerto se abra: Serial.begin(9600); while (!Serial) { ; // espera a que el puerto serial se conecte. Necesario solo para el puerto USB nativo } // verifica el módulo WiFi: if (WiFi.status() == WL_NO_MODULE) { Serial.println("¡Comunicación con el módulo WiFi fallida!"); // no continuar while (true); } // intenta conectarse a la red WiFi: while (status != WL_CONNECTED) { Serial.print("Intentando conectarse al SSID: "); Serial.println(ssid); // Conéctate a la red WPA/WPA2. Cambia esta línea si usas una red abierta o WEP: status = WiFi.begin(ssid, pass); // espera 10 segundos para la conexión: delay(10000); } Serial.println("Conectado a wifi"); printWiFiStatus();}void loop(){ if (client.connect(SERVER, HTTPPORT)) { /* Llama a la función de Ubidots */ char* response = (char *) malloc(sizeof(char) * 700); sprintf(response, ""); getFromUbidots(response); // Espacio de memoria para almacenar el resultado de la solicitud float results = parseUbiResponse(response); Serial.print("resultados:"); Serial.println(results); Serial.println(); free(response); } else { Serial.println("No se pudo conectar a la nube"); Serial.println("Intentando de nuevo en 5 segundos ...."); } delay(5000); }
2. Después de pegar el código, verifica que no tengas errores y carga el código en el dispositivo. Una vez que el código se haya cargado correctamente, abre el monitor serial para ver la respuesta del servidor y obtener los últimos valores de la variable.
4.Resumen
Con este simple tutorial puedes POST y GET datos a/de Ubidots, ¡ahora es momento de crear Dashboards de Ubidots para visualizar tus datos y desplegar tu solución IoT!
Otros lectores también han encontrado útil...