使用 Helium、Azure IoT 中心和 Power BI 的 GPS 跟踪
组件和用品
| × | 1 | ||||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 |
应用和在线服务
![]() |
| |||
![]() |
|
关于这个项目
关于这个项目
Helium 的存在是为了帮助开发人员构建低功耗、安全、连接的设备。在本项目中,我们将演示如何使用 Helium Atom Prototyping 模块与 Arduino Zero 和 Adafruit Ultimate GPS Breakout 将数据无缝发送到 Azure IoT 中心,然后发送到 Power BI 报告以可视化数据。
您可以在 helium.com/store 上详细了解 Helium 的低功耗、安全、远距离无线产品并购买所有必需的硬件。
硬件
您需要做的第一件事是将您的 Helium Atom 原型设计模块连接到 Helium Atom Arduino 适配器,然后连接到您的 Arduino。我们在本指南中使用 Arduino Zero,但您可以使用 Uno、Due、M0 或任何其他您喜欢的 Arduino。
将 Atom 连接到 Arduino 后,您应该会看到如下所示的内容:

接下来,我们需要将 Adafruit Ultimate GPS Breakout 连接到 Arduino 三明治。我们将在这里使用面包板只是为了让事情变得更容易和更清晰,但您也可以轻松地将 GPS 分线器直接连接到 Arduino。您的接线应采用以下形式:
Arduino 5v -> GPS VIN
Arduino GND -> GPS GND
Arduino D12 -> GPS TX
Arduino D10-> GPS RX
完成后,您应该拥有如下所示的内容:

好的,现在我们有了 Arduino 方面的设置,我们需要连接 Helium Element 并启动。如果您有 Cellular Element,则只需打开电源并等待灯光变为青色。而已。如果您有以太网元素,或者如果您更喜欢为蜂窝元素使用以太网连接,请将元素的以太网端口插入启用 DHCP 的端口,如电缆调制解调器或无线路由器的背面。一旦您为 Element 通电并且 Element 前面的灯变为绿色,您就可以开始使用了。

现在您已经完成了 Arduino 和 Atom 硬件设置,并且 Element 已通电并连接,是时候在 Helium 仪表板中设置所有这些了。</P>
Helium 仪表板和通道
首先,我们需要将 Atom 和 Element 添加到仪表板中的用户帐户。如果您没有用户帐户但手头有设备,请发送电子邮件至 [email protected],否则请使用您从 Helium 购买硬件时收到的凭据登录。
登录后,我们需要先激活我们的元素。点击元素 在左侧,然后 添加新 右上角可让您到达正确的位置。输入 MAC 的最后 4 个 地址和HVV 从 Element 背面的标签中,为其命名,并可选择添加一些标签。点击激活元素 让它继续。

然后我们需要对 Atom 重复相同的过程。再次点击原子 在左侧,然后添加新 , 并提供 MAC 和HVV 从 Atom 标签中,可选择添加一些标签,然后单击 Activate Atom .

接下来,我们需要创建一个 Azure IoT 中心,作为所有 Helium Atom 设备的 Azure 引入点。我们假设您已经有一个 Azure 帐户,否则您需要创建一个。
登录到 Azure 后,我们将创建一个 IoT 中心。点击+ 在左上角,然后是物联网 ,然后 物联网中心 :

您需要就如何设置 IoT 中心做出一些选择,然后点击“创建”。我们建议您选择 Pin to Dashboard 在底部,以便以后更容易找到:

完成并且集线器完成部署后(这可能需要几分钟),从仪表板上单击它。要设置 Helium 通道,我们需要来自集线器的一条信息。从 IoT 中心内选择共享访问策略 在左侧,选择 RegistryReadWrite ,然后单击连接字符串—主键旁边的复制图标 在右侧。这会将连接字符串复制到我们将在 Helium 仪表板中使用的剪贴板。请注意不要与您不信任的任何人共享此字符串。 (在这个例子中我们只是使用了一个临时集线器。)

