Azure IoT対応スマートプール制御システム:水温・気温監視と遠隔ポンプ制御
部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| DS18B20防水デジタル温度センサ | 2 | 赤:3-5V、青/黒:GND、黄/白:データ |
| IoTパワーリレー(110Vコンセント制御) | 1 | ポンプ・塩水システム用 |
| 抵抗 4.75kΩ (1/4W, 5%) | 2 | DS18B20プルアップ用 |
| Raspberry Pi 2 Model B | 1 | Windows 10 IoT Core稼働、フィールドゲートウェイ |
| Arduino UNO R3 | 1 | 温度センサ読取、I2CでPiへ送信 |
使用アプリ・オンラインサービス
- Microsoft Azure(IoT Hub, Stream Analytics, SQL Database, API App, Web App)
- Windows 10 IoT Core
- Arduino IDE
- Visual Studio 2015 (Update 3)
- Azure IoT Hub Device Explorer
- Fritzing(回路図作成)
- Power BI(ダッシュボード可視化)
プロジェクト概要
インテックス社製15フィート×48インチラウンドプール(約19,000リットル)の水温・気温を監視し、ポンプ・ヒーター・塩水システムを自動制御して、子供たちが快適に泳げる水温を維持しつつ、無駄な運転を防ぐシステムです。砂フィルタ/ポンプ、11kWヒーター、塩水システムが接続されています。
システムアーキテクチャ

Raspberry Pi、Arduino、IoTパワーリレー、ブレッドボードを防水プラスチックケースに収納し、ケーブル用穴と通気孔を設けています。

センサ部(Arduino側)
DS18B20温度センサ×2
- プール水温用:延長ケーブル(ドアベル用20ゲージ線)でプール内に水没設置
- 気温用:プラスチックケース外側にテープ固定
Arduino UNOでDallasTemperatureライブラリとOneWireライブラリを使用し、2つのセンサから摂氏温度を読み取り、1秒ごとにI2CでRaspberry Piへ送信します(データ形式:水温|気温)。
temperatureData = padRight(String(poolSensor.getTempCByIndex(0)) + "|" + String(outsideSensor.getTempCByIndex(0)), I2C_BUFFER_LEN);


リレー制御部(Raspberry Pi側)
IoTパワーリレー
Raspberry Piの3.3V GPIOピンで制御し、110Vコンセント2口(ポンプ用と塩水システム用)をON/OFFします。デフォルトはOFFです。ヒーター(220V/60A)は内蔵フローセンサで水流連動制御されるため、別途リレーは不要としています。

Raspberry Pi(フィールドゲートウェイ)
OS: Windows 10 IoT Core Build 10.0.10586.0
役割:
- ヘッドレスバックグラウンドアプリ(
IoTPoolRaspiBackgroundApp)を実行 - ArduinoからI2Cで温度データ受信
- IoTパワーリレーを3.3V GPIOで制御
- デバイスとしてAzure IoT Hubに登録し、AMQPで毎分テレメトリ送信
Azure IoT Hubへ送信するJSONペイロード(毎分)
{
"PoolName": "iotpool",
"PoolWaterTempC": 30,
"OutsideAirTempC": 27,
"IsPoolPowerOn": false,
"SampleDateTime": "2016-07-05T23:35:58.0882185Z"
}
無料版IoT Hub(8,000メッセージ/日、500バイト/メッセージ)で十分な余裕があります(1,440メッセージ/日、158バイト/メッセージ)。
Azureクラウド側構成
Azure Stream Analytics (ASA)
IoT Hub入力 → Azure SQL Database出力へ、以下のシンプルなクエリで流します。
SELECT PoolName, PoolWaterTempC, OutsideAirTempC, IsPoolPowerOn, SampleDateTime INTO sql FROM iothub
将来的には集計関数でアラート(例:平均水温>35℃で過熱警告)も可能です。
Azure SQL Database
コスト最優先でS0 Standard(10 DTU)を採用。単一テーブルPoolsに全データ蓄積。
CREATE TABLE [dbo].[Pools] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[PoolName] NVARCHAR (MAX) NULL,
[PoolWaterTempC] FLOAT (53) NOT NULL,
[OutsideAirTempC] FLOAT (53) NOT NULL,
[IsPoolPowerOn] INT NOT NULL,
[SampleDateTime] DATETIME NOT NULL,
CONSTRAINT [PK_dbo.Pools] PRIMARY KEY CLUSTERED ([Id] ASC)
);
Azure API App (RESTful)
ASP.NET Web APIで構築。APIキー認証(HTTPヘッダapi-key)。主なエンドポイント:
GET /api/pool/getlatest:最新データ取得POST /api/pool/poweron:ポンプONPOST /api/pool/poweroff:ポンプOFF
将来的にはAzure API Management配下に配置し、Azure AD認証も追加予定。
Azure Web App (管理画面)
ASP.NET Web Formsで構築。Azure AD認証必須。モバイルフレンドリー版も用意。default.aspx.csでAPIエンドポイントとAPIキーを設定します。

Mobile App (Xamarin Forms)
Windows Phone/Windows 10で動作確認済み(iOS/Androidへクロスコンパイル可能)。Core.cs、DataService.cs、PoolPage.xaml.csでAPI URLとキーを設定。

Power BI ダッシュボード
Power BI Desktop(無料版)でAzure SQL DBにDirectQuery接続し、リアルタイムダッシュボードを作成・公開。PowerBI.comまたはモバイルアプリで閲覧可能。将来的にはWebアプリへ埋め込み予定。

参考資料・謝辞
- Windows IoT Blinkyサンプル
- Mike Mackes氏のプールコントローラプロジェクト(I2C/DS18B20サンプルコードの出典)
- Azure IoT Hub C#入門
- Miles Burton氏のDallas Temperature Control Library
Miles Burton氏(ライブラリ提供)とMike Mackes氏(Arduino/I2C/DS18B20コードとインスピレーション)に感謝。
ソースコードリポジトリ
https://github.com/khilscher/iotpool に全ソースコードを公開。
回路図
- Raspberry Pi ↔ Arduino I2C接続(2×DS18B20)

- 全体アーキテクチャ図

製造プロセス
- プール設計・施工完全ガイド:インプールとアボーブグラウンドプール
- GPSデータロガー構築と Azure IoT Hub での空間分析
- IoTとAIで水質監視し水生生物を守るシステム
- ArduinoとMAX30100で作るリアルタイムIoT心拍数モニター
- IoTで遠隔操作する自作ロボットアーム:Arduino MKR1000とSimulink、ThingSpeak活用
- ESP8266・Arduino・超音波センサーで作るスマートIoTジャー:リアルタイム中身監視
- IoT対応ソーラートラッカー:Arduinoによるスマートエネルギー管理
- Arduino、Yaler、IFTTTでWeb対応IoTゲージを構築する
- Arduino、CESで産業グレードIoTボード「Portenta H7」を発表
- Azure RTOS、主要組み込みプラットフォームへ対応拡大、新開発キットで開発を簡素化
- Azure vs AWS:IoTに最適なクラウドプラットフォームはどっち?