Système de Contrôle de Piscine IoT Azure : Capteurs Intelligents & Surveillance à Distance
Composants et Fournitures
| Composant | Quantité | Notes |
|---|---|---|
| Capteur température étanche DS18B20 | 2 | Rouge = 3-5V, Bleu/Noir = GND, Jaune/Blanc = Data |
| Relais IoT Power Relay | 1 | |
| Résistance 4.75k ohm | 2 | 1/4W, 5% |
| Raspberry Pi 2 Modèle B | 1 | |
| Arduino UNO R3 | 1 |
Applications et Services en Ligne
- Microsoft Azure
- Microsoft Windows 10 IoT Core
- Arduino IDE
- Microsoft Visual Studio 2015
- Azure IoT Hub Device Explorer
- Fritzing
- Power BI
À propos du projet
Vue d'ensemble
Ce projet vise à contrôler et surveiller une piscine à l'aide de capteurs de température, relais et Microsoft Azure. L'inspiration vient du besoin de piloter à distance la piscine de nos enfants (Intex 15' x 48", ~19 000 litres), équipée d'un filtre à sable/pompe, chauffage 11kW et système au sel. L'objectif : surveiller la température de l'eau et de l'air, contrôler pompe, chauffage et système sel pour maintenir une température agréable sans surconsommation.

Le Raspberry Pi, Arduino, relais IoT et breadboard sont fixés dans un conteneur plastique étanche avec passages de câbles et ventilation.

Capteurs
Deux capteurs DS18B20 étanches (eau piscine + air ambiant) connectés à l'Arduino Uno via bibliothèques Dallas Controls et OneWire. Les températures (en °C) sont envoyées au Raspberry Pi chaque seconde via I2C, séparées par "|".
temperatureData = padRight(String(poolSensor.getTempCByIndex(0)) + "|" + String(outsideSensor.getTempCByIndex(0)), I2C_BUFFER_LEN);

Le capteur eau est immergé (rallonge fil sonnette 20 AWG). Le capteur air est collé à l'extérieur du boîtier.
Relais
Le Raspberry Pi contrôle un IoT Power Relay (barre de prises) alimentant pompe et système sel en 110V via sa broche 3.3V. Cette broche active/désactive une paire de prises 110V (éteintes par défaut).

Le chauffage 220V/60A n'est pas relayé : il possède un capteur de débit intégré et s'arrête/démarre selon la présence d'eau. Aucun relais 3V/5V → 220V/60A n'était facilement disponible.
Raspberry Pi
Exécute Windows IoT Core Build 10.0.10586.0 et l'application IoTPoolRaspiBackgroundApp (C#, template "Background Application (IoT)" dans VS2015 Update 3) :
- Passerelle IoT opaque
- Alimente l'Arduino via USB (5V)
- Reçoit températures via I2C
- Contrôle le relais IoT via broche 3.3V
- Envoie données vers Azure IoT Hub chaque minute (AMQP)
Payload JSON envoyé :
{ "PoolName" : "iotpool", "PoolWaterTempC" : 30, "OutsideAirTempC" : 27, "IsPoolPowerOn" : false, "SampleDateTime" : "2016-07-05T23:35:58.0882185Z" }
Le Pi est enregistré comme device dans Azure IoT Hub (via Device Explorer pour obtenir la chaîne de connexion).
Arduino Uno
Connecté aux deux DS18B20, alimenté par le Pi via USB, envoie les températures via I2C (broches SDA/SCL). Voir schéma Fritzing.

Code : Two-DS18B20-I2C.ino
Architecture Azure
Tous les composants dans la même région (West US) pour minimiser les coûts de trafic sortant.
Azure IoT Hub (édition gratuite)
Limité à 8 000 messages/jour @ 500 octets. L'envoi 1/min (1 440/jour @ 158 octets) laisse de la marge pour les messages C2D.

Azure Streaming Analytics
Job ASA reliant IoT Hub (entrée) → Azure SQL Database (sortie) :
SELECT PoolName, PoolWaterTempC, OutsideAirTempC, IsPoolPowerOn, SampleDateTime INTO sql FROM iothub
Écrit chaque message D2C (1/min) dans la table Pools. Futures améliorations : fonctions d'agrégation pour alertes (ex: moyenne température > 35°C).
Azure SQL Database
Niveau S0 Standard (10 DTUs) pour minimiser les coûts. Table unique 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
API RESTful ASP.NET Web API avec authentification par clé API dans l'en-tête HTTP :
api-key : {votre clé API}
Clé définie dans IoTPoolAPI\Controllers\PoolControllers.cs. Méthodes supportées : GET latest, POST poweron/poweroff.

Azure Web App
Application ASP.NET Web Forms (IoTPoolWebApp) interagissant avec l'API. Version mobile-friendly disponible.

Configuration dans default.aspx.cs (clé API, URLs endpoints). Authentification via Azure Active Directory (AAD) obligatoire. Enregistrer l'app web dans votre tenant AAD, copier Client ID, modifier web.config.
Application Mobile
Développée avec Xamarin Forms (compilée Windows Phone / Windows 10, compatible iOS/Android).

Modifications dans Core.cs, DataService.cs, PoolPage.xaml.cs (clé API, URLs).
Power BI
Édition gratuite pour tableau de bord temps réel des données IoT Pool.

Processus : Power BI Desktop → connexion Azure SQL (DirectQuery) → rapports visuels → publication .pbix sur PowerBI.com → épinglage au dashboard. Accessible via PowerBI.com ou app mobile Power BI. Futur : Power BI Embedded dans l'app web.
Références
- Exemple Blinky Windows IoT
- Contrôleur piscine Arduino (Mike Mackes)
- Démarrage IoT Hub C#
- IoT Hub C2D
- API REST ASP.NET + SQL
- Xamarin Forms Azure
- Référence I2C
- Guide Arduino Windows
- OneWire Arduino
- Bibliothèque Dallas Temperature (Miles Burton)
- Tutoriel I2C SparkFun
Remerciements à Miles Burton (bibliothèque Dallas) et Mike Mackes (code Arduino/I2C/DS18B20 et inspiration).
Code
Format JSON Payload Device-to-Cloud (D2C)
Note : "IsPoolPowerOn" = 0 (éteint), 1 (allumé)
{ "PoolName" : "IoTPool", "PoolWaterTempC" : 30, "OutsideAirTempC" : 27, "IsPoolPowerOn" : false, "SampleDateTime" : "2016-07-05T23:35:58.0882185Z" }
Schéma Table SQL "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) );
Dépôt GitHub IoT Pool
Tout le code source : https://github.com/khilscher/iotpool
Schémas
Liaison Raspberry Pi ↔ Arduino via I2C avec 2 capteurs DS18B20 : RaspiArduinoTwoDS18B20.fzz


Processus de fabrication
- Guide complet conception et construction piscines enterrées et hors-sol
- Arduino lance Portenta H7 : Carte IoT grade industriel débute au CES
- Azure RTOS s'étend sur les principales plateformes embarquées avec de nouveaux kits de développement
- Azure vs AWS : quelle plateforme cloud gagne pour l'IoT ?
- Enregistreur GPS avec Analyse Spatiale sur Azure IoT Hub
- Surveillance qualité de l'eau IoT et IA pour protéger la vie aquatique
- Moniteur de Fréquence Cardiaque IoT en Temps Réel avec Arduino et MAX30100
- Contrôle IoT à Distance d'un Bras Robotique Personnalisé avec Arduino MKR1000
- Bocal Intelligent IoT avec ESP8266, Arduino et Capteur Ultrasonique – Surveillance Temps Réel