回到 Helium 仪表板,我们现在需要创建一个映射到您刚刚创建的 Azure IoT 中心的通道。首先,点击频道 在左侧,然后单击 Azure IoT 中心 下面创建新频道 .我们将粘贴连接字符串 我们从 Azure 复制以在 Helium 上创建通道:

为频道命名,然后点击创建 .记住名称很重要,因为您需要在 Arduino 代码中使用该名称将数据发送到该频道。
Arduino 草图
设置 Azure IoT 中心并创建 Helium 通道后,我们现在需要一个适当的 Arduino Sketch,它利用 Helium Arduino 和 Adafruit GPS 库将 GPS 位置发送到 Helium,然后发送到我们新创建的 Azure 通道。>
首先,您需要在 Arduino IDE 中安装 Helium Arduino 库和 Adafruit GPS 库。完成此操作的最简单方法是转到 Sketch -> Include Library -> Manage Libraries IDE 中的菜单,然后搜索 Helium 和 Adafruit GPS 然后点击安装 .

下面的草图初始化 Atom,创建一个与 Azure IoT Hub 匹配的通道 我们在上一步中创建的通道,从 Adafruit GPS 板收集 GPS 数据,将其格式化为 JSON,然后通过 Helium 网络发送。
此处提供有关 Helium Atom Arduino 库的更多详细信息和指南。
/* * 版权所有 2017,Helium Systems, Inc. * 保留所有权利。有关许可证信息,请参阅 LICENCE.txt */ #include "Arduino.h" #include "avr/dtostrf.h" #include "Helium.h" #include #include #include "wiring_private .h" // pinPeripheral() 函数 #define atom_serial Serial1 // 用于 GPS #define PIN_SERIAL2_RX (34ul) // D12 上 PIO_SERCOM 的引脚描述编号 #define PIN_SERIAL2_TX (36ul) // D10 上 PIO_SERCOM 的引脚描述编号 #define PAD_SERIAL2_TX (UART_TX_PAD_2) // SERCOM pad 2 #define PAD_SERIAL2_RX (SERCOM_RX_PAD_3) // SERCOM pad 3 Uart Serial2(&sercom1, PIN_SERIAL2_RX, PIN_SERIAL2_TX, PAD_SERIAL2_RX, PAD_SERIAL2_TX);void SERCOMq1Serial);void SERCOMq1Serial }氦氦(&atom_serial); Channel channel(&helium);//GPS 东西#define gps_serial Serial2 Adafruit_GPS GPS(&gps_serial);void setup() { pinPeripheral(10, PIO_SERCOM); pinPeripheral(12, PIO_SERCOM); Serial.begin(115200); Serial.println("开始"); // 开始与 Helium Atom 通信 // 波特率因支持的板而异 // 并在 Board.h helium.begin(helium_baud_b115200 ); 中配置; // 将 Atom 连接到 Helium 网络 Serial.print("Connecting - "); int status =helium.connect();而(状态!=helium_status_OK){ status =helium.connect(); Serial.println("成功"); // 开始与通道通信。这应该只需要 // 完成一次。 // // 注意:请确保您已经在 Helium Dashbaord int8_t 结果中创建了一个匹配的通道; Serial.print("创建频道-"); status =channel.begin("黑客指南", &result); if (helium_status_OK ==status &&result ==0) { Serial.println("Succeeded"); } else { Serial.println("失败"); } 延迟(1000); //Init GPS GPS.begin(9600); GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); GPS.sendCommand(PGCMD_NOANTENNA);延迟(2000); }uint32_t 定时器 =毫秒(); 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];字符 [10];字符数据[100]; dtostrf(GPS.latitudeDegrees, 4, 4, lat); dtostrf(GPS.longitudeDegrees, 4, 4, lon); //格式化一个纬度/经度的JSON对象发送到Azure sprintf(data, "{\"lat\":\"%s\", \"lon\":\"%s\"}", lat,隆); // 将位置数据发送到配置的通道 int8_t result; //来自氦气路由器的响应 Serial.print("Sending - "); int status =channel.send(data, strlen(data), &result); //status 是来自 Atom 串行连接的响应 if (helium_status_OK ==status &&result ==0) { Serial.print("Successfully sent "); Serial.println(数据); } else { Serial.println("失败"); } } else { Serial.println("没有GPS定位!"); } } }
安装库后,创建一个新草图(文件 -> 新建 从 Arduino IDE 中),然后粘贴上面的代码。通过 USB 连接您的 Arduino/Atom 三明治,然后点击上传 看起来像右手箭头的按钮。
几秒钟后,您应该会看到 Atom 灯开始以红色和蓝色闪烁,然后稳定为红色闪烁模式。这意味着 Atom 现在已连接到 Helium 网络。 GPS FIX 灯也应该以缓慢的红色图案闪烁。一旦停止,GPS 模块就会确定您的位置,并将开始向 Helium 发送数据。尝试将 GPS 放在靠近窗户的地方或理想情况下完全放在外面会有所帮助。
您可以检查串行监视器 (工具 -> 串行监视器 ) 从 Arduino IDE 中查看调试输出。您应该会看到显示连接、创建频道和一系列无 GPS 修复!的消息 消息,直到获得卫星定位。
检查数据是否正确发送
现在 Arduino、Atom 和 GPS 已启动并运行,我们可以返回 Helium 仪表板并确保数据正在传送到 Azure 通道。
点击频道 在左侧,然后选择您已经在 Active Channels 中创建的 Azure 频道 部分应将您带到详细视图 - 向下滚动此处应显示事件日志,您希望在其中看到类似于下面的屏幕截图的内容。这会显示数据的时间戳和大小,以及是否成功路由到 Azure 的报告:

