Bouw een GPS-datalogger met ruimtelijke analyse op Azure IoT Hub
Onderdelen en benodigdheden
| Onderdeel | Aantal |
|---|---|
| Arduino UNO | 1 |
| Raspberry Pi 2 Model B | 1 |
| Adafruit Ultimate GPS Breakout | 1 |
| 9V naar Barrel Jack connector | td>1|
| 9V batterij (algemeen) | 1 |
| Fotoweerstand | 1 |
| LED (algemeen) | 6 |
| SparkFun Drukknop 12mm | 2 |
| Schuifschakelaar | 3 |
| Weerstand 10k Ω | 4 |
| Weerstand 221 Ω | 3 |
| Solderloos breadboard half-size | 1 |
| Solderloos breadboard full-size | 1 |
| Jumper wires (algemeen) | 1 |
| Sandisk 16GB MicroSD met adapter | 2 |
Apps en online diensten
- Microsoft Windows 10 IoT Core
- Microsoft Azure
- Arduino IDE
- Microsoft Visual Studio 2015
- Google Earth Professional
- Quantum GIS (QGIS)
- Microsoft Windows 10 Enterprise
Over dit project
Inleiding
Huidige mobiele technologie is erg geavanceerd en gemakkelijk te gebruiken met GIS-informatiekaarten beschikbaar op bijna elk type apparaat. Dit project kan omgezet worden in een klasactiviteit om kinderen de basisprincipes van open-source hardware, mobile computing, georuimtelijke technologieën en cloud computing te leren.
Dit project bestaat uit 3 delen:
1) Arduino GPS-datalogger
Met behulp kunnen jonge kinderen een apparaat bouwen dat GPS-locatie-informatie, lichtmeting en het type te localiseren object registreert. Ze kunnen naar buiten gaan en de locaties van vooraf bepaalde dingen markeren (bordjes, bomen, parkbankjes, etc.). Dit geeft een beter begrip van de wereld om hen heen en een betere waardering voor de data op GIS-kaarten. Lage lichtniveaus 's nachts in openbare ruimtes kunnen een veiligheidsrisico zijn. Begeleid door een volwassene kunnen ze 's nachts uitgaan om lichtmetingen te verzamelen voor verdere analyse.
2) GIS-visualisatie en analyse
Visualiseer de in het veld verzamelde locaties op een kaart. Schat de lichtniveaus voor een gebied door ruimtelijke interpolatie-analyse uit te voeren en toon de resultaten op een kaart.
3) Windows 10 IoT Core en Azure IoT Hub gebruiken
Na het uitvoeren van GIS-visualisatie en analyse, gebruik Windows 10 IoT Core en Azure IoT Hub om de data te uploaden en te distribueren. Hierdoor kan het systeem eenvoudig opschalen om data-beheer voor duizenden dataverzamelaars en apparaten in het veld te ondersteunen.
Arduino GPS-datalogger
De volgende video geeft een overzicht van het Arduino Uno GPS-datalogger apparaat en een snelle demonstratie. Broncode en breadboard-schema zijn hieronder te vinden.
Hier is meer informatie over de componenten.
Fotoweerstand
Deze analoge sensoren meten de helderheid van licht en zijn heel gemakkelijk te gebruiken. Zie een voorbeeld met broncode hier. De analoge waarde meet 0-1023, maar de meeste metingen liggen onder 200 tenzij het licht erg helder is. Bij het bouwen van je apparaat, probeer enkele lichtmetingen uit om te weten wat je kunt verwachten.
Voorbeeld: helder zonlicht is ongeveer 1000, daglicht in de schaduw ongeveer 900, en direct onder een straatlantaarn 's nachts ongeveer 170.
Micro SD-sleuf
Een goed voorbeeld vind je in de Arduino IDE onder Bestandsmenu > Voorbeelden > SD > Datalogger.
Adafruit Ultimate GPS
Gemakkelijk te gebruiken GPS. Volg de voorbeelden hier om de GPS-bibliotheken in je Arduino IDE te installeren.
Satellietsignaal-status LEDs
Horizontale Dilution of Precision (HDOP) is een meetwaarde voor de X,Y-positienauwkeurigheid van de GPS. Hoe lager de HDOP-waarde, des te nauwkeuriger de positie. Als de GPS een fix heeft, retourneert hij de HDOP-waarde met de breedte- en lengtegraad. Meer informatie over GPS Dilution of Precision hier.
- Rood - Geen satellietsignaal
- Geel - Satellietsignaal met HDOP > 1,5
- Groen - Satellietsignaal met HDOP <= 1,5
Binaire functietype schuifschakelaars
Drie schuifschakelaars worden gebruikt voor de binaire representatie van base 10 0-7. De linkerschakelaar vertegenwoordigt 2^2 of 4. De middenschakelaar vertegenwoordigt 2^1 of 2. De rechtschakelaar vertegenwoordigt 2^0 of 1. Het optellen van de waarden op basis van de schakelaarstand geeft het 0-7 base 10-nummer dat overeenkomt met het type verzameld object. Ideaal begrijpt de gebruiker van de Arduino GPS-datalogger wat de code betekent.
Bijvoorbeeld:
UIT UIT UIT = 0 0 0 = 0 = Lichtsensor meting
UIT UIT AAN = 0 0 1 = 1 = Parkbank
UIT AAN UIT = 0 1 0 = 2 = Rots
UIT AAN AAN = 0 1 1 = 3 = Vuilnisbak
AAN UIT UIT = 1 0 0 = 4 = Boom
AAN UIT AAN = 1 0 1 = 5 = Betaaltelefoon
AAN AAN UIT = 1 1 0 = 6 = Lantaarnpaal
AAN AAN AAN = 1 1 1 = 7 = Waterfontein
Knop
Elke keer dat de knop wordt ingedrukt, voegt het apparaat een regel met kommagescheiden waarden (CSV) toe aan datalog.csv op de microSD-kaart.
De data heeft het formaat:
BREEDTEGRAAD,LENGTEGRAAD,LICHTWAARDE,FUNCTIETYPE
- BREEDTEGRAAD en LENGTEGRAAD komen van de GPS.
- LICHTWAARDE is de analoge waarde van de fotoweerstand.
- FUNCTIETYPE is de 0-7 waarde afhankelijk van de aan/uit-instellingen van de 3 binaire schakelaars hierboven.
CSV Data Voorbeeld:
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
Geen LCD-display?
De meerdere LEDs hadden vervangen kunnen worden door een 1602 LCD-scherm en meer knoppen, maar er waren problemen.
- De code voor GPS, microSD-kaart en 1602 LCD zou compileren en deployen naar de Arduino Uno, maar de microSD-kaart was niet stabiel. Het verwijderen van de LCD stabiliseerde de microSD-kaart, dus LEDs zijn toegevoegd om voldoende gebruikersfeedback te geven. Een Arduino-apparaat met meer resources, zoals de MEGA, zou waarschijnlijk een 1602 LCD samen met GPS en microSD-kaart toelaten.
- De 9V-batterij is handig voor de Arduino GPS-datalogger, maar de batterij houdt niet lang als hij de 1602 LCD moet voeden. Het was geen kritisch onderdeel, dus moest het weg.
GIS-visualisatie en analyse
GPS-punten visualiseren
GIS-data in CSV-formaat is geweldig, maar niet erg nuttig tenzij je het op een kaart kunt zien. Haal de microSD-kaart uit de Arduino GPS-datalogger en steek hem in een Windows 10-computer met Google Earth Professional geïnstalleerd. Ga hier voor installatie- en licentie-instructies. Kopieer het tekstbestand van de microSD-kaart naar de computer en open het in een teksteditor. Voeg de volgende regel als kolomkop aan het begin van het tekstbestand toe en bewaar het als .CSV-bestand.
BREEDTEGRAAD,LENGTEGRAAD,LICHTWAARDE,FUNCTIETYPE
Ga in Google Earth Professional naar het Bestandsmenu en kies Importeren... Blader naar het .CSV-bestand en importeer het. Ga door de opties om verschillende kaartstijlen te maken voor de iconen die de verschillende functietypen vertegenwoordigen en toon de puntlocaties in Google Earth Professional. De Professional-versie van Google Earth moet gebruikt worden. De reguliere versie heeft geen mogelijkheid om een .CSV-bestand te importeren.

