¿Qué es Arduino?
Arduino es una plataforma de electrónica de código abierto basada en hardware y software fáciles de usar. La placa básica se puede conectar a una serie de dispositivos para expandir sus posibilidades; estos dispositivos se llaman "shields". Para este tutorial específico, utilizaremos el Arduino WiFi Shield.
Acerca de Ubidots
Si eres nuevo por aquí, Ubidots es una plataforma que te permite configurar fácilmente un dispositivo habilitado para Internet (un Arduino en este caso) para enviar datos a la nube y mostrarlos en forma de gráficos bonitos y amigables para el usuario. También puedes activar alertas por SMS o correo electrónico basadas en tus datos y compartir tus gráficos en aplicaciones web o móviles externas.
Lo que necesitas
Una placa Arduino. En este caso estamos usando el Arduino UNO
El Arduino WiFi Shield
Cable USB
Un LED
¡Una buena conexión WiFi!
Preparándose
Antes de comenzar con este tutorial, debes asegurarte de que tienes el IDE de Arduino funcionando y que has instalado la biblioteca de Arduino de Ubidots.
Manos a la obra
Coloca el Shield sobre la placa Arduino y conecta el LED: el extremo positivo en el pin digital 12 y el extremo negativo en cualquiera de los pines etiquetados como GND.
Para saber cuál es el extremo positivo (+) del LED, busca el extremo más largo como se muestra en la imagen a continuación. En caso de que sean del mismo tamaño, observa la sección plana en la bombilla como se muestra en la imagen. Esto también indicará el extremo negativo.
Ahora ve a tu cuenta de Ubidots. Si aún no tienes una, puedes crear una aquí.
1. Ve a la sección Dispositivo para crear un nuevo dispositivo llamado "control", presiona “Agregar nuevo dispositivo” y asigna el nombre mencionado anteriormente.
2. Una vez creado el dispositivo, ingresa a él y crea una nueva variable predeterminada llamada "led".
Una vez que el dispositivo y la variable estén creados, deberías tener algo como esto:
3. Ve a la sección Dashboard para crear un nuevo widget de control "switch" para controlar el estado del LED. Elige el dispositivo que creaste, la variable, presiona “Finalizar”.
Una vez creado el widget, verás que el widget aparece en el Dashboard, como a continuación:
4. A continuación, copia y pega el código a continuación en el IDE de Arduino. Una vez pegado, asigna tus parámetros de wifi y token donde se indica en el código:
/************************************************************************************************* * Este ejemplo obtiene el último valor de una variable de la nube de Ubidots (www.ubidots.com) para controlar * un LED. * * Requisitos: * 1. En la sección Dispositivo, crea un nuevo dispositivo llamado "control" * 2. Dentro del dispositivo recién creado, crea una nueva variable predeterminada llamada "led" * 3. En la sección Dashboard, crea un nuevo widget de control "switch" para controlar el LED :) * * NOTA IMPORTANTE: No olvides asignar tus credenciales de WiFi, token de ubidots y el pin donde el * LED está conectado * * Este ejemplo se proporciona TAL CUAL sin ninguna garantía * * Hecho por Maria Carlina Hernandez(http://github.com/mariacarlinahernandez/) *************************************************************************************************/ /******************************** * Bibliotecas incluidas *******************************/#include <WiFi.h>/******************************** * Constantes y objetos *******************************/namespace { const char * SSID_NAME = "assign_wifi_ssid_here"; // Pon aquí el nombre de tu SSID const char * SSID_PASS = "assign_wifi_ssid_pass_here"; // Pon aquí tu contraseña de red const char * SERVER = "industrial.api.ubidots.com"; const char * TOKEN = "assign_your_ubidots_token"; // Asigna tu TOKEN de Ubidots const char * DEVICE_LABEL = "control"; // Asigna la etiqueta del dispositivo para obtener los valores de las variables const char * VARIABLE_LABEL = "led"; // Asigna la etiqueta de la variable para obtener el último valor const char * USER_AGENT = "ArduinoWifi"; const char * VERSION = "1.0"; const int PORT = 80; int status = WL_IDLE_STATUS; int LED = 12; // asigna el pin donde el LED está conectado}WiFiClient client;/******************************** * Funciones Auxiliares *******************************//* este método realiza una conexión HTTP al servidor y envía una solicitud para obtener un dato*/float getData(const char * variable_label) { /* Asigna las constantes como globales en la función */ char* response; // Array para almacenar datos analizados char* serverResponse; // Array para almacenar valores float num; char resp_str[700]; // Array para almacenar datos en bruto del servidor uint8_t j = 0; uint8_t timeout = 0; // Tiempo máximo de espera para recuperar datos uint8_t max_retries = 0; // Máximo de reintentos para intentar la conexión /* Construye la solicitud GET - Por favor, consulta este enlace para conocer todas las estructuras de las solicitudes https://ubidots.com/docs/api/ */ char* data = (char *) malloc(sizeof(char) * 220); sprintf(data, "GET /api/v1.6/devices/%s/%s/lv", DEVICE_LABEL, variable_label); sprintf(data, "%s HTTP/1.1\r\n", data); sprintf(data, "%sHost: things.ubidots.com\r\n", data); sprintf(data, "%sUser-Agent: %s/%s\r\n", data, USER_AGENT, VERSION); sprintf(data, "%sX-Auth-Token: %s\r\n", data, TOKEN); sprintf(data, "%sConnection: close\r\n\r\n", data); /* Conexión inicial */ client.connect(SERVER, PORT); /* Reconectar el cliente cuando está desconectado */ while (!client.connected()) { Serial.println("Intentando conectar"); if (client.connect(SERVER, PORT)) { break; } // Intenta conectar cinco veces como máximo max_retries++; if (max_retries > 5) { Serial.println("No se pudo conectar al servidor"); free(data); return NULL; } delay(5000); } /* Realiza la solicitud HTTP al servidor*/ client.print(data); /* Alcanzar el tiempo de espera cuando el servidor no está disponible */ while (!client.available() && timeout < 2000) { timeout++; delay(1); if (timeout >= 2000) { Serial.println(F("Error, se alcanzó el tiempo de espera máximo")); client.stop(); free(data); return NULL; } } /* Lee la respuesta del servidor */ int i = 0; while (client.available()) { char c = client.read(); //Serial.write(c); // Descomenta esta línea para visualizar la respuesta del servidor if (c == -1) { Serial.println(F("Error al leer datos del servidor")); client.stop(); free(data); return NULL; } resp_str[i++] = c; } /* Analiza la respuesta para obtener solo el último valor recibido */ response = strtok(resp_str, "\r\n"); while(response!=NULL) { j++; //printf("%s", response); response = strtok(NULL, "\r\n"); if (j == 10) { if (response != NULL) { serverResponse = response; } j = 0; } } /* Convierte el valor obtenido a un float */ num = atof(serverResponse); free(data); /* Elimina cualquier dato en serie entrante en búfer */ client.flush(); /* Desconecta el cliente */ client.stop(); /* Devuelve el último valor de la variable */ return num;}/* Este método imprime el estado de wifi */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 shield WiFi: IPAddress ip = WiFi.localIP(); Serial.print("Dirección IP: "); Serial.println(ip); // imprime la fuerza de la señal recibida: long rssi = WiFi.RSSI(); Serial.print("fuerza de señal (RSSI):"); Serial.print(rssi); Serial.println(" dBm");}/******************************** * 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 serie se conecte. Necesario solo para el puerto USB nativo } // verifica la presencia del shield: if (WiFi.status() == WL_NO_SHIELD) { Serial.println("Shield WiFi no presente"); // no continuar: while (true); } String fv = WiFi.firmwareVersion(); if (fv != "1.1.0") { Serial.println("Por favor, actualiza el firmware"); } // intenta conectarse a la red Wifi: while (status != WL_CONNECTED) { Serial.print("Intentando conectar a 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() { float value = getData(VARIABLE_LABEL); Serial.print("El valor recibido de Ubidots es: "); Serial.println(value); if ( value == 1.0) { digitalWrite(LED, HIGH); } else { digitalWrite(LED, LOW); } delay(1000);}
5. Una vez que hayas asignado las credenciales de wifi y el token de Ubidots, sube el código a la placa
Ve a tu Dashboard y presiona "Haga clic para encender" y si todo es correcto, el LED en la placa se iluminará.
Para verificar cómo los datos de tu dispositivo están conectados y transmitiendo datos, ve a Herramientas > Monitor Serial y espera a que se cargue. Puedes ver que la variable se modifica: 1.0 cuando está encendido y 0.0 cuando está apagado.
Conclusión
Este tutorial explicó cómo controlar un LED de forma remota desde tu dashboard de Ubidots. El mismo código se puede usar para controlar otras cosas conectadas al Arduino, como abridores de puertas, alimentadores de mascotas, aspersores de agua, cerraduras, otros disparadores, etc.
Más ejemplos
Aquí hay más ideas de proyectos, consulta...
¿Tienes más ideas de IoT? ¡Crea una cuenta en Ubidots y hazlas realidad hoy!
Publicado originalmente en Ubidots Blog el 18 de agosto de 2014.