Helium은 개발자가 저전력, 보안, 연결된 장치를 구축할 수 있도록 돕습니다. 이 프로젝트에서는 Helium Atom 프로토타이핑 모듈을 Arduino Zero 및 Adafruit Ultimate GPS Breakout과 함께 사용하여 데이터를 Azure IoT Hub로 원활하게 전송하고, Power BI 리포트로 시각화하는 과정을 안내합니다.
Helium의 저전력, 보안, 장거리 무선 제품에 대해 자세히 알아보고 필요한 하드웨어를 구매하려면 helium.com/store를 방문하세요.
하드웨어 구성
1. Helium Atom과 Arduino 연결
Helium Atom 프로토타이핑 모듈을 Helium Atom Arduino 어댑터에 부착한 후 Arduino에 장착합니다. 이 가이드에서는 Arduino Zero를 사용하지만 Uno, Due, M0 또는 다른 Arduino 보드도 사용 가능합니다.
2. GPS Breakout 배선
Adafruit Ultimate GPS Breakout을 Arduino 샌드위치에 연결합니다. 브레드보드를 사용하면 배선이 더 명확해집니다. 배선은 다음과 같습니다:
Arduino 5V → GPS VIN
Arduino GND → GPS GND
Arduino D12 → GPS TX
Arduino D10 → GPS RX
3. Helium Element 전원 및 연결
Cellular Element를 사용하는 경우 전원을 켜고 표시등이 청록색으로 변할 때까지 기다립니다. Ethernet Element를 사용하거나 Cellular Element에 이더넷 연결을 선호하는 경우, Element의 이더넷 포트를 케이블 모뎀이나 무선 공유기의 DHCP 지원 포트에 연결합니다. Element 전원을 켜고 전면 표시등이 녹색으로 변하면 준비 완료입니다.
Helium 대시보드 및 채널 설정
1. Atom 및 Element 계정 등록
Helium 대시보드에 로그인합니다(계정이 없으면 support@helium.com으로 문의). 왼쪽 메뉴에서 Elements → Add New를 클릭하고 Element 라벨의 MAC 주소 마지막 4자리와 HVV를 입력한 후 Activate Element를 누릅니다. 동일한 과정으로 Atoms 메뉴에서 Atom을 활성화합니다.
2. Azure IoT Hub 생성
Azure 포털에서 + → Internet of Things → IoT Hub를 선택하여 IoT Hub를 만듭니다. 배포 완료 후 대시보드에 고정해 두면 편리합니다.
3. 연결 문자열 복사
IoT Hub에서 Shared Access Policies → RegistryReadWrite → Connection string—primary key 복사 아이콘을 클릭하여 연결 문자열을 클립보드에 복사합니다. 이 문자열은 신뢰할 수 있는 사람과만 공유하세요.
4. Helium 채널 생성
Helium 대시보드에서 Channels → Azure IoT Hub 아래 Create New Channel을 클릭하고 방금 복사한 연결 문자열을 붙여넣어 채널을 만듭니다. 채널 이름은 Arduino 코드에서 사용하므로 기억해 두세요.
Arduino 스케치
Azure IoT Hub 설정과 Helium 채널 생성이 완료되면, Helium Arduino 라이브러리와 Adafruit GPS 라이브러리를 사용하여 GPS 위치 데이터를 Helium 네트워크를 통해 Azure 채널로 전송하는 Arduino 스케치를 작성합니다.
라이브러리 설치
Arduino IDE에서 Sketch → Include Library → Manage Libraries로 이동하여 Helium과 Adafruit GPS를 검색해 설치합니다.
스케치 코드
/*
* 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() 함수
#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/Atom을 USB로 연결하고 Upload 버튼을 누릅니다. 몇 초 후 Atom 표시등이 빨강/파랑으로 깜빡이다가 빨간색 깜빡임으로 바뀌면 Helium 네트워크에 연결된 것입니다. GPS FIX 표시등도 느린 빨간색 깜빡임에서 멈춥니다. GPS 모듈을 창가나 실외에 두면 위성 고정이 더 잘 됩니다.
Arduino IDE의 Serial Monitor(Tools → Serial Monitor)에서 디버그 출력을 확인할 수 있습니다. 연결, 채널 생성, 그리고 GPS 고정 전까지 No GPS fix! 메시지가 나타납니다.
데이터 전송 확인
Arduino, Atom, GPS가 실행되면 Helium 대시보드로 돌아가 데이터가 Azure 채널로 잘 전송되는지 확인합니다. Channels에서 생성한 Azure 채널을 선택하고 Active Channels 섹션의 Event Log를 보면 타임스탬프, 데이터 크기, Azure 라우팅 성공 여부가 표시됩니다.
Azure IoT Hub의 Device Explorer에서도 Helium Atom 장치가 MAC 주소로 등록되어 있고, 하드웨어 서명된 X.509 인증서로 자동 보안이 적용된 것을 확인할 수 있습니다.
Power BI로 데이터 시각화
1. Azure Stream Analytics 작업 생성
Power BI 계정과 작업 영역이 준비되어 있다고 가정합니다(없으면 powerbi.com에서 생성). Azure 대시보드에서 New → Stream Analytics Job 검색 → 선택 → Create로 작업을 만듭니다.
2. 입력 및 출력 구성
입력: Inputs → Add → 별칭 입력 → 소스 IoT Hub 선택 → 해당 IoT Hub 선택 → 기본값 유지.
출력: Outputs → Add → 싱크 Power BI 선택 → Power BI 계정 인증 → 작업 영역 선택 → 테이블 이름 지정.
3. 쿼리 작성
Query 메뉴에서 입력에서 출력으로 데이터를 전달하는 쿼리를 작성합니다. 기본적으로 SELECT * INTO [PowerBI출력] FROM [IoTHub입력] 형태가 됩니다.
저장 후 Overview 페이지에서 Start를 누르면 몇 분 후 Power BI로 데이터가 스트리밍됩니다.
4. Power BI에서 지도 시각화
Power BI 작업 영역에서 + Create → Report → Azure Stream Analytics 작업으로 생성한 데이터셋 선택 → Create. 오른쪽 시각화 패널에서 지도 아이콘(흰색 지구본)을 선택하고 lat을 Latitude, lon을 Longitude에 드래그합니다. EventProcessedUTCTime을 Tooltips에 추가하면 마우스 오버 시 타임스탬프가 표시됩니다. 저장하면 Helium Atom이 부착된 Arduino의 위치를 보여주는 지도가 완성됩니다.