아두이노와 애저(Azure)로 스마트 식물 IoT 온실 구축하기
부품 및 소모품
| Seeed Base Shield V2 |
1개 |
| Seeed Grove - 릴레이 (펌프 제어용) |
1개 |
| Seeed Grove - 온도/습도 센서 (TH02) |
1개 |
| 아두이노 우노 |
1개 |
| Helium 스타터 킷 (Atom + Element + 아두이노 브레이크아웃) |
1세트 |
추가 센서: 토양 수분, UV 라이트, Grove OLED 디스플레이 (Base Shield에 연결)
앱 및 온라인 서비스
- Microsoft Azure (IoT Hub, SQL Database, Functions)
- Microsoft Visual Studio 2015+
- Helium Network Dashboard
프로젝트 소개
2019 한-중 청년 메이커 대회 출품작. 식물 센서 데이터를 Helium 네트워크를 통해 Azure IoT Hub로 전송, Azure Functions로 SQL Database에 저장, HTTP API로 조회하는 엔드투엔드 서버리스 IoT 시스템입니다. 자동/원격 급수 제어 포함.
1단계: 부품 준비 및 센서 연결
Base Shield에 그로브 센서들(온습도, 수분, UV, 릴레이, OLED) 연결. Helium Atom을 브레이크아웃 보드로 아두이노와 직렬 통신.
2단계: Helium 네트워크 설정
- Helium Dashboard에서 Atom 등록 (디바이스 인증)
- Element(액세스 포인트) 등록 및 활성화 확인
- 채널 생성: "Azure IoT App"
3단계: 아두이노 펌웨어
센서 읽기 → 문자열 포맷("Moisture=...&UVLight=...&Temperature=...&Humidity=...") → Helium 채널로 전송 → OLED 표시 → 수분 낮으면 릴레이로 펌프 5초 작동 → 60초 대기 반복.
4단계: Azure IoT Hub 설정
- IoT Hub 생성 (표준/무료 티어)
- 공유 액세스 정책 → RegistryReadWrite 연결 문자열 복사
- 테스트 디바이스 생성
5단계: Helium → Azure IoT Hub 연동
- Helium Dashboard에서 'Connection' 생성 → Azure 연결 문자열 붙여넣기 (자동 매핑)
- 채널에서 MQTT 토픽 자동 생성 확인
- CLI 테스트:
helium channel send 1 "Hello Azure" → 양측 대시보드에서 수신 확인
6단계: Azure SQL Database
- SQL Database 생성 (Basic 티어 권장, 프로토타입용 최저가)
- 테이블 생성:
SmartPlant (id, Temperature, Humidity, Moisture, UVLight, DateCreated)
- 연결 문자열 복사
7단계: Azure Function App (서버리스 백엔드)
Function 1: IoT Hub 트리거 → SQL INSERT (C#)
public static async Task Run(string myIoTHubMessage, TraceWriter log) {
var map = myIoTHubMessage.Split('&').Select(x => x.Split('=')).ToDictionary(x => x[0], x => x[1]);
var str = ConfigurationManager.ConnectionStrings["sqldb_connection"].ConnectionString;
using (var conn = new SqlConnection(str)) {
conn.Open();
var text = "INSERT INTO dbo.SmartPlant (Temperature, Humidity, Moisture, UVLight) VALUES (" +
map["Temperature"] + ", " + map["Humidity"] + ", " + map["Moisture"] + ", " + map["UVLight"] + ")";
using (var cmd = new SqlCommand(text, conn)) {
var rows = await cmd.ExecuteNonQueryAsync();
log.Info($"{rows} rows updated");
}
}
}
Function 2: HTTP GET 트리거 → 최신 데이터 JSON 반환 (모바일 앱용)
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log) {
var str = ConfigurationManager.ConnectionStrings["sqldb_connection"].ConnectionString;
using (var conn = new SqlConnection(str)) {
conn.Open();
var text = "SELECT TOP 1 Temperature, Humidity, Moisture, UVLight FROM dbo.SmartPlant ORDER BY DateCreated DESC";
using (var cmd = new SqlCommand(text, conn)) {
var reader = await cmd.ExecuteReaderAsync();
// ... 읽어서 JSON 직렬화 반환
}
}
}
Function 3: HTTP GET 바로 SQL INSERT (테스트/디버깅용)
8단계: 모바일 앱 (안드로이드)
4개 센서 값 실시간 표시, 원격 펌프 트리거 버튼. 60초 주기 폴링.
추가: 알렉사 연동
음성으로 식물 상태 조회 및 급수 명령 가능하도록 확장 가능.
코드 저장소
GitHub: smart-plant-iot
아키텍처 다이어그램

Helium Atom → Helium Hub → Azure IoT Hub → Event Hub → Azure Function → Azure SQL → HTTP API → Mobile App