Ruimtelijke analyse met Quantum GIS (QGIS)
QGIS is een populaire gratis open-source GIS met installer en tutorials beschikbaar hier. Met QGIS kun je ruimtelijke analyse uitvoeren op het lichtsensor-attribuut voor de GPS-locatie om gebieden met voldoende en onvoldoende verlichting 's nachts in een openbare ruimte zoals een park te identificeren.
Stap 1 - Laad de grens, wandelpaden en andere relevante informatie over het te beoordelen gebied voor onvoldoende verlichting.

Stap 2 - Laad de punten uit het .CSV-bestand van de GPS-datalogger in de QGIS-kaart. Pas de puntsymbologie en labels toe zodat je de lichtwaarden visueel kunt zien.

De punten tonen de lichtsensorwaarden zodat je kunt zien waar het helder (blauw) en waar het donker (rood) is. Alleen de puntdata bekijken is niet voldoende bij het analyseren van een groter gebied.
Stap 3 - Voer een interpolatie uit op de puntdata om een beter begrip te krijgen van het gebied rondom en tussen de punten. Interpolatie wordt gebruikt wanneer je data hebt voor bepaalde locaties en de waarden tussen de bekende locaties wilt schatten. Meer informatie over interpolatie hier.

De interpolatie geeft een beter beeld van de lichtwaarden in het park. Deze analyse kan verbeterd worden door meer lichtmetingen op bekende locaties te leveren.
Stap 4 - Ga meer lichtmetingen verzamelen en laad ze in QGIS.

