使用 Helium、Azure IoT 中心和 Power BI 实现实时 GPS 跟踪
组件与物料
| Helium Atom 原型模块 | ×1 |
| Arduino Zero | ×1 |
| Adafruit Ultimate GPS 扩展板 | ×1 |
| 面包板 (通用) | ×1 |
应用与在线服务
- Microsoft Azure
- Arduino IDE
项目简介
Helium 致力于帮助开发者构建低功耗、安全、互联的设备。本项目将演示如何将 Helium Atom 原型模块与 Arduino Zero 和 Adafruit Ultimate GPS 扩展板结合,通过 Helium 网络无缝发送数据到 Azure IoT 中心,最后在 Power BI 报表中可视化数据。
您可以在 helium.com/store 了解更多 Helium 的低功耗、安全、长距离无线产品并购买所需硬件。
硬件连接
组装 Helium Atom 与 Arduino
首先将 Helium Atom 原型模块连接到 Helium Atom Arduino 适配板,再连接到 Arduino。本指南使用 Arduino Zero,但您也可以使用 Uno、Due、M0 或其他兼容的 Arduino 开发板。

连接 GPS 扩展板
接下来将 Adafruit Ultimate GPS 扩展板连接到 Arduino。为便于接线和理解,我们使用面包板,但也可以直接将 GPS 扩展板接线到 Arduino。接线方式如下:
- Arduino 5V → GPS VIN
- Arduino GND → GPS GND
- Arduino D12 → GPS TX
- Arduino D10 → GPS RX

配置 Helium Element
现在需要连接并供电 Helium Element。如果使用蜂窝版 Element,只需通电等待指示灯变为青色即可。如果使用以太网版 Element,或希望为蜂窝版 Element 使用有线连接,请将 Element 的以太网端口连接到启用 DHCP 的端口(如光猫或无线路由器的 LAN 口)。Element 通电后前面板指示灯变绿即表示就绪。

Helium 仪表盘与通道配置
激活设备
首先在 Helium 仪表盘中将 Atom 和 Element 添加到用户账户。如果您有设备但无账户,请邮件联系 support@helium.com;否则使用购买硬件时获得的凭据登录。
登录后,先激活 Element:点击左侧 Elements,右上角 Add New,输入 Element 背面标签上的 MAC 地址后 4 位和 HVV,命名并可选添加标签,点击 Activate Element。

同理激活 Atom:点击左侧 Atoms,Add New,输入 Atom 标签上的 MAC 和 HVV,点击 Activate Atom。

创建 Azure IoT 中心
在 Azure 门户创建 IoT 中心作为 Helium Atom 设备的数据接入点。假设您已有 Azure 账户,否则需先注册。
- 点击左上角 + → Internet of Things → IoT Hub
- 按需配置,建议勾选 Pin to Dashboard 方便后续查找
- 部署完成后(可能需几分钟),从仪表盘进入该 IoT 中心

获取连接字符串
在 IoT 中心左侧菜单选择 Shared Access Policies,选中 RegistryReadWrite,复制右侧 Connection string—primary key 旁的复制图标。此字符串将在 Helium 仪表盘中使用,请妥善保管,切勿泄露。

创建 Helium 通道
返回 Helium 仪表盘,点击左侧 Channels,在 Create New Channel 下选择 Azure IoT Hub,粘贴刚复制的连接字符串创建通道。为通道命名(如 "Hackster Guide"),稍后 Arduino 代码中需使用该名称发送数据。

Arduino 程序
安装必要库:在 Arduino IDE 中通过 Sketch → Include Library → Manage Libraries 搜索并安装 Helium 和 Adafruit GPS 库。

