Бассейн Azure IoT
Компоненты и расходные материалы
| × | 2 | ||||
| × | 1 | ||||
| × | 2 | ||||
| × | 1 | ||||
| × | 1 |
Приложения и онлайн-сервисы
| ||||
| ||||
| ||||
| ||||
| ||||
| ||||
|
Об этом проекте
Обзор
Целью этого проекта является контроль и мониторинг плавательного бассейна с помощью датчиков температуры, реле и Microsoft Azure.
Вдохновением для этого проекта является необходимость удаленного управления и наблюдения за нашим детским бассейном, который представляет собой круглый бассейн Intex 15 x 48 дюймов. Бассейн вмещает около 5000 галлонов воды. Он подключен к песочному фильтру / насосу, нагреватель мощностью 11 кВт и система с соленой водой. Цель состояла в том, чтобы контролировать температуру воды в бассейне, температуру воздуха и управлять насосом, нагревателем и системой соленой воды, чтобы бассейн был достаточно теплым для детей, но не перегружал его.
В этом 5-минутном видео показано, как подключаются бассейн, датчики, печатные платы и реле.
На следующей архитектурной схеме показаны все основные компоненты решения.
Raspberry Pi, Arduino, IoT Power Relay и макетная плата прикреплены на молнии к пластиковому контейнеру для хранения, чтобы не допустить попадания воды / влаги. Просверлены отверстия для кабелей и вентиляции.
Датчики
Мониторинг температуры воды в бассейне и температуры воздуха осуществляется с помощью пары водонепроницаемых датчиков температуры DS18B20, подключенных к Arduino Uno R3 с помощью библиотеки Dallas Controls Library и OneWire Library. Данные о температуре (в градусах Цельсия) отправляются на Raspberry Pi каждые 1 секунду по I2C. Два значения температуры разделены знаком "|".
temperatureData =padRight (String (poolSensor.getTempCByIndex (0)) + "|" + String (outsideSensor.getTempCByIndex (0)), I2C_BUFFER_LEN);
Водонепроницаемые датчики температуры DS18B20 поставляются со следующей разводкой:
- Красный подключается к 3в / 5в.
- Синий / черный соединяется с землей.
- Желтый / белый - данные.
Я использовал дешевый провод звонка 20 калибра (провод дверного звонка), чтобы расширить зону действия DS18B20, который измеряет температуру воды. DS18B20 погружен в бассейн.
Второй датчик DS18B20, считывающий температуру воздуха, прикреплен к внешней стороне пластикового контейнера для хранения.
Реле
Raspberry Pi управляет панелью питания IoT Power Relay, к которой насос и система соленой воды подключены с помощью 110 В. Это делается с помощью вывода 3В на Pi. Переключение вывода 3 В включает / отключает пару розеток 110 В на реле питания IoT (пара розеток по умолчанию отключена). Обратитесь к диаграмме позже для схемы.
Не было необходимости подключать реле к нагревателю, поскольку он имеет встроенный датчик потока и будет останавливать / запускать нагрев в зависимости от отсутствия или наличия потока воды. Кроме того, я не мог легко найти реле для управления цепью 220 В / 60 А, необходимой для нагревателя с использованием 3 В или 5 В.
В будущем я буду прикреплять датчики, чтобы измерить электрическое использование цепей 110 В и 220 В. Если кто-то может порекомендовать, буду благодарен.
Raspberry Pi
Raspberry Pi работает под управлением Windows IoT Core Build 10.0.10586.0 и выполняет следующие функции:
- Запускает IoTPoolRaspiBackgroundApp . фоновое приложение;
- Действует как полевой шлюз IoT (непрозрачный);
- Обеспечивает питание Arduino Uno через USB (5 В);
- Получает температуру бассейна и воздуха (в C) от Arduino Uno по I2C;
- Управляет реле питания Интернета вещей с помощью вывода 3 В; и
- Каждую минуту отправляет в Azure IoT Hub имя пула, температуру бассейна, температуру воздуха, состояние включения / выключения IoT Power Relay и отметку времени (в формате UTC).
IoTPoolRaspiBackgroundApp - это автономное приложение C #, созданное с использованием фонового приложения (IoT) . шаблон проекта в Visual Studio 2015, обновление 3
IoTPoolRaspiBackgroundApp отправляет следующие полезные данные JSON в Azure IoT Hub каждые 1 минуту с помощью AMQP (это можно изменить в исходном коде на HTTPS или MQTT).
{"PoolName":"iotpool", "PoolWaterTempC":30, "OutsideAirTempC":27, "IsPoolPowerOn":false, "SampleDateTime":"2016-07-05T23:35:58.0882185Z"}
Raspberry Pi зарегистрирован как устройство в Azure IoT Hub. Самый простой способ зарегистрировать устройство в Центре Интернета вещей Azure - использовать обозреватель устройств. Этот инструмент также является отличным способом получить строку подключения устройства, отслеживать сообщения D2C (от устройства к облаку) и тестировать отправку сообщений C2D (от облака к устройству).
Измените следующее в StartupTask.cs, чтобы подключить IoTPoolRaspiBackgroundApp к вашему Центру Интернета вещей:
статическая строка iotPoolConnString ="HostName = .azure-devices.net; DeviceId =iotpool; SharedAccessKey ="; статическая строка deviceName ="iotpool";
Ардуино Уно
Arduino Uno R3 подключается к двум датчикам температуры DS18B20 с помощью библиотеки Dallas Controls Library и библиотеки OneWire. Он питается от Raspberry Pi через USB (5 В) и отправляет пару показаний температуры на Raspberry Pi через I2C с помощью контактов SDA и SLC. См. Схему на диаграмме Фритзинга.
Используйте код Two-DS18B20-I2C.ino для запуска Arduino.
Лазурный
Все компоненты Azure были созданы в одном регионе Azure (запад США), чтобы минимизировать затраты, связанные с исходящим трафиком.
Центр Интернета вещей Azure
В этом проекте использовалась бесплатная версия Azure IoT Hub. Он ограничен 8000 сообщений в день по 500 байтов каждое. IoTPoolRaspiBackgroundApp отправляет сообщения D2C со скоростью 1 в минуту или 1440 в день по 158 байт каждое. Это оставляет достаточно места для любых сообщений C2D.
Сначала необходимо зарегистрировать устройство в Центре Интернета вещей Azure. Самый простой способ - использовать Device Explorer. После регистрации вы можете получить строку подключения устройства с помощью обозревателя устройств.
Потоковая аналитика Azure
Задание Azure Streaming Analytics (ASA) соединяет входные данные Центра Интернета вещей с выходными данными Базы данных SQL Azure с помощью следующего простого запроса ASA.
ВЫБРАТЬ PoolName, PoolWaterTempC, OutsideAirTempC, IsPoolPowerOn, SampleDateTimeINTO sqlFROM iothub
Этот запрос записывает каждое сообщение JSON с устройства в облако (D2C) (1 в минуту) в таблицу с именем Pools в базе данных SQL Azure.
Будущие улучшения этого запроса могут включать в себя некоторые функции агрегирования для целей оповещения (например, Среднее значение PoolWaterTempC> 35 указывает на то, что пул становится слишком теплым).
База данных SQL Azure
Чтобы свести к минимуму затраты и поскольку требования к производительности базы данных были минимальными, база данных соответствует стандарту S0 (10 DTU).
Была создана единая база данных с единственной таблицей для хранения всех сообщений D2C.
Схема:
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, ОГРАНИЧЕНИЕ [PK_dbo.Pools] PRIMARY KEY CLUSTERED ([Id] ASC));
Приложение Azure API
API - это RESTful API, созданный с использованием веб-API ASP.NET.
Клиенты API должны проходить аутентификацию с использованием ключа API, указанного в заголовке HTTP.
api-key:{ваш ключ API}
Ключ API определяется в IoTPoolAPI \ Controllers \ PoolControllers.cs . . Мобильное приложение и веб-приложение должны использовать этот ключ API для связи с API.
REST API поддерживает следующие методы:
Будущие улучшения API могут включать его размещение за Azure API Management и добавление других параметров проверки подлинности в API, таких как Azure Active Directory.
Веб-приложение Azure
IoTPoolWebApp содержит приложение веб-форм ASP.NET для взаимодействия с API.
Существует также мобильная версия веб-приложения.
Отредактируйте default.aspx.cs и измените следующее:
частная статическая строка apiKey =""; ... HttpRequestMessage requestMessage =.... "http:// .azurewebsites.net / api / pool / poweroff"); ... HttpRequestMessage requestMessage =.... "http:// <ваш веб-сайт> .azurewebsites.net / api / pool / poweron"); ... HttpRequestMessage requestMessage =.... "http:// <ваш веб-сайт> .azurewebsites.net / api / pool / getlatest ");
Веб-приложение интегрировано с Azure Active Directory (AAD) для проверки подлинности. Веб-приложение требует, чтобы все пользователи прошли аутентификацию с помощью AAD.
Вы должны сначала зарегистрировать свое веб-приложение у своего клиента AAD (например, tenant_name.onmicrosoft.com). Вы можете сделать это через портал Azure или Visual Studio. После регистрации скопируйте идентификатор клиента с портала Azure.
Затем измените домен AAD в веб-приложении, изменив <идентификатор клиента AAD> в web.config.
Мобильное приложение
Мобильное приложение написано с использованием Xamarin Forms. Я скомпилировал его только для работы на Windows Phone и Windows 10, но он должен быть кросс-компилирован на iOS и Android.
Отредактируйте Core.cs и измените следующее:
string queryString ="http:// azurewebsites.net/api/pool/getlatest
Отредактируйте DataService.cs и измените следующее:
частная статическая строка apiKey ="";
Отредактируйте PoolPage.xaml.cs и измените следующее:
частная статическая строка apiKey =""; ... HttpRequestMessage requestMessage =.... "http:// .azurewebsites.net / api / pool / poweroff"); ... HttpRequestMessage requestMessage =.... "http:// .azurewebsites.net / api / pool / poweron");
Power BI
Power BI (бесплатная версия) использовался для создания и публикации панели мониторинга в реальном времени, отображающей данные пула Интернета вещей.
Процесс включал загрузку Power BI Desktop, подключение к базе данных Azure SQL (с помощью DirectQuery), создание некоторых отчетов с визуальными элементами и публикацию .pbix на PowerBI.com. Затем я закрепил отчет на панели управления.
В будущем я могу использовать встроенный Power BI, чтобы напрямую встроить панель мониторинга в веб-приложение.
На данный момент я могу просматривать панель мониторинга через Powerbi.com или через бесплатное мобильное приложение Power BI.
Ссылки
Вот список ресурсов, которые я использовал при создании этого решения:
- https://developer.microsoft.com/en-us/windows/iot/win10/samples/blinky
- https://create.arduino.cc/projecthub/mmackes/pool-controller-8dfa69?ref=tag&ref_id=relays&offset=0
- https://azure.microsoft.com/en-us/documentation/articles/iot-hub-csharp-csharp-getstarted/
- https://azure.microsoft.com/en-us/documentation/articles/iot-hub-csharp-csharp-c2d/
- https://azure.microsoft.com/en-us/documentation/articles/web-sites-dotnet-rest-service-aspnet-api-sql-database/
- https://azure.microsoft.com/en-us/documentation/articles/app-service-mobile-xamarin-forms-get-started/
- https://msdn.microsoft.com/en-us/library/hh975357.aspx
- https://www.arduino.cc/en/Guide/Windows
- http://playground.arduino.cc/Learning/OneWire
- http://milesburton.com/Dallas_Temperature_Control_Library
- https://learn.sparkfun.com/tutorials/i2c
Особая благодарность Майлзу Бертону за Далласскую библиотеку элементов управления и Майку Макксу за образец кода Arduino / I2C / DS18B20 и общее вдохновение для этого проекта.
Код
- Формат полезной нагрузки сообщения JSON для сообщений с устройства в облако (D2C)
- Схема таблицы "Пулы" базы данных SQL
Формат полезной нагрузки сообщения JSON для сообщений с устройства в облако (D2C) JSON
Примечание:«IsPoolPowerOn» - 0 означает отключение питания; 1 означает, что питание включено{"PoolName":"IoTPool", "PoolWaterTempC":30, "OutsideAirTempC":27, "IsPoolPowerOn":false, "SampleDateTime":"2016-07-05T23:35:58.0882185Z" }
Схема таблицы "Пулы" базы данных SQL SQL
СОЗДАТЬ ТАБЛИЦУ [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, ОГРАНИЧЕНИЕ [PK_dbo.Pools] ПЕРВИЧНЫЙ КЛЮЧ КЛАСТЕРИРОВАН ([Id] ASC));
Репозиторий Git Hub для пула Интернета вещей
Весь исходный код https://github.com/khilscher/iotpoolСхема
Raspberry Pi к Arduino через I2C, соединяющий 2 датчика DS18B20 RaspiArduinoTwoDS18B20.fzz Общая архитектурная схемаПроизводственный процесс
- Бассейн
- Плата Arduino предназначена для промышленного Интернета вещей
- Наборы для разработки поддерживают Azure RTOS
- Интернет вещей в облаке:Azure против AWS
- Регистратор данных GPS, пространственный анализ и Azure IoT Hub.
- Спасение водных организмов и борьба с загрязнением воды с помощью Интернета вещей и искусственного интеллек…
- Монитор сердечного ритма с использованием Интернета вещей
- Использование Интернета вещей для удаленного управления манипулятором
- IOT - Smart Jar с использованием ESP8266, Arduino и ультразвукового датчика
- Солнечный трекер на основе Интернета вещей (IoT)