Objetivos
Material requerido.
WIFI CC3000 |
El Shield WIFI CC3000
En la última sesión empezamos a jugar con este Shield WIFI que incorpora el chip de Texas Instruments CC3000, y la verdad es que me sorprendió gratamente, por lo que me he animado a profundizar un poco más con él para ver qué cosas podemos hacer.
Y entre las cosas que me han llamado la atención están los varios ejemplos que vienen con la librería de Adafruit, porque me han parecido muy interesantes e instructivos, para que los incorporemos en nuestros proyectos.
Una de las ventajas que supone esta librería está en que viene con un buen número de ejemplos (15) a cual más interesante, tanto que vamos a revisar en este capítulo uno de ellos que nos muestra cómo obtener la localización aproximada de nuestra posición mediante el servicio web de freegeoIp.net.
Tal y como los chicos de Adafruit indican, este sistema no es ni de lejos tan preciso como un GPS, pero tiene la enorme virtud de estar disponible sin más que engancharte a la red y con una buena aproximación, aunque no hay garantía de que funcione en todos los sitios pero ya me contareis.
Conocer la posición en la que te encuentras te permite consultar la hora de salida y puesta de sol por ejemplo, lo que te puede permitir orientar un panel solar para conseguir la máxima carga, o quizás el tiempo que va a hacer, para saber si tienes que levantarte a por la tabla de Surf o es mejor quedarse en casa.
Desde otro punto de vista, mas practico, en esta sesión nos introduciremos en el concepto de servidores de información JSON, que nos proveen de casi innumerables opciones de datos de todo tipo de forma muchas veces gratuita, sobre lo que se os ocurra.
Tenemos servidores que nos informan sobre posición con latitud y longitud, nombres de ciudades, terremotos, meteorología, generadores de números o textos aleatorios, mapas y casi lo que se os ocurra.
Según la Wikipedia: JSON, acrónimo de JavaScript Object Notation, es un formato ligero para el intercambio de datos. JSON es un subconjunto de la notación literal de objetos de JavaScript que no requiere el uso de XML.
La simplicidad de JSON ha dado lugar a la generalización de su uso, especialmente como alternativa a XML en AJAX que son siempre más complicadas de usar.
Geo localización con WIFI Shield CC3000
No hay duda de que los errores de este ejmplo son solo míos, pero cualquier merito que podáis encontrar en este ejemplo, tenéis que atribuírselo a los chicos de Adafruit que amablemente nos proporcionan tanto la librería como los ejemplos en licencia BSD, además su ciencia en la confección de los programas.
Este capítulo va a ser de lo más cómodo para mí (No es la primera vez que hablamos de mi vagancia). No voy a hacer nada más que traducir los textos del programa y comentarlos un poco, para todos esos que se acercan a Arduino con una idea y muchas ganas de hacer cosas.
Para empezar, tenéis que descargar e instalar la librería Adafruit_CC3000_Library-master o bien descargarla de Github, e instalarla por el procedimiento habitual que ya tenemos bien conocido, y si vais a
Archivo\Ejemplos\Adafruit C3000 Library
Encontrareis el original de este programa (entre otros varios). Como siempre empezamos con algunas definiciones:
#include <Adafruit_CC3000.h> #include <SPI.h> #define ADAFRUIT_CC3000_IRQ 3 // MUST be an interrupt pin! #define ADAFRUIT_CC3000_VBAT 5 #define ADAFRUIT_CC3000_CS 10 Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS,ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT, SPI_CLOCK_DIVIDER);
Ahora acordaros de poner los datos de vuestra WIFI en la siguientes líneas:
#define WLAN_SSID "charly" // No mas de 32 caracteres. #define WLAN_PASS "contrase" #define WLAN_SECURITY WLAN_SEC_WPA2
Encriptación | ||||
---|---|---|---|---|
Flag | WLAN_SEC_UNSEC | WLAN_SEC_WEP | WLAN_SEC_WPA | WLAN_SEC_WPA2 |
Vamos con el programa de posicionamiento GeoLocation .Creamos una instancia el cliente WIFI mediante:
Adafruit_CC3000_Client client;
Definimos algunas constantes para los diferentes TimeOuts que vamos a necesitar:
const unsigned long dhcpTimeout = 60L * 1000L, // Max time to wait for address from DHCP connectTimeout = 15L * 1000L, // Max time to wait for server connection responseTimeout = 15L * 1000L; // Max time to wait for data from server
Vamos a intorregar al servidor de freegeoip.net para obtener información de nuestra posición, deducida por nuestra IP publica, la que nos asigna nuestro proveedor de Internet, y por eso vamos a definir algunas variables para guardar los resultados recibidos:
char country[20], region[20], city[20], name[13], // Temp space for name:value parsing value[64]; // Temp space for name:value parsing float longitude, latitude;
Las primeras instrucciones del setup, son exactamente iguales a las de la sesión previa por lo que nos las vamos a comentar:
if(!cc3000.begin()) { Serial.println("Error."); return; } Serial.print(("OK.\r\nConnectando a la red...")); if(!cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY)) { Serial.println("Fallo!"); return; } Serial.println("Conectado!");
Vamos a ver ahora como conseguimos una dirección del servidor DHCP:
Serial.print("Solicitando direccion IP..."); for(t=millis(); !cc3000.checkDHCP() && ((millis() - t) < dhcpTimeout); delay(1000)); if(cc3000.checkDHCP()) Serial.println("OK"); else { Serial.println("failed"); return; }
Imprimimos aquí los valores asignados mediante la función que vimos en la sesión previa:
while(!displayConnectionDetails()) delay(1000);
Y vamos a conseguir la dirección del servidor de freegeoip.net mediante una consulta al DNS:
Serial.print("Resolviendo la direccion de freegeoip.net... "); t = millis(); while((0L == ip) && ((millis() - t) < connectTimeout)) { if(cc3000.getHostByName("freegeoip.net", &ip)) break; // Aqui esta la consulta delay(1000); } if(0L == ip) { Serial.println("Error."); return; } cc3000.printIPdotsRev(ip); // Formatea e imprime la IP obtenida Serial.println();
Vamos a usar el cliente que creamos mas arriba para hacer una petición al servidor de freegeoip.net
Serial.print("Connectando al servidor..."); client = cc3000.connectTCP(ip, 80); if(client.connected()) { Serial.print("Conectado.\r\nSolicitando informacion..."); client.print("GET /json/ HTTP/1.1\r\nHost: freegeoip.net\r\n\r\n"); } else { Serial.println("Error"); return; } Serial.println("OK");
Vamos ahora con la parte que lee la respuesta y la procesa:
Serial.print("\r\nLeyendo respuesta..."); country[0] = region[0] = city[0] = 0; // Clear data jsonParse(0, 0); client.close(); Serial.println("OK");
Tenéis la función jsonParse() (Entre otras) al final del programa pero parece una de esas cosas que hay que usar sin mirar dentro demasiado.
El resto es gimnasia. Desconectar e imprimir el resultado:
Serial.println(F("\nDisconnecting")); cc3000.disconnect(); Serial.print(F("\r\nRESULTADO:\r\n Pais:\t ")); Serial.println(country); Serial.print(F(" Region:\t ")); Serial.println(region); Serial.print(F(" Ciudad:\t ")); Serial.println(city); Serial.print(F(" Longitud:\t ")); Serial.println(longitude); Serial.print(F(" Latitud:\t ")); Serial.println(latitude);
El resultado es lo pongo a continuación:
Resumen de la sesión