Surveillance de la Qualité de l'Eau : Système Arduino MKR1000 pour Rivières et Lacs
Composants et Fournitures
| Composant | Quantité | Note |
|---|---|---|
| Arduino MKR FOX 1200 (SAMD21 + Sigfox) | 1 | Faible consommation, autonomie piles |
| Capteur de Niveau d'Eau | 1 | Analogique |
| Capteur pH | 1 | Analogique |
| LED Blanche | 1 | Pour détection pollution insoluble |
| Résistance 220 Ω | 2 | LED + photorésistance |
| Photorésistance (LDR) | 1 | Détection opacité/eau trouble |
| Fils de câblage (Dupont) | 1 lot |
Outils Nécessaires
- Fer à souder
- Scie à métaux (découpe boîtier bouteille)
Applications et Services Cloud
- Arduino Web Editor (programmation en ligne)
- Sigfox (réseau LPWAN bas débit, longue portée)
- Wia (plateforme IoT : visualisation, alertes, flux de traitement)
Présentation du Projet « MyRiver »
Une rivière ou un lac peut être source de loisirs, mais s'ils sont pollués, le danger guette : eau impropre au bétail, risque de crue, rejets toxiques (hydrocarbures, métaux). MyRiver est un dispositif autonome, déployable en zone isolée grâce à Sigfox, qui surveille en continu :
- pH de l'eau (capteur dédié)
- Niveau d'eau (capteur niveau → alerte crue)
- Pollution par substances insolubles (huile, essence, mercure...) via méthode optique originale : une LED éclaire l'eau, une photorésistance mesure la lumière transmise. Si la lecture chute → présence de matières en suspension/opacifiantes.
Les données sont envoyées toutes les 30 min (configurable, min 20 min) via Sigfox → Wia → visualisation web/app mobile + alertes immédiates (email/push) si seuils dépassés.
Fonctionnement Technique Détaillé
Cycle de Mesure et Envoi
- Réveil (mode sommeil SAMD21 ultra-faible conso).
- Lecture capteurs : pH (A1), Niveau (A2), Photoresistance (A3).
- Formatage buffer 12 octets (limite Sigfox) : chaque valeur brute (0-1023) codée sur 4 octets (zéros à gauche). Ex: 620 → « 0620 », 24 → « 0024 ». Concaténation = 12 caractères ASCII → envoyés en HEX.
- Envoi Sigfox → relais vers Wia (webhook HTTP POST).
- Traitement Wia (Flow) : HEX → String → parsing 3 valeurs → conversion : pH brut → pH réel (formule étalonnage), Niveau → « HIGH »/« OK », Pollution → « POLLUTED »/« OK ».
- Alertes : si valeur hors bornes → envoi email via Wia.
- Retour sommeil.
Extrait Code Arduino (Parties Clés)
1. Structure de Lecture Capteurs
struct GetValue {
int riverLevel() { // Niveau eau sur A2
const int val = analogRead(A2);
if(proDebug) { Serial.print(" River Level "); Serial.println(val); }
return val;
}
int riverPh() { // pH sur A1 (conversion tension)
const int val = (analogRead(A1) / 5 * 3.3); // Adaptation 5V→3.3V
if(proDebug) { Serial.print(" River Ph "); Serial.println(val); }
return val;
}
int riverPol() { // Pollution (photorésistance) sur A3
const int val = analogRead(A3);
if(proDebug) { Serial.print(" River Pollution "); Serial.println(val); }
return val;
}
};
2. Formatage Buffer 12 Octets
String data(int level, int ph, int pol) {
int values[3] = {level, ph, pol};
String newValues;
for(int i = 0; i < 3; i++) {
if(values[i] < 10) newValues += "000";
else if(values[i] < 100) newValues += "00";
else if(values[i] < 1000) newValues += "0";
newValues += values[i];
Serial.print(" Run "); Serial.print(i); Serial.print("/3 "); Serial.println(newValues);
}
return newValues; // Ex: "002406200850"
}
3. Envoi Sigfox
void parseData(String data) {
SigFox.beginPacket();
SigFox.print(data);
int ret = SigFox.endPacket();
}
Configuration Wia (Sigfox → Wia → Alertes)
Étape 1 : Webhook Sigfox vers Wia
Dans le backend Sigfox, créer un Callback :
- Type :
Data Uplink - Channel :
URL - URL :
https://api.wia.io/v1/events - HTTP Method :
POST - Header :
Authorisation: Bearer <VOTRE_CLÉ_WIA> - Content-Type :
application/json - Body : JSON spécifique (fourni dans le tutoriel original) incluant
sigfoxData,device,time.
Étape 2 : Flow Wia (Traitement Données)
Le Flow Wia (éditeur visuel nœuds) effectue :
processPayload: HEX → String UTF-8.riverPollution: extrait octets 8-11 (pollution), compare à seuil (minVal=200) → « POLLUTED » ou « OK ».riverPh: extrait octets 4-7 (pH), conversion formule(val/73.1428571)→ pH réel (2 décimales).riverLevel: extrait octets 0-3 (niveau), compare àmaxVal=200→ « HIGH » ou « OK ».processPollution/Ph/Level: si alerte → publier événement nomméwaterPollution,waterPh,waterLevelavec valeur.- Nœuds Email : envoi alertes formatées (device ID, donnée brute).
Fonctions Wia (JavaScript) clés :
// riverPollution - extraction + seuillage
let minVal = 200;
if(input.body.data.sigfoxData) {
let data = input.body.data.sigfoxData;
let processed = Buffer(data, 'hex').toString('utf8');
let valStr = processed[8]+processed[9]+processed[10]+processed[11];
let finalVal = parseInt(valStr);
output.body.name = "waterPollution";
output.body.data = (finalVal < minVal) ? "POLLUTED" : "OK";
}
// riverPh - extraction + conversion étalonnage
let minVal = 300, maxVal = 600;
if(input.body.data.sigfoxData) {
let data = input.body.data.sigfoxData;
let processed = Buffer(data, 'hex').toString('utf8');
let valStr = processed[4]+processed[5]+processed[6]+processed[7];
let finalVal = parseInt(valStr);
let pH = (finalVal / 73.1428571).toFixed(2);
output.body.name = "waterPh";
output.body.data = pH;
}
// riverLevel - extraction + seuillage
let maxVal = 200;
if(input.body.data.sigfoxData) {
let data = input.body.data.sigfoxData;
let processed = Buffer(data, 'hex').toString('utf8');
let valStr = processed[0]+processed[1]+processed[2]+processed[3];
let finalVal = parseInt(valStr);
output.body.name = "waterLevel";
output.body.data = (finalVal > maxVal) ? "HIGH" : "OK";
}
Étape 3 : Calibration Seuil Photoresistance (Pollution)
Le seuil minVal=200 (pollution) doit être déterminé in situ :
void setup() { pinMode(1, OUTPUT); Serial.begin(9600); while(!Serial); digitalWrite(1, HIGH); }
void loop() { const int val = analogRead(A3); Serial.println(val); delay(5000); }
Immerger la sonde dans l'eau saine cible, noter la valeur stable → définir minVal légèrement en dessous (marge). Variable proDebug (défaut false) active logs série (nécessite USB/PC).
Boîtier Écologique : Bouteille en Plastique Recyclée
Le boîtier est réalisé dans une bouteille d'eau vide : étanche, flottant, gratuit, recyclé. Découpe, passage câbles, collage/étanchéité (ruban adhésif marin sur le goulot).
Déploiement sur le Terrain
- Se rendre sur site à marée haute (référence niveau max normal).
- Positionner sonde : capteur niveau au ras de l'eau, photorésistance totalement immergée.
- Fixer solidement à la berge (ruban, vis, piquet).
- Mettre sous tension → premières données dans Wia.
Testé sur rivière polluée locale : toutes les alertes (pH, niveau, pollution) ont déclenché correctement.
Bibliothèques Utilisées
Sigfox(Arduino LLC, LGPL)ArduinoLowPower(Arduino LLC, LGPL) — gestion sommeil profond
Schéma de Câblage (Fritzing)
Avantages Clés
- Surveillance continue à distance (tout pays couvert Sigfox).
- Alertes temps réel (pollution, crue, pH anormal).
- Autonomie longue durée (piles AA, sommeil profond SAMD21).
- Détection pollution insoluble innovante (optique LED/LDR).
- Boîtier éco-conçu (bouteille recyclée).
- Plateforme Wia : tableaux de bord, graphiques, alertes email/push, API.
Processus de fabrication
- Comprendre le capteur d'oxygène (O2) : rôle, emplacement et signes de défaillance
- Construire un moniteur de température domestique avec Raspberry Pi, MCP9808, InfluxDB et Grafana
- Capteur d'émotion & EEG : Matériel low-cost pour détection d'émotion en temps réel
- Dispositif de mesure précis de pression et débit d'air avec capteur analogique
- Projet capteur DHT11 température/humidité avec indicateurs LED et buzzer piézo
- UnifiedWater v1 – Kit complet de capteur de qualité d'eau Arduino
- Horloge 3D RGB Arduclock – Montre LED Bluetooth avec horloge temps réel
- Capteur d'obstacle IR simple avec Arduino — LED IR + Photodiode
- Jeu interactif joystick + LEDs avec Arduino