애저 IoT 기반 스마트 수영장 제어 시스템: 온도 모니터링 및 원격 제어
프로젝트 개요
인텍스(Intex) 15피트 원형 수영장(약 19,000리터)을 대상으로, 수온/기온 모니터링과 펌프·히터·염수 시스템 자동 제어를 통해 아이들이 놀기 좋은 수온을 유지하면서 에너지 낭비를 방지하는 IoT 시스템을 구축했습니다. 라즈베리 파이 2(Windows 10 IoT Core)와 아두이노 우노를 조합하고, 마이크로소프트 애저 클라우드 서비스(IoT Hub, Stream Analytics, SQL Database, API App, Web App, Power BI)를 활용해 엔드투엔드 솔루션을 완성했습니다.
시스템 아키텍처

데이터 흐름: DS18B20 센서(2개) → 아두이노 우노(I2C 마스터) → 라즈베리 파이(I2C 슬레이브) → 애저 IoT Hub(AMQP) → 스트림 애널리틱스 → SQL Database → API App ↔ 웹/모바일 앱 / Power BI 대시보드
하드웨어 구성
| 부품 | 수량 | 비고 |
| 라즈베리 파이 2 모델 B | 1 | Windows 10 IoT Core 실행, 필드 게이트웨이 역할 |
| 아두이노 우노 R3 | 1 | DS18B20 2개 연결, I2C로 라즈베리 파이에 온도 전송 |
| DS18B20 방수 온도 센서 | 2 | 수온용(수중 설치), 기온용(박스 외부 부착) |
| IoT 파워 릴레이 (110V 콘센트 제어) | 1 | 라즈베리 파이 3.3V GPIO로 펌프/염수 시스템 전원 제어 |
| 4.75kΩ 저항 (1/4W) | 2 | DS18B20 데이터 라인 풀업용 |
| 방수 보관함, 벨 와이어(연장선), 브레드보드 등 | - | 케이블 그랜드, 환기 구멍 가공 필요 |
주요 구성 요소별 상세
센서부 (아두이노 우노)
- 두 개의 DS18B20을 원와이어(OneWire) 버스로 연결, DallasTemperature 라이브러리로 섭씨 온도 읽기
- 수온 센서는 저렴한 20게이지 벨 와이어로 연장하여 수중 설치
- 기온 센서는 플라스틱 보관함 외부에 테이프로 고정
- 아두이노는 라즈베리 파이 USB로 5V 전원 공급받으며, I2C(SDA/SCL)로 초당 1회 온도 쌍 전송:
"수온|기온" 형식
릴레이 제어 (라즈베리 파이)
- IoT 파워 릴레이의 3.3V 제어 핀을 라즈베리 파이 GPIO에 연결
- GPIO High 시 110V 콘센트 2구 동시 ON (펌프 + 염수 시스템), Low 시 OFF
- 히터(11kW, 220V/60A)는 내장 유량 센서로 펌프 가동 시에만 작동하므로 별도 릴레이 불필요
라즈베리 파이 애플리케이션 (IoTPoolRaspiBackgroundApp)
- Visual Studio 2015, 백그라운드 애플리케이션(IoT) 템플릿으로 개발 (C#)
- 아두이노로부터 I2C 수신 → JSON 페이로드 구성 → 애저 IoT Hub로 분당 1회 D2C 전송 (AMQP)
- JSON 예시:
{ "PoolName": "iotpool", "PoolWaterTempC": 30, "OutsideAirTempC": 27, "IsPoolPowerOn": false, "SampleDateTime": "2016-07-05T23:35:58.088Z" }
- 애저 IoT Hub에 디바이스 등록(Device Explorer 사용), 연결 문자열 코드에 반영
애저 클라우드 파이프라인
| 서비스 | 역할 | 주요 설정 |
| IoT Hub (무료 티어) | 디바이스 인증, D2C/C2D 메시징 | 일일 8,000 메시지, 500바이트 제한 내 여유 |
| Stream Analytics | 실시간 쿼리로 SQL DB 적재 | SELECT ... INTO sql FROM iothub 단순 쿼리 |
| SQL Database (S0 Standard) | 시계열 데이터 저장 | Pools 테이블: Id, PoolName, 수온, 기온, 전원상태, 타임스탬프 |
| API App (ASP.NET Web API) | RESTful 인터페이스 제공 | API 키 인증, GET/POST로 최신 데이터 조회 및 펌프 제어 |
| Web App (ASP.NET Web Forms) | 브라우저 모니터링/제어 UI | AAD 인증 필수, 모바일 친화적 레이아웃 |
| Mobile App (Xamarin Forms) | 크로스플랫폼 네이티브 앱 | WP/Win10 컴파일, iOS/Android 크로스컴파일 가능 |
| Power BI (무료) | 실시간 대시보드 시각화 | DirectQuery로 SQL DB 연결, 보고서 핀 고정 |
소프트웨어 설정 핵심 포인트
라즈베리 파이 코드 (StartupTask.cs)
static string iotPoolConnString = "HostName=<iothubname>.azure-devices.net;DeviceId=iotpool;SharedAccessKey=<key>";
static string deviceName = "iotpool";
웹 앱 설정 (default.aspx.cs, web.config)
// API 엔드포인트 및 키 설정
private static string apiKey = "";
HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Post, "https://<yourwebsite>.azurewebsites.net/api/pool/poweron");
// web.config AAD 설정
<add key="ida:ClientId" value="<AAD client ID>" />
<add key="ida:AADInstance" value="https://login.microsoftonline.com/" />
모바일 앱 설정 (Core.cs, DataService.cs, PoolPage.xaml.cs)
string queryString = "https://<yourwebsite>.azurewebsites.net/api/pool/getlatest";
private static string apiKey = "";
전체 소스 코드 저장소
GitHub: khilscher/iotpool - 모든 프로젝트 코드(라즈베리 파이, 아두이노, API, 웹, 모바일, SQL 스키마) 포함
참고 자료
회로도 (프리칭)