Stap 5 - Voer de interpolatie opnieuw uit op de grotere dataset.

Je ziet dat de tweede interpolatie een vergelijkbaar patroon toont als de eerste, maar meer detail heeft door de extra punten.
Windows 10 IoT Core en Azure IoT Hub gebruiken
Opschalen
De Arduino GPS-datalogger is een goedkoop en simpel apparaat dat sensorinformatie kan registreren op een microSD-kaart. Deze apparaten kunnen wijd geografisch verdeeld worden om informatie te verzamelen. Het beheren van de informatie van deze apparaten kan een uitdaging zijn als je een systeem moet ontwerpen om dit te doen.
Door Windows 10 IoT Core en Azure IoT Hub als basis van een berichtensysteem te gebruiken, kan het aantal apparaten eenvoudig opschalen naar duizenden apparaten die informatie leveren.
Probeer eerst deze voorbeelden
Voordat je doorgaat, wordt ten zeerste aangeraden de tutorial Aan de slag met Azure IoT Hub voor .NET te volgen. Deze tutorial begeleidt je door het aanmaken van een Azure-proefaccount, het instellen van een Azure IoT Hub en het ontwikkelen van de kernvoorbeelden om IoT Hub-berichten te verzenden en ontvangen.
Download ook de Azure IoT Hub Device Explorer voor eenvoudig beheer van de Windows 10 IoT Core-apparaten die verbinden met je Azure IoT Hub. Download de bron en/of installer van hier.
Windows 10 IoT Core op Raspberry Pi 2
Met een Windows 10-ontwikkelmachine, download Windows 10 IoT Core voor Raspberry Pi 2 en flash een microSD-kaart met de Windows IoT Image Helper.
Monteer de microSD-kaart in de Raspberry Pi 2, sluit hem aan op ethernet, en zorg dat hij in de Windows IoT Core Watcher op de ontwikkelmachine verschijnt wanneer hij opstart.
Sluit een knop op een breadboard aan zoals in de afbeelding hieronder getoond. Zie schema aan de bottom van deze pagina. Links naar de volgende broncode vind je ook aan de bottom van deze pagina.