如果您在设备资源管理器下查看您的 Azure IoT 中心 导航您还应该看到您的 Helium Atom 设备列在其 MAC 地址下。单击它还会确认我们已使用硬件签名的 X509 证书自动保护此设备,无需任何配置。

将数据导入 Power BI
我们假设你已经设置了一个 Power BI 帐户,并且已经创建了一个工作区。 (如果没有,请前往 www.powerbi.com 并设置一个。)
设置 Power BI 帐户后,我们现在需要创建 Azure 流分析作业,以从 Azure IoT 中心获取数据并将其传送到 Power BI。
在 Azure 仪表板中,单击新建 在左上角,搜索 Stream Analytics Job , 出现后选择它。点击创建 在左下角,选择选项,然后点击创建进行设置。
部署后,我们需要告诉流式作业使用 IoT 中心作为输入,使用 Power BI 作为输出。在“流式作业”页面中,单击输入 从左侧菜单,然后添加 .
为作业指定别名(名称),然后选择 IoT 中心 从源下拉菜单。从 IoT 中心下拉列表中选择适当的 IoT 中心,并将其他所有内容保留为默认值。你应该得到这样的结果:

创建输入后,我们将创建一个连接到 Power BI 的输出。在“流式作业”页面中,单击输出 从左侧菜单,然后添加 .我们将选择Power BI 从接收器 落下。然后你必须授权你的 Power BI 帐户并选择要使用的工作区。为表创建一个名称。你最终会得到这样的结果:

最后一步是创建一个将输入链接到输出的查询。再次点击查询 从左侧菜单。您会希望您的查询基本上采用与下面的屏幕截图相匹配的形式,具体取决于您在上一步中为输入和输出命名的内容。这将选择来自 IoT 中心的所有数据并将其输出到 Power BI 工作区。

点击左上角的保存,假设您正确命名了所有内容,您就快完成了。现在返回概览页面并点击开始 在顶部导航栏中,几分钟后,数据就会流入 Power BI。
在 Power BI 中进行可视化
现在数据正在流动,我们可以在 Power BI 中进行快速可视化,以向我们展示地图上的所有内容。
转到 Power BI 工作区,然后单击 + 创建 在右上角,然后选择报告 .然后,您将选择您在 Azure 流作业中创建的数据集并点击创建 .

