Sistema de Controle de Piscina com Azure IoT: Sensores Inteligentes e Monitoramento Remoto
Componentes e Materiais
| Componente | Quantidade | Observações |
|---|---|---|
| Sensor de Temperatura Digital à Prova d'Água DS18B20 | 2 | Vermelho: 3-5V, Azul/Preto: GND, Amarelo/Branco: Dados |
| Relé de Potência IoT | 1 | |
| Resistor 4.75k ohm (1/4W, 5%) | 2 | |
| Raspberry Pi 2 Model B | 1 | |
| Arduino UNO R3 | 1 |
Aplicações e Serviços Online
- Microsoft Azure
- Microsoft Windows 10 IoT Core
- Arduino IDE
- Microsoft Visual Studio 2015
- Azure IoT Hub Device Explorer
- Fritzing
- Power BI
Sobre o Projeto
Visão Geral
O objetivo deste projeto é controlar e monitorar uma piscina usando sensores de temperatura, relés e Microsoft Azure.
A inspiração veio da necessidade de operar e monitorar remotamente a piscina das crianças, uma Intex redonda de 15' x 48", com aproximadamente 19.000 litros. A piscina está conectada a um Filtro de Areia/Bomba, um Aquecedor de 11KW e um Sistema de Água Salgada. O objetivo era monitorar a temperatura da água e do ar, e controlar a bomba, aquecedor e sistema de sal para garantir que a piscina estivesse quente o suficiente para as crianças, sem funcionar excessivamente.
O diagrama arquitetural acima mostra todos os componentes principais da solução.
O Raspberry Pi, Arduino, Relé IoT e protoboard estão fixados com abraçadeiras em uma caixa plástica para proteção contra umidade. Furos foram feitos para cabos e ventilação.
Sensores
O monitoramento da temperatura da água da piscina e do ar é feito com dois sensores DS18B20 à prova d'água, conectados a um Arduino Uno R3 usando as bibliotecas Dallas Controls e OneWire. Os dados de temperatura (em Celsius) são enviados ao Raspberry Pi a cada 1 segundo via I2C. Os dois valores são delimitados por "|".
temperatureData = padRight(String(poolSensor.getTempCByIndex(0)) + "|" + String(outsideSensor.getTempCByIndex(0)), I2C_BUFFER_LEN);
Os sensores DS18B20 vêm pré-cabeados:
- Vermelho → 3V/5V
- Azul/Preto → GND
- Amarelo/Branco → Dados
Usei fio de campainha (20 AWG) barato para estender o alcance do DS18B20 que mede a temperatura da água. Este sensor fica submerso na piscina.
O segundo sensor DS18B20 para temperatura do ar fica colado na parte externa da caixa plástica.
Relé
O Raspberry Pi controla uma régua de energia IoT Power Relay, à qual a Bomba e o Sistema de Água Salgada estão conectados em 110V. Isso é feito usando o pino de 3V do Pi. Alternar o pino de 3V habilita/desabilita um par de tomadas 110V no relé (o par vem desligado por padrão).
Não foi necessário conectar relé ao Aquecedor, pois ele tem sensor de fluxo embutido e para/inicia aquecimento baseado na ausência/presença de fluxo de água. Além disso, não encontrei relé para controlar circuito 220V/60A usando 3V ou 5V.
No futuro, pretendo adicionar sensores para medir consumo elétrico dos circuitos 110V e 220V. Recomendações são bem-vindas.
Raspberry Pi
O Raspberry Pi roda Windows IoT Core Build 10.0.10586.0 e realiza:
- Executa o aplicativo em background IoTPoolRaspiBackgroundApp
- Atua como gateway de campo IoT (opaco)
- Fornece energia ao Arduino Uno via USB (5V)
- Recebe temperaturas da piscina e do ar (em °C) do Arduino via I2C
- Controla o IoT Power Relay usando pino de 3V
- Envia nome da piscina, temperatura da água, temperatura do ar, status do relé e timestamp (UTC) a cada 1 minuto para o Azure IoT Hub
O IoTPoolRaspiBackgroundApp é uma aplicação C# headless, criada com o template Background Application (IoT) no Visual Studio 2015 Update 3.
Envia o seguinte payload JSON ao Azure IoT Hub a cada minuto via AMQP (configurável para HTTPS ou MQTT):
{ "PoolName" : "iotpool", "PoolWaterTempC" : 30, "OutsideAirTempC" : 27, "IsPoolPowerOn" : false, "SampleDateTime" : "2016-07-05T23:35:58.0882185Z" }
O Raspberry Pi é registrado como dispositivo no Azure IoT Hub. A forma mais fácil é usar o Device Explorer, que também obtém a connection string, monitora mensagens D2C e testa C2D.
Edite em StartupTask.cs para conectar ao seu IoT Hub:
static string iotPoolConnString = "HostName=<iothubname>.azure-devices.net;DeviceId=iotpool;SharedAccessKey=<key>";
static string deviceName = "iotpool";
Arduino Uno
Conectado a dois sensores DS18B20 via bibliotecas Dallas Controls e OneWire. Alimentado pelo Raspberry Pi via USB (5V) e envia leituras de temperatura ao Pi via I2C (pinos SDA/SCL).
Use o código Two-DS18B20-I2C.ino para rodar no Arduino.
Azure
Todos os componentes Azure foram criados na mesma região (West US) para minimizar custos de tráfego de saída.
Azure IoT Hub
Usada a edição gratuita (8.000 msg/dia, 500 bytes cada). O app envia 1.440 msg/dia (1/min) de 158 bytes, sobrando margem para C2D.
Registre o dispositivo no IoT Hub via Device Explorer para obter a connection string.
Azure Streaming Analytics
Job ASA conecta entrada do IoT Hub à saída Azure SQL Database com query simples:
SELECT PoolName, PoolWaterTempC, OutsideAirTempC, IsPoolPowerOn, SampleDateTime INTO sql FROM iothub
Escreve cada mensagem D2C (1/min) na tabela Pools do Azure SQL Database. Futuras melhorias podem incluir agregações para alertas (ex: média temp > 35°C).
Azure SQL Database
Para minimizar custo, usa S0 Standard (10 DTUs). Banco único com tabela única para armazenar mensagens D2C.
Schema:
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
API RESTful em ASP.NET Web API. Clientes autenticam via API Key no header HTTP:
api-key: {sua_api_key}
A key é definida em IoTPoolAPI\Controllers\PoolControllers.cs. Apps Mobile e Web devem usar esta key.
Melhorias futuras: colocar atrás do Azure API Management, adicionar Azure AD.
Azure Web App
IoTPoolWebApp contém aplicação ASP.NET Web Forms para interagir com a API.
Há também versão mobile-friendly. Edite default.aspx.cs para configurar URLs da API e chave.
Integrado com Azure Active Directory (AAD) para autenticação. Registre o web app no seu tenant AAD e configure web.config com o Client ID.
Mobile App
Escrito em Xamarin Forms. Compilado para Windows Phone e Windows 10, mas deve compilar para iOS/Android.
Edite Core.cs, DataService.cs e PoolPage.xaml.cs para configurar URL da API e chave.
Power BI
Power BI (edição gratuita) usado para criar e publicar dashboard em tempo real dos dados da piscina IoT.
Processo: baixar Power BI Desktop, conectar ao Azure SQL DB (DirectQuery), criar relatórios com visuais, publicar .pbix no PowerBI.com, fixar no dashboard. Futuramente, usar Power BI Embedded para embutir no web app. Por enquanto, visualizo via PowerBI.com ou app mobile Power BI.
Referências
- Windows IoT Blinky Sample
- Pool Controller - Arduino Project Hub
- Azure IoT Hub C# Get Started
- Azure IoT Hub C2D
- ASP.NET REST Service with SQL Database
- Xamarin Forms Mobile App
- MSDN Library
- Arduino Windows Guide
- OneWire Playground
- Dallas Temperature Control Library
- I2C Tutorial SparkFun
Agradecimentos especiais a Miles Burton (biblioteca Dallas Controls) e Mike Mackes (código Arduino/I2C/DS18B20 e inspiração geral).
Código
Formato JSON Payload para Mensagens D2C
Nota: "IsPoolPowerOn" - 0 = desligado; 1 = ligado
{ "PoolName" : "IoTPool", "PoolWaterTempC" : 30, "OutsideAirTempC" : 27, "IsPoolPowerOn" : false, "SampleDateTime" : "2016-07-05T23:35:58.0882185Z" }
Schema Tabela "Pools" do 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)
);
Repositório GitHub do IoT Pool
Todo código fonte: https://github.com/khilscher/iotpool
Esquemáticos
Conexão Raspberry Pi ↔ Arduino via I2C com 2 Sensores DS18B20
Processo de manufatura
- Guia Completo para Projeto e Construção de Piscinas Enterradas e Elevadas
- Arduino Lança Portenta H7: Placa IoT Industrial‑Grade Estreia na CES
- Azure RTOS Expande nas Principais Plataformas Embarcadas com Novos Kits de Desenvolvimento
- Azure vs AWS: Qual Plataforma de Nuvem Vence para IoT?
- Construa um Datalogger GPS com Análise Espacial no Azure IoT Hub
- Monitoramento de Qualidade da Água IoT e IA Protege Vida Aquática
- Monitor de Frequência Cardíaca IoT em Tempo Real com Arduino e MAX30100
- Controle IoT Remoto de Braço Robótico Personalizado
- Construa um Pote Inteligente IoT com ESP8266, Arduino e Sensor Ultrassônico – Monitoramento em Tempo Real
- Rastreador Solar IoT: Gestão Inteligente de Energia com Arduino