Система управления бассейном на Azure IoT: умные датчики и удаленный мониторинг
Компоненты и материалы
| DS18B20 Водонепроницаемый цифровой датчик температуры | × | 2 |
| IoT Power Relay (реле управления питанием) | × | 1 |
| Резистор 4.75 кОм (1/4W, 5%) | × | 2 |
| Raspberry Pi 2 Model B | × | 1 |
| Arduino UNO R3 | × | 1 |
Приложения и онлайн-сервисы
| Microsoft Azure |
| Microsoft Windows 10 IoT Core |
| Arduino IDE |
| Microsoft Visual Studio 2015 |
| Azure IoT Hub Device Explorer |
| Fritzing |
| Power BI |
О проекте
Обзор
Цель проекта — управление и мониторинг бассейна с помощью датчиков температуры, реле и Microsoft Azure.
Вдохновением послужила необходимость удаленного управления детским бассейном Intex 15' x 48" (около 19 000 литров). Бассейн оснащен песковым фильтром/насосом, нагревателем 11 кВт и системой соленой воды. Задача: следить за температурой воды и воздуха, управлять насосом, нагревателем и системой соленой воды, чтобы вода была достаточно теплой, но не перегревалась.

Raspberry Pi, Arduino, IoT Power Relay и макетная плата закреплены в пластиковом контейнере для защиты от влаги. Выдрелены отверстия для кабелей и вентиляции.

Датчики
Мониторинг температуры воды и воздуха осуществляется двумя датчиками DS18B20, подключенными к Arduino Uno через библиотеки Dallas Controls и OneWire. Данные (в °C) передаются на Raspberry Pi каждую секунду по I2C. Два значения разделяются символом «|».
temperatureData = padRight(String(poolSensor.getTempCByIndex(0)) + "|" + String(outsideSensor.getTempCByIndex(0)), I2C_BUFFER_LEN);
Проводка DS18B20:
- Красный — 3.3В/5В
- Синий/Черный — GND
- Желтый/Белый — данные
Для датчика воды использовал дешевый двухжильный провод (от дверного звонка) для удлинения. Датчик погружен в бассейн.

Второй датчик (воздух) закреплен снаружи контейнера.
Реле
Raspberry Pi управляет IoT Power Relay (у которого пара розеток 110В отключены по умолчанию) через 3.3В пин. Переключение этого пина включает/выключает розетки, к которым подключены насос и система соленой воды.

Нагреватель не подключен к реле: у него встроенный датчик потока, он сам включается/выключается в зависимости от наличия течения воды. К тому же, реле для 220В/60А под 3.3/5В управления найти сложно.
В будущем планирую добавить датчики потребления электроэнергии на 110В и 220В цепях. Буду благодарен за рекомендации.
Raspberry Pi
Работает на Windows IoT Core Build 10.0.10586.0 и выполняет:
- Запуск фонового приложения IoTPoolRaspiBackgroundApp;
- Роль IoT-полевого шлюза;
- Питание Arduino Uno по USB (5В);
- Прием температур воды и воздуха от Arduino по I2C;
- Управление IoT Power Relay через 3.3В пин;
- Отправку данных (имя бассейна, температура воды, температура воздуха, статус реле, временная метка UTC) в Azure IoT Hub каждую минуту.
Приложение написано на C# (шаблон Background Application (IoT) в Visual Studio 2015 Update 3).
JSON-полезная нагрузка, отправляемая каждую минуту по AMQP (можно сменить на HTTPS или MQTT):
{ "PoolName" : "iotpool", "PoolWaterTempC" : 30, "OutsideAirTempC" : 27, "IsPoolPowerOn" : false, "SampleDateTime" : "2016-07-05T23:35:58.0882185Z" }
Устройство зарегистрировано в Azure IoT Hub. Проще всего сделать это через Device Explorer, который также удобен для получения строки подключения, мониторинга D2C сообщений и тестирования C2D.
В StartupTask.cs нужно указать:
static string iotPoolConnString = "HostName=<iothubname>.azure-devices.net;DeviceId=iotpool;SharedAccessKey=<key>";
static string deviceName = "iotpool";
Arduino Uno
Подключен к двум DS18B20 (библиотеки Dallas Controls и OneWire). Питание от Raspberry Pi по USB (5В). Передает пару температур на Pi по I2C (пины SDA/SCL). Схема в Fritzing.