接下来,我们将在右侧窗格中选择地图可视化,它看起来像一个白色的地球。在最右侧,您将看到我们从 Arduino 发送的数据字段。拖动纬度 到纬度和lon 到左侧窗格中的经度。你也可以拖拽 EventProcessedUTCTime 如果您想查看鼠标悬停时发送的时间,请转到工具提示。然后点击右上角的保存。而已!您现在将拥有一张地图,显示连接到 Arduino 的 Helium Atom 的位置。

代码
- Atom + Arduino + Adafruit GPS
Atom + Arduino + Adafruit GPSC/C++
/* * 版权所有 2017,Helium Systems, Inc. * 保留所有权利。有关许可证信息,请参阅 LICENCE.txt*/#include "Arduino.h"#include "avr/dtostrf.h"#include "Helium.h"#include#include #include "wiring_private .h" // pinPeripheral() function#define atom_serial Serial1//for GPS#define PIN_SERIAL2_RX (34ul) // D12上PIO_SERCOM的引脚描述号#define PIN_SERIAL2_TX (36ul) // D10上PIO_SERCOM的引脚描述号#define PAD_SERIAL2_TX (UART_TX_PAD_2) // SERCOM pad 2#define PAD_SERIAL2_RX (SERCOM_RX_PAD_3) // SERCOM pad 3Uart Serial2(&sercom1, PIN_SERIAL2_RX, PIN_SERIAL2_TX, PAD_SERIAL2_RX, PAD_SERIAL2_TX);void heallium_Handler)(&Sercom1, PIN_SERIAL2_TX);}SERIAL_m_Handler);void healium_Handler);通道通道(&helium);//GPS 东西#define gps_serial Serial2Adafruit_GPS GPS(&gps_serial);void setup() { pinPeripheral(10, PIO_SERCOM); pinPeripheral(12, PIO_SERCOM); Serial.begin(115200); Serial.println("开始"); // 开始与 Helium Atom 通信 // 波特率因支持的板而异 // 并在 Board.h helium.begin(helium_baud_b115200) 中配置; // 将 Atom 连接到 Helium 网络 Serial.print("Connecting - "); int status =helium.connect();而(状态!=helium_status_OK){ status =helium.connect(); Serial.println("成功"); // 开始与通道通信。这应该只需要 // 完成一次。 // // 注意:请确保您已经在 Helium Dashbaord int8_t 结果中创建了一个匹配的通道; Serial.print("创建频道-"); status =channel.begin("黑客指南", &result); if (helium_status_OK ==status &&result ==0) { Serial.println("Succeeded"); } else { Serial.println("失败"); } 延迟(1000); //Init GPS GPS.begin(9600); GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); GPS.sendCommand(PGCMD_NOANTENNA);延迟(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];字符 [10];字符数据[100]; dtostrf(GPS.latitudeDegrees, 4, 4, lat); dtostrf(GPS.longitudeDegrees, 4, 4, lon); //格式化一个纬度/经度的JSON对象发送到Azure sprintf(data, "{\"lat\":\"%s\", \"lon\":\"%s\"}", lat,隆); // 将位置数据发送到配置的通道 int8_t result; //来自氦气路由器的响应 Serial.print("Sending - "); int status =channel.send(data, strlen(data), &result); //status 是来自 Atom 串行连接的响应 if (helium_status_OK ==status &&result ==0) { Serial.print("Successfully sent "); Serial.println(数据); } else { Serial.println("失败"); } } else { Serial.println("没有GPS定位!"); } }}
制造工艺
- 使用 Arduino 和 RFID 和 Python 的考勤系统
- GPS 数据记录器、空间分析和 Azure IoT 中心。
- 使用 Arduino、1Sheeld 和 Android 的通用远程控制
- 使用 Arduino 和智能手机的 DIY 电压表
- 使用物联网的心率监测器
- 使用物联网远程控制机械臂
- IOT - 使用 ESP8266、Arduino 和超声波传感器的智能罐
- 使用 Arduino 的频率和占空比测量
- Sonar 使用 arduino 并在处理 IDE 上显示
- 使用 Bolt 和 Arduino 控制 LED 亮度
- u-blox LEA-6H 02 GPS 模块,带有 Arduino 和 Python
- Azure IoT 游泳池