Registrador GPS con Análisis Espacial en Azure IoT Hub
Componentes y Suministros
| Componente | Cantidad | Notas |
|---|---|---|
| Arduino UNO | 1 | Registrador GPS |
| Raspberry Pi 2 Model B | 1 | Gateway IoT |
| Adafruit Ultimate GPS Breakout | 1 | Módulo GPS de alta sensibilidad |
| Conector 9V a Jack Barril | 1 | Alimentación Arduino |
| Batería 9V (genérica) | 1 | Portátil |
| Fotorresistencia | 1 | Sensor de luz ambiental |
| LED (genérico) | 6 | 3 Transparentes, 1 Rojo, 1 Amarillo, 1 Verde (estado GPS) |
| Pulsador SparkFun 12mm | 2 | Registro de waypoint y control |
| Interruptor Deslizante | 3 | Codificación binaria tipo de característica (0-7) |
| Resistencia 10k Ω | 4 | Pull-up/down |
| Resistencia 221 Ω | 3 | Limitación corriente LEDs |
| Protoboard Media | 1 | Montaje GPS + sensores |
| Protoboard Completa | 1 | Montaje principal |
| Cables Dupont | 1 | Conexiones |
| MicroSD SanDisk 16GB con adaptador | 2 | Almacenamiento datos |
Aplicaciones y Servicios Online
- Microsoft Windows 10 IoT Core
- Microsoft Azure (IoT Hub)
- Arduino IDE
- Microsoft Visual Studio 2015
- Google Earth Professional
- Quantum GIS (QGIS)
- Microsoft Windows 10 Enterprise
Sobre el Proyecto
Introducción
La tecnología móvil actual permite mapas GIS en casi cualquier dispositivo. Este proyecto puede ser una actividad educativa para enseñar a niños hardware abierto, computación móvil, tecnologías geoespaciales y computación en la nube.
Consta de 3 partes:
- Registrador GPS Arduino: Niños (con ayuda) construyen un dispositivo que registra posición GPS, nivel de luz y tipo de elemento. Salen al exterior a marcar ubicaciones (señales, árboles, bancos...), comprendiendo mejor los datos en mapas GIS. Acompañados de un adulto, pueden medir luz nocturna en áreas públicas para análisis de seguridad.
- Visualización y Análisis GIS: Visualizar puntos en mapa, interpolar espacialmente los niveles de luz y mostrar resultados.
- Windows 10 IoT Core y Azure IoT Hub: Subir y distribuir datos, escalando a miles de dispositivos.
Registrador GPS Arduino
El siguiente video muestra el dispositivo y una demostración rápida. Código y diagrama de protoboard abajo.
Fotorresistencia
Sensor analógico de brillo (0-1023). Lecturas típicas: sol directo ~1000, sombra diurna ~900, bajo farola nocturna ~170. Pruebe lecturas al construir para calibrar.
Ranura Micro SD
Ejemplo en Arduino IDE: Archivo > Ejemplos > SD > Datalogger.
Adafruit Ultimate GPS
GPS fácil de usar. Instalar librerías desde ejemplos de Adafruit.
LEDs de Estado de Fijación Satelital
HDOP (Dilución Horizontal de Precisión) mide precisión X,Y. Menor HDOP = mayor precisión.
- Rojo: Sin fijación satelital
- Amarillo: Fijación con HDOP > 1.5
- Verde: Fijación con HDOP ≤ 1.5
Interruptores Deslizantes para Tipo de Característica (Binario)
Tres interruptores codifican base 10 (0-7): izquierda = 2² (4), centro = 2¹ (2), derecha = 2⁰ (1). Sumando valores según estado se obtiene el código 0-7.
OFF OFF OFF = 0 = Lectura sensor luz
OFF OFF ON = 1 = Banco parque
OFF ON OFF = 2 = Roca
OFF ON ON = 3 = Papelera
ON OFF OFF = 4 = Árbol
ON OFF ON = 5 = Teléfono público
ON ON OFF = 6 = Farola
ON ON ON = 7 = Fuente agua
Botón
Cada pulsación añade una línea CSV a datalog.csv en la microSD:
LATITUD,LONGITUD,VALOR_LUZ,TIPO_CARACTERISTICA
- LATITUD, LONGITUD: del GPS
- VALOR_LUZ: lectura analógica fotorresistencia
- TIPO_CARACTERISTICA: 0-7 según interruptores
Ejemplo CSV:
40.77221,-73.97392,105,5
40.77139,-73.97394,60,1
40.77051,-73.97460,150,6
40.77225,-73.97650,25,3
40.77171,-73.97462,43,2
40.77283,-73.975033,54,1
¿Sin Pantalla LCD?
Los LEDs reemplazan a una pantalla 1602 porque:
- El código con GPS, microSD y LCD compilaba pero la microSD era inestable. Quitar el LCD estabilizó la tarjeta.
- La batería 9V no dura mucho alimentando LCD. No era crítico, se eliminó.
Visualización y Análisis GIS
Visualizar Puntos GPS
Extraer microSD, insertar en PC con Windows 10 y Google Earth Pro. Copiar archivo, abrir en editor, añadir cabecera LATITUDE,LONGITUDE,LIGHT_VALUE,FEATURE_TYPE y guardar como .CSV. Importar en Google Earth Pro (versión Professional requerida) para crear estilos de iconos por tipo.

Análisis Espacial con Quantum GIS (QGIS)
QGIS es GIS libre y open source. Permite interpolar datos de luz para identificar áreas con iluminación suficiente/insuficiente en parques nocturnos.
- Cargar límites, senderos y info relevante del área.
- Cargar puntos del CSV del registrador. Aplicar simbología y etiquetas para ver valores de luz.
- Interpolar datos puntuales para estimar valores entre ubicaciones conocidas.
- Recoger más lecturas de luz y cargar en QGIS.
- Re-ejecutar interpolación con dataset mayor.





La segunda interpolación muestra patrón similar pero con más detalle gracias a puntos adicionales.
Usando Windows 10 IoT Core y Azure IoT Hub
Escalado
El registrador Arduino es barato y simple, guarda datos en microSD. Dispositivos geográficamente distribuidos generan gestión compleja. Windows 10 IoT Core y Azure IoT Hub como base de mensajería permiten escalar a miles de dispositivos fácilmente.
Primero Pruebe Estos Ejemplos
Siga el tutorial Getting Started with Azure IoT Hub for .NET: crear cuenta Azure trial, configurar IoT Hub, desarrollar ejemplos de envío/recepción. Descargue Azure IoT Hub Device Explorer para administración de dispositivos.
Windows 10 IoT Core en Raspberry Pi 2
Desde PC Windows 10, descargar Windows 10 IoT Core para RPi2, flashear microSD con Windows IoT Image Helper. Montar tarjeta, conectar Ethernet, verificar en Windows IoT Core Watcher al arrancar.
Conectar botón en protoboard (ver esquemático abajo). Código fuente al final.

Aplicación Universal Windows para Subida de Datos
En Visual Studio 2015: Nuevo proyecto > Blank App (Universal Windows). Nombre: IoTHubClientSendEvent. NuGet: Microsoft.Azure.Devices.Client y Newtonsoft.Json. Referencia: Windows IoT Extensions for UWP (acceso GPIO).
Añadir using en Mainpage.xaml.cs:
using Windows.Devices.Gpio;
using Newtonsoft.Json;
using Microsoft.Azure.Devices.Client;
using System.Text;
Variables y constantes en clase MainPage:
private const int buttonPin = 6;
private GpioPin buttonGPIO;
static DeviceClient deviceClient;
static string deviceId = "MakerChallengeDevice2";
static string uploadFile = "data.csv";
Clase evData para serialización JSON:
class evData {
public string id { get; set; }
public string data { get; set; }
}
En constructor MainPage:
deviceClient = DeviceClient.CreateFromConnectionString("DEVICE_CONNECTION_STRING", TransportType.Http1);
initGPIO();
Función initGPIO():
private void initGPIO() {
var gpio = GpioController.GetDefault();
buttonGPIO = gpio.OpenPin(buttonPin);
if (buttonGPIO.IsDriveModeSupported(GpioPinDriveMode.InputPullUp))
buttonGPIO.SetDriveMode(GpioPinDriveMode.InputPullUp);
else
buttonGPIO.SetDriveMode(GpioPinDriveMode.Input);
buttonGPIO.DebounceTimeout = TimeSpan.FromMilliseconds(50);
buttonGPIO.ValueChanged += buttonPin_ValueChanged;
}
Manejador de botón:
private void buttonPin_ValueChanged(GpioPin sender, GpioPinValueChangedEventArgs e) {
if (e.Edge == GpioPinEdge.FallingEdge) {
sendMessageToIOTHub();
}
}
Envío a Azure IoT Hub:
private static async void sendMessageToIOTHub() {
string myString;
var msg = new evData();
if (File.Exists(uploadFile)) {
myString = System.IO.File.ReadAllText(uploadFile);
} else {
myString = "Just checking in!!";
}
msg.id = deviceId;
msg.data = myString;
var messageString = JsonConvert.SerializeObject(msg);
var message = new Message(Encoding.ASCII.GetBytes(messageString));
await deviceClient.SendEventAsync(message);
}
Compilar Debug x86, luego cambiar a Release ARM y Remote Machine. Si RPi2 está en red, Visual Studio lo detecta para despliegue.
Consejo: En Propiedades del proyecto > Manifest > Packaging, cambie Package Name a nombre reconocible (ej. IoTHubClientSendEvent).
Build > Deploy Solution. En IoT Core Watcher, clic derecho > Webbrowser Here. Login Admin > Apps > seleccionar app desplegada > Start.

Aplicación Universal Windows para Recibir Mensajes de Azure IoT Hub
Nuevo proyecto C# Windows Console: IoTEventHubReceiver. NuGet: WindowsAzure.ServiceBus y Newtonsoft.Json.
using en Program.cs:
using System.IO;
using System.Threading;
using Newtonsoft.Json;
using Microsoft.ServiceBus.Messaging;
Clase evData para deserialización:
class evData {
public string id { get; set; }
public string data { get; set; }
}
Variables para recibir mensajes:
static string connectionString = "IOT_HUB_CONNECTION_STRING";
static string iotHubD2cEndpoint = "messages/events";
static EventHubClient eventHubClient;
En Main():
eventHubClient = EventHubClient.CreateFromConnectionString(connectionString, iotHubD2cEndpoint);
SynchMessages();
Funciones SynchMessages() y ReceiveMessagesFromDeviceAsync():
private static async void SynchMessages() {
while (true) {
var d2cPartitions = eventHubClient.GetRuntimeInformation().PartitionIds;
foreach (string partition in d2cPartitions) {
ReceiveMessagesFromDeviceAsync(partition);
}
}
}
private async static Task ReceiveMessagesFromDeviceAsync(string partition) {
var eventHubReceiver = eventHubClient.GetDefaultConsumerGroup().CreateReceiver(partition, DateTime.UtcNow);
while (true) {
EventData eventData = await eventHubReceiver.ReceiveAsync();
if (eventData == null) continue;
string data = Encoding.UTF8.GetString(eventData.GetBytes());
evData d = JsonConvert.DeserializeObject<evData>(data);
StreamWriter writer = new StreamWriter("c:\\gps\\download\\" + d.id + "." + DateTime.Now.Year + "." + DateTime.Now.Month + "." + DateTime.Now.Day + "." + DateTime.Now.Hour + "." + DateTime.Now.Minute + "." + DateTime.Now.Second + ".csv");
writer.Write(d.data);
writer.Close();
Console.WriteLine(string.Format("Mensaje recibido de {0}.\n{1}", d.id, d.data));
}
}
Crear carpeta c:\gps\download en PC desarrollo.
Ejecutar Aplicaciones de Envío y Recepción
Iniciar IoTEventHubReceiver en PC y esperar consola. Pulsar botón en RPi2 con Windows 10 IoT Core ejecutando IoTHubClientSendEvent. Se envía mensaje "Just checking in!" a Azure IoT Event Hub. Consola muestra:
Mensaje recibido de MakerChallengeDevice2. Just checking in!
También es posible enviar contenido de archivo de texto (< 256 KB, límite actual mensaje IoT Hub). Ver funciones sendMessageToIOTHub() y ReceiveMessagesFromDeviceAsync().
Windows 10 IoT Core no permite acceso a rutas absolutas, pero sí a archivo en mismo directorio que ejecutable. Para colocar archivo: en IoT Core Watcher, clic derecho > Open Network Share > Admin > navegar a c$\Data\Users\DefaultAccount\AppxLayouts > buscar carpeta app desplegada > colocar data.csv (< 256 KB). Ejemplo CSV con Latitud, Longitud, luz, tipo. Pulsar botón y consola muestra:
Mensaje recibido de MakerChallengeDevice2. LAT,LNG,LT,TYP
45.45926,-110.57361,45,6
45.78546,-110.02487,156,3
Para subida de archivos a Azure Blob Storage, ver ejemplos Get started with Azure IoT Hub for .NET (sección Next Steps).
Resumen
Este proyecto demuestra: crear registrador GPS Arduino simple, analizar datos recogidos, usar nube para gestión. Puntos de extensión:
- Registrar otros sensores en el registrador.
- Subida directa desde Arduino a Azure vía WiFi, Bluetooth o Celular.
- Diferentes análisis espaciales para decisiones ambientales.
- Desarrollar aplicación web de mapas para mostrar datos crudos o analizados.
- Usar EventProcessors en Azure Stream Analytics para actuar al recibir datos en IoT Hub.
Código
Registrador GPS Arduino
Sketch y diagrama de cableado: GitHub
Ejemplo Azure IoT Hub
Aplicación Universal Windows para IoT Core que envía mensajes a Azure IoT Hub: GitHub
Azure SDK
Azure IoT Device Explorer: GitHub
Ejemplos Windows 10 IoT Core
Muestras para desplegar en IoT Core: GitHub
Esquemáticos
Proceso de manufactura
- Monitorización Precisa de Temperatura y Humedad con SHT15 en Windows 10 IoT Core
- Registrador de Temperatura y Humedad con Arduino, DHT11 y Ethernet Shield
- Construye un tarro inteligente IoT con ESP8266, Arduino y sensor ultrasónico: Monitorización en tiempo real
- Celebra con Luz y Sonido: Proyecto Arduino de Cumpleaños DIY
- Módulo GPS u-blox LEA‑6H 02: Guía de integración con Arduino y Python
- Controla tu TV con Alexa mediante Arduino IoT Cloud: Guía Paso a Paso
- Púa de Velocidad y Pedal Stomp para Guitarra DIY – Construye tu Propia Púa Motorizada Impresa en 3D
- Estación Meteorológica WiFi con ESP8266 y Sensor DHT22 – Envío a ThingSpeak
- Sistema de Control de Piscina con Azure IoT: Sensores Inteligentes y Monitorización Remota
- Dominando el Diseño de PCB para Internet de las Cosas: Guía Completa
- Avnet Silica muestra soluciones de IA, IoT y conectividad de vanguardia en Embedded World 2019