Universele Windows-applicatie voor data-upload
Start Visual Studio 2015 op een Windows 10-computer en kies Bestandsmenu > Nieuw > Project. Kies de lege appsjabloon voor de Universele Windows-applicatie. Noem het nieuwe project IoTHubClientSendEvent. Gebruik NuGet om Microsoft.Azure.Devices.Client en Newtonsoft.Json toe te voegen. Voeg ook een verwijzing toe voor de Windows IoT Extensions voor de UWP om toegang te krijgen tot de GPIO op de Raspberry Pi 2.
Zodra Visual Studio klaar is, voeg de volgende using-statements toe aan de bovenzijde van Mainpage.xaml.cs om de benodigde bibliotheken te laden voor communicatie met Azure en interfacing met de GPIO-pinnen:
using Windows.Devices.Gpio;
using Newtonsoft.Json;
using Microsoft.Azure.Devices.Client;
using System.Text;
Voeg de volgende variabelen en constanten toe aan de MainPage-klasse. De deviceId-waarde moet de naam zijn van het apparaat geconfigureerd in de Azure IoT Hub Device Explorer.
private const int buttonPin = 6;
private GpioPin buttonGPIO;
static DeviceClient deviceClient;
static string deviceId = "MakerChallengeDevice2";
static string uploadFile = "data.csv";
Voeg een evData-klasse toe voor JSON-serialisatie, ook in de MainPage-klasse.
class evData {
public string id { get; set; }
public string data { get; set; }
}
Voeg deze 2 regels toe aan de MainPage-functie. Haal de waarde op voor DEVICE_CONNECTION_STRING uit de Azure IoT Hub Device Explorer zoals hierboven beschreven.
deviceClient = DeviceClient.CreateFromConnectionString("DEVICE_CONNECTION_STRING", TransportType.Http1);
initGPIO();
Voeg een functie toe om de GPIO te initialiseren:
private void initGPIO() {
var gpio = GpioController.GetDefault();
buttonGPIO = gpio.OpenPin(buttonPin);
// Controleer of input pull-up weerstanden ondersteund worden
if (buttonGPIO.IsDriveModeSupported(GpioPinDriveMode.InputPullUp))
buttonGPIO.SetDriveMode(GpioPinDriveMode.InputPullUp);
else
buttonGPIO.SetDriveMode(GpioPinDriveMode.Input);
// Stel een debounce-timeout in om schakelruis te filteren
buttonGPIO.DebounceTimeout = TimeSpan.FromMilliseconds(50);
// Registreer voor het ValueChanged-event zodat onze buttonPin_ValueChanged-functie wordt aangeroepen wanneer de knop wordt ingedrukt
buttonGPIO.ValueChanged += buttonPin_ValueChanged;
}
Voeg vervolgens een functie toe voor de knop-klik-handler:
private void buttonPin_ValueChanged(GpioPin sender, GpioPinValueChangedEventArgs e) {
// Stuur een bericht wanneer de knop wordt ingedrukt
if (e.Edge == GpioPinEdge.FallingEdge) {
sendMessageToIOTHub();
}
}
Voeg de daadwerkelijke sendMessagetoIOTHub()-functie toe om een bericht naar de Azure IoT Hub te sturen:
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);
}
Compileer de oplossing voor de standaard Debug x86 om te controleren of het werkt. Vervolgens, wijzig het doel naar Release ARM en selecteer Remote Machine.

Als het Windows 10 IoT Core-apparaat in het netwerk is, zal Visual Studio 2015 het zien en toestaan om het als deployment-doel in te stellen.
Snelle tip:
Voordat je de applicatie naar Windows IoT Core deployed, klik met rechts op het project en kies Eigenschappen. Op het Application-paneel, klik op de Package Manifest-knop. Klik op het Packaging-tabblad en wijzig de Package Name in een gegeven naam (bijv. IoTHubClientSendEvent). Als je dit niet doet, is het moeilijk om je applicatie in de Windows 10 IoT Core webinterface te identificeren.
Ga nu naar het Build-menu en kies Deploy Solution. Zodra de deployment voltooid is, zoek de Windows 10 IoT Core-apparaten in de Windows IoT Core Watcher. Klik met rechts op de rij en kies Webbrowser Here. Log in met de lokale Administrator-gebruiker en klik op de Apps-link links. Selecteer de naam van de zojuist geïnstalleerde applicatie uit de dropdown Installed Apps en klik op Start.

Laten we dit even rusten en de applicatie ontwikkelen om de IoT Hub te monitoren.
Universele Windows-applicatie om berichten van de Azure IoT Hub te ontvangen
Start Visual Studio 2015 op een Windows 10 en maak een nieuwe C# Windows Console Application. Noem het project IoTEventHubReceiver. Voeg via NuGet WindowsAzure.ServiceBus en Newtonsoft.Json toe.
Voeg de volgende using-statements toe aan de bovenzijde van Program.cs:
using System.IO;
using System.Threading;
using Newtonsoft.Json;
using Microsoft.ServiceBus.Messaging;
Voeg een klasse toe aan de IoTEventHubReceiver-klasse voor de JSON-data die gedeserialiseerd wordt na ontvangst van de Azure IoT Hub.
class evData {
public string id { get; set; }
public string data { get; set; }
}
Voeg variabelen toe om berichten van de Azure IoT Hub te ontvangen. Haal de waarde op voor IOT_HUB_CONNECTION_STRING uit de Azure IoT Hub Device Manager.
static string connectionString = "IOT_HUB_CONNECTION_STRING";
static string iotHubD2cEndpoint = "messages/events";
static EventHubClient eventHubClient;
Voeg deze 2 regels toe aan de main()-functie om de EventHubClient te maken en berichten te ontvangen:
eventHubClient = EventHubClient.CreateFromConnectionString(connectionString, iotHubD2cEndpoint);
SynchMessages();
Voeg ten slotte de SynchMessages()-functie toe om de continue lus in te stellen, en ReceiveMessages om de berichten te ontvangen en op schijf te schrijven.
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(
"Message received from {0}.\n{1}", d.id, d.data));
}
}
Maak op de ontwikkelwerkstation een map c:\gps\download aan voor de ontvangen berichten.
De toepassingen draaien om Azure IoT Hub-berichten te verzenden en ontvangen
Start het IoTEventHubReceiver-programma op de ontwikkelwerkstation en wacht tot de console verschijnt. Druk vervolgens op de knop verbonden met de GPIO op de Raspberry Pi 2 met Windows 10 IoT Core en het IoTHubClientSendEvent-programma. Het indrukken van de knop stuurt een bericht met de tekst "Just checking in!" naar de Azure IoT Event Hub. De console op de ontwikkelmachine toont het volgende bericht na ontvangst:
Message received from MakerChallengeDevice2. Just checking in!
Het versturen van de inhoud van een tekstbestand als bericht is ook mogelijk, mits de tekst minder dan 256 KB is, want dat is de huidige maximale berichtgrootte voor Azure IoT Hub. Zie de sendMessageToIOTHub()-functie hierboven hoe het bestand wordt gelezen en geserialiseerd, en de ReceiveMessagesFromDeviceAsync()-functie hoe het bericht gedeserialiseerd en naar bestand geschreven wordt.
Momenteel staat Windows 10 IoT Core geen bestands toegang via absolute paden via code toe, maar na veel troubleshooting ontdekte ik dat het wel kan verwijzen naar een bestand in dezelfde map als de uitvoerbaar. Over het algemeen is dit niet de beste praktijk, maar het werkt. Om het tekstbestand in de app-map te plaatsen, klik met rechts op het apparaat in de Windows 10 IoT Core Watcher en kies Open Network Share. Authenticeer met de lokale Administrator-gebruiker en blader naar:
c$\Data\Users\DefaultAccount\AppxLayouts
Zoek een map met de naam van je geïnstalleerde applicatie en plaats een tekstbestand erin dat door de uitvoerbare kan worden gelezen. Voor dit voorbeeld moet het tekstbestand data.csv heten en kleiner dan 256 KB zijn. Een goed voorbeeld is een CSV-bestand met Breedtegraad, Lengtegraad, lichtsensorwaarde en functietype. Druk op de knop verbonden met de Raspberry Pi 2 GPIO en de console toont:
Message received from MakerChallengeDevice2.
LAT,LNG,LT,TYP
45.45926,-110.57361,45,6
45.78546,-110.02487,156,3
Uitbreiding van bestandsupload - als je de Aan de slag met Azure IoT Hub voor .NET-voorbeelden volgt, vind je een voorbeeld om bestanden naar Azure Blob Storage te uploaden in de Next Steps-sectie.
Samenvatting
Dit project demonstreert hoe je een eenvoudige Arduino GPS-datalogger kunt maken om informatie te registreren, de verzamelde data te analyseren en de cloud te gebruiken om de verzamelde informatie te beheren. Er zijn veel uitbreidingsmogelijkheden voor dit project, zoals:
- Informatie registreren van verschillende sensortypes op de Arduino GPS-datalogger.
- De informatie direct uploaden van het Arduino-apparaat naar Azure via WiFi, Bluetooth of Cellular.
- Verschillende typen ruimtelijke analyse uitvoeren om beter beslissingen over de omgeving te nemen.
- Een mapping-webapplicatie ontwikkelen om de ruwe of geanalyseerde informatie weer te geven.
- EventProcessors in Azure Stream Analytics gebruiken om op de data te reageren zodra deze door de IoT Hub wordt ontvangen.
Code
Arduino GPS-datalogger
Schets en bedradingsschema voor Arduino GPS-datalogger.
https://github.com/ShawnCruise/ArduinoGPSDataLogger
Azure IoT Hub Voorbeeld
Universele Windows-applicatie om op Windows 10 IoT Core te deployen en berichten naar Azure IoT Hub te sturen.
https://github.com/ShawnCruise/AzureIotHubExample
Azure SDK
Download de Azure IoT Device Explorer hier.
https://github.com/Azure/azure-iot-sdks/blob/master/tools/DeviceExplorer/doc/how_to_use_device_explorer.md
Windows 10 IoT Core Voorbeelden
Voorbeelden om op Windows 10 IoT Core te deployen.
https://github.com/ms-iot/samples
Schema's
GPSDataLogger.fzz
RPi2%20IOT%20Core.fzz
Productieproces
- Nauwkeurige Temperatuur- & Vochtigheidsmonitoring met SHT15 op Windows 10 IoT Core
- Arduino temperatuur- en vochtigheidslogger met DHT11 en Ethernet Shield
- Bouw een Slimme IoT Pot met ESP8266, Arduino & Ultrasonische Sensor – Real-time Monitoring
- Vier met Licht en Geluid: DIY Verjaardags Arduino-project
- u-blox LEA‑6H GPS Module: Arduino & Python Integratie Handleiding
- Je TV bedienen met Alexa via Arduino IoT Cloud – stapsgewijze handleiding
- DIY Gitaar Speed Pick & Stomp Pedal – Bouw Je Eigen 3D-Gemotoriseerde Plektron
- Bouw een WiFi Weerstation met ESP8266 en DHT22 Temperatuursensor
- Azure IoT Zwembadbeheersysteem: Slimme Sensoren & Remote Monitoring
- PCB-ontwerp voor Internet of Things meesteren: Een uitgebreide gids
- Avnet Silica toont cutting‑edge AI, IoT en connectiviteits‑oplossingen op Embedded World 2019