Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

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

Applications et Services Cloud

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 :

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.

Surveillance de la Qualité de l Eau : Système Arduino MKR1000 pour Rivières et Lacs
Le capteur logé dans une bouteille en plastique recyclée, prêt au déploiement.

Fonctionnement Technique Détaillé

Cycle de Mesure et Envoi

  1. Réveil (mode sommeil SAMD21 ultra-faible conso).
  2. Lecture capteurs : pH (A1), Niveau (A2), Photoresistance (A3).
  3. 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.
  4. Envoi Sigfox → relais vers Wia (webhook HTTP POST).
  5. Traitement Wia (Flow) : HEX → String → parsing 3 valeurs → conversion : pH brut → pH réel (formule étalonnage), Niveau → « HIGH »/« OK », Pollution → « POLLUTED »/« OK ».
  6. Alertes : si valeur hors bornes → envoi email via Wia.
  7. Retour sommeil.
Surveillance de la Qualité de l Eau : Système Arduino MKR1000 pour Rivières et Lacs
Flux de données : Capteurs → MKR FOX → Sigfox → Wia (Flow) → Dashboard/Alertes.
Surveillance de la Qualité de l Eau : Système Arduino MKR1000 pour Rivières et Lacs
Structure logicielle : Read Sensors → Format Buffer → Parse Data.
Surveillance de la Qualité de l Eau : Système Arduino MKR1000 pour Rivières et Lacs
Encodage des 3 valeurs analogiques (10 bits) dans 12 octets ASCII (4 octets/valeur).

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 :

Étape 2 : Flow Wia (Traitement Données)

Le Flow Wia (éditeur visuel nœuds) effectue :

  1. processPayload : HEX → String UTF-8.
  2. riverPollution : extrait octets 8-11 (pollution), compare à seuil (minVal=200) → « POLLUTED » ou « OK ».
  3. riverPh : extrait octets 4-7 (pH), conversion formule (val/73.1428571) → pH réel (2 décimales).
  4. riverLevel : extrait octets 0-3 (niveau), compare à maxVal=200 → « HIGH » ou « OK ».
  5. processPollution/Ph/Level : si alerte → publier événement nommé waterPollution, waterPh, waterLevel avec valeur.
  6. 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).

Surveillance de la Qualité de l Eau : Système Arduino MKR1000 pour Rivières et Lacs
Dispositif inséré dans bouteille, capteurs sortants, goulot scellé au ruban.

Déploiement sur le Terrain

  1. Se rendre sur site à marée haute (référence niveau max normal).
  2. Positionner sonde : capteur niveau au ras de l'eau, photorésistance totalement immergée.
  3. Fixer solidement à la berge (ruban, vis, piquet).
  4. Mettre sous tension → premières données dans Wia.
Surveillance de la Qualité de l Eau : Système Arduino MKR1000 pour Rivières et Lacs
Installation en rivière : sonde immergée, boîtier fixé sur berge.

Testé sur rivière polluée locale : toutes les alertes (pH, niveau, pollution) ont déclenché correctement.

Bibliothèques Utilisées

Schéma de Câblage (Fritzing)

Surveillance de la Qualité de l Eau : Système Arduino MKR1000 pour Rivières et Lacs
Schéma de câblage complet (fichier .fzz disponible).

Avantages Clés

Processus de fabrication

  1. Comprendre le capteur d'oxygène (O2) : rôle, emplacement et signes de défaillance
  2. Construire un moniteur de température domestique avec Raspberry Pi, MCP9808, InfluxDB et Grafana
  3. Capteur d'émotion & EEG : Matériel low-cost pour détection d'émotion en temps réel
  4. Dispositif de mesure précis de pression et débit d'air avec capteur analogique
  5. Projet capteur DHT11 température/humidité avec indicateurs LED et buzzer piézo
  6. UnifiedWater v1 – Kit complet de capteur de qualité d'eau Arduino
  7. Horloge 3D RGB Arduclock – Montre LED Bluetooth avec horloge temps réel
  8. Capteur d'obstacle IR simple avec Arduino — LED IR + Photodiode
  9. Jeu interactif joystick + LEDs avec Arduino