以下程序初始化 Atom,创建与 Azure IoT Hub 通道匹配的 Helium 通道,采集 GPS 数据,格式化为 JSON 并通过 Helium 网络发送:
/*
* Copyright 2017, Helium Systems, Inc.
* All Rights Reserved. See LICENCE.txt for license information
*/
#include "Arduino.h"
#include "avr/dtostrf.h"
#include "Helium.h"
#include
#include
#include "wiring_private.h" // pinPeripheral() function
#define atom_serial Serial1
#define PIN_SERIAL2_RX (34ul)
#define PIN_SERIAL2_TX (36ul)
#define PAD_SERIAL2_TX (UART_TX_PAD_2)
#define PAD_SERIAL2_RX (SERCOM_RX_PAD_3)
Uart Serial2(&sercom1, PIN_SERIAL2_RX, PIN_SERIAL2_TX, PAD_SERIAL2_RX, PAD_SERIAL2_TX);
void SERCOM1_Handler() {
Serial2.IrqHandler();
}
Helium helium(&atom_serial);
Channel channel(&helium);
#define gps_serial Serial2
Adafruit_GPS GPS(&gps_serial);
void setup() {
pinPeripheral(10, PIO_SERCOM);
pinPeripheral(12, PIO_SERCOM);
Serial.begin(115200);
Serial.println("Starting");
helium.begin(helium_baud_b115200);
Serial.print("Connecting - ");
int status = helium.connect();
while (status != helium_status_OK) {
status = helium.connect();
}
Serial.println("Succeeded");
int8_t result;
Serial.print("Creating Channel - ");
status = channel.begin("Hackster Guide", &result);
if (helium_status_OK == status && result == 0) {
Serial.println("Succeeded");
} else {
Serial.println("Failed");
}
delay(1000);
GPS.begin(9600);
GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);
GPS.sendCommand(PGCMD_NOANTENNA);
delay(2000);
}
uint32_t timer = millis();
void loop() {
char c = GPS.read();
if (GPS.newNMEAreceived()) {
if (!GPS.parse(GPS.lastNMEA())) return;
}
if (timer > millis()) timer = millis();
if (millis() - timer > 2000) {
timer = millis();
if (GPS.fix) {
char lat[10], lon[10], data[100];
dtostrf(GPS.latitudeDegrees, 4, 4, lat);
dtostrf(GPS.longitudeDegrees, 4, 4, lon);
sprintf(data, "{\"lat\": \"%s\", \"lon\": \"%s\"}", lat, lon);
int8_t result;
Serial.print("Sending - ");
int status = channel.send(data, strlen(data), &result);
if (helium_status_OK == status && result == 0) {
Serial.print("Successfully sent ");
Serial.println(data);
} else {
Serial.println("Failed");
}
} else {
Serial.println("No GPS fix!");
}
}
}
在 Arduino IDE 中新建草稿 (File → New),粘贴上述代码。通过 USB 连接 Arduino/Atom 组合,点击上传按钮(右箭头图标)。
几秒后 Atom 指示灯会先闪烁红蓝,然后稳定为红色闪烁,表示已连接 Helium 网络。GPS 的 FIX 灯也会以慢速红闡模式闪烁,停止闪烁后表示获取到卫星定位,开始发送数据。建议将 GPS 放置在窗边或室外以获得更好信号。
可通过 Arduino IDE 的 Serial Monitor (Tools → Serial Monitor) 查看调试输出,应显示连接、创建通道,随后出现一系列 No GPS fix! 直到获取卫星定位。
验证数据传输
Arduino、Atom 和 GPS 运行后,返回 Helium 仪表盘检查数据是否成功路由到 Azure 通道。点击左侧 Channels,选择已创建的 Azure 通道,向下滚动查看 Event Log,应显示时间戳、数据大小及路由状态。

在 Azure IoT 中心的 Device Explorer 中也能看到以 MAC 地址列出的 Helium Atom 设备。点击设备可确认其通过硬件签名的 X.509 证书自动实现了安全连接,无需额外配置。

将数据导入 Power BI
假设您已有 Power BI 账户和工作区(否则请访问 powerbi.com 创建)。
创建 Azure 流分析作业,将 IoT 中心数据传递给 Power BI:
- Azure 门户左上角 New,搜索 Stream Analytics Job 并创建
- 部署完成后,在作业页面点击 Inputs → Add,别名自定义,源选择 IoT Hub,选中刚创建的 IoT 中心,其余默认
- 点击 Outputs → Add,接收器选择 Power BI,授权账户并选择工作区,命名表名
- 点击 Query,编写查询将输入数据输出到 Power BI,例如:
SELECT * INTO [PowerBI输出别名] FROM [IoT中心输入别名] - 保存查询,返回概览页点击 Start 启动作业,几分钟后数据将流入 Power BI

Power BI 可视化
数据流入后,在 Power BI 工作区点击右上角 + Create → Report,选择流分析作业创建的数据集,点击 Create。

右侧可视化面板选择地图图标(白色地球)。将字段面板中的 lat 拖至 Latitude,lon 拖至 Longitude。可选将 EventProcessedUTCTime 拖至 Tooltips 以便鼠标悬停显示时间。点击右上角 Save 保存。现在您将看到显示 Helium Atom 位置的地图。

完整代码
完整代码已在上方 Arduino 程序部分提供,也可在代码区下载。
制造工艺
- 基于 Arduino 与 Python 的可靠 RFID 考勤系统
- 构建 GPS 数据记录器:结合 Azure IoT Hub 实现空间分析
- 基于 Arduino、1Sheeld 与红外控制的万能安卓遥控器
- Arduino 与智能手机打造智能电压表——简单易做的 DIY 项目
- 基于 Arduino 与 MAX30100 的实时物联网心率监测系统
- 基于 Arduino MKR1000 与 ThingSpeak 的远程 IoT 机械臂控制系统
- 智能物联网罐:ESP8266 + Arduino + 超声波传感器实时监测罐内物位
- 基于Arduino UNO的精准频率与占空比测量
- Arduino 声纳实时测距与 Processing 可视化
- Bolt IoT + Arduino UNO 实现 6 路 LED 无级调光
- u-blox LEA-6H GPS 模块:Arduino 与 Python 集成指南
- Azure IoT智能游泳池监控系统:温度感知与远程控制