Используйте скетч Two-DS18B20-I2C.ino.
Azure
Все компоненты созданы в одном регионе (West US) для минимизации затрат на исходящий трафик.
Azure IoT Hub
Использован бесплатный уровень: 8000 сообщений/день по 500 байт. Наш трафик — 1440 сообщений/день по 158 байт, запас есть.
Регистрация устройства через Device Explorer. Там же получаем строку подключения.

Azure Streaming Analytics
Задача ASA соединяет вход IoT Hub с выходом в Azure SQL Database простым запросом:
SELECT PoolName, PoolWaterTempC, OutsideAirTempC, IsPoolPowerOn, SampleDateTime INTO sql FROM iothub
Каждое D2C сообщение (1 в минуту) записывается в таблицу Pools. В будущем можно добавить агрегацию для алертов (например, средняя температура > 35°C).
Azure SQL Database
Для экономии и низких требований к производительности — уровень S0 Standard (10 DTU). Одна база, одна таблица.
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 API на ASP.NET Web API. Аутентификация по API-ключу в заголовке HTTP:
api-key : {your API key}
Ключ определен в IoTPoolAPI\Controllers\PoolControllers.cs. Мобильное и веб-приложения используют его.
Поддерживаемые методы API показаны на скриншоте.

Планируется размещение за Azure API Management и добавление Azure AD.
Azure Web App
IoTPoolWebApp — ASP.NET Web Forms для работы с API.

Есть мобильная версия. В default.aspx.cs нужно прописать API-ключ и URL эндпоинтов (/api/pool/poweroff, /api/pool/poweron, /api/pool/getlatest).
Интеграция с Azure Active Directory (AAD) для аутентификации пользователей. Необходимо зарегистрировать веб-приложение в своем AAD-тенанте, скопировать Client ID и обновить web.config:
<appSettings>
<add key="ida:ClientId" value="<AAD client ID>" />
<add key="ida:AADInstance" value="https://login.microsoftonline.com/" />
</appSettings>
Мобильное приложение
Написано на Xamarin Forms. Скомпилировано для Windows Phone и Windows 10, должно кросс-компилироваться под iOS и Android.

В Core.cs, DataService.cs, PoolPage.xaml.cs нужно задать API-ключ и URL вашего веб-приложения.
Power BI
Бесплатный Power BI Desktop использован для создания real-time дашборда. Подключение к Azure SQL DB (DirectQuery), создание отчетов, публикация .pbix на PowerBI.com, закрепление на дашборде.

В будущем возможно внедрение Power BI Embedded в веб-приложение. Пока смотрю через PowerBI.com или мобильное приложение Power BI.
Ссылки и ресурсы
- Windows IoT Blinky sample
- Arduino Pool Controller
- Azure IoT Hub C# Get Started
- Azure IoT Hub C2D
- ASP.NET Web API with SQL Database
- Xamarin Forms with Azure
- I2C on Raspberry Pi
- Arduino Windows Guide
- OneWire Library
- Dallas Temperature Control Library
- I2C Tutorial
Особая благодарность Майлзу Бертону за библиотеку Dallas Controls и Майку Мейксу за пример кода Arduino/I2C/DS18B20 и вдохновение.
Код
Формат JSON полезной нагрузки D2C
Примечание: "IsPoolPowerOn" — 0 = выкл, 1 = вкл
{ "PoolName" : "IoTPool", "PoolWaterTempC" : 30, "OutsideAirTempC" : 27, "IsPoolPowerOn" : false, "SampleDateTime" : "2016-07-05T23:35:58.0882185Z" }
Схема таблицы Pools в SQL Database
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)
);
Репозиторий на GitHub
Весь исходный код: https://github.com/khilscher/iotpool
Схемы
Подключение Raspberry Pi к Arduino по I2C с двумя DS18B20: RaspiArduinoTwoDS18B20.fzz
Общая архитектурная схема:


Производственный процесс
- Полное руководство по проектированию и строительству наземных и надземных бассейнов
- Arduino запускает Portenta H7: Industrial-Grade IoT Board дебютирует на CES
- Azure RTOS расширяет поддержку основных встраиваемых платформ с новыми комплектами разработки
- Azure против AWS: какая облачная платформа выигрывает для IoT?
- GPS-трекер с пространственным анализом на Azure IoT Hub
- IoT и ИИ для мониторинга качества воды: защита водных экосистем
- IoT-монитор пульса в реальном времени на Arduino и MAX30100
- Удаленное IoT-управление самодельной манипулятором
- Умная банка на ESP8266 + Arduino: мониторинг наполненности в реальном времени
- IoT-солнечный трекер на Arduino: умное управление энергией с мониторингом через Cayenne