Système IoT de Surveillance de la Qualité de l'Eau – Monitoring Temps Réel avec Arduino
Composants et fournitures
| Composant | Quantité | Notes |
|---|---|---|
| Arduino UNO | 1 | |
| Fils de connexion Male/Female | 1 | |
| Module Bluetooth HC-05 | 1 | |
| LED RGB diffuse cathode commune | 1 | |
| Résistance 330 Ω | 3 | Pour les 3 broches de la LED RGB |
| Potentiomètre rotatif | 1 | Pour contraste LCD |
| Écran LCD RGB Shield 16x2 | 1 | Kit complet |
| Résistance 1 kΩ | 1 | Pour le diviseur de tension |
Outils nécessaires
- Pince à dénuder/couper 26-14 AWG
Applications et services en ligne
- Arduino IDE
- Application Ardutooth (mobile, pour visualisation Bluetooth)
À propos de ce projet
L'eau est une ressource essentielle. Il est crucial d'en garantir la qualité.
Qu'est-ce que le TDS ?
TDS = Total Dissolved Solids (solides totaux dissous). Indique la quantité de solides dissous dans l'eau, en ppm (parties par million). Le TDS est calculé à partir de la conductivité électrique [S/m]. Plus la conductivité est élevée, plus le TDS l'est.
Valeurs typiques :
- Eau pure : 80–150 ppm
- Eau du robinet : 250–350 ppm
- Eau souterraine : 500–1000 ppm
- Eau de mer : ~30 000 ppm
L'OMS recommande un TDS < 300 ppm pour l'eau potable. En dessous de 100 ppm, l'eau manque de minéraux essentiels. Au-dessus de 300 ppm, l'eau est trop « dure ».
Habituellement, on utilise un stylo TDS. Mais il ne s'interface pas avec Arduino. Des capteurs TDS intégrables existent, mais ce projet utilise une méthode alternative sans capteur dédié.

Le circuit
Arduino
- 5V → rail d'alimentation + de la breadboard
- GND → rail –
- Résistance 1 kΩ : une extrémité au GND, l'autre sur la breadboard. Pin A0 de l'Arduino connecté à cette jonction. Un fil vers la résistance, un fil vers 5V. Extrémités libres → pinces crocodile (immergées dans l'eau testée).

Écran LCD
- VSS → GND
- VDD → 5V
- V0 → curseur du potentiomètre (extrémités à 5V et GND)
- RS → pin 7
- R/W → GND
- E → pin 8
- D4–D7 → pins 10–13

Module Bluetooth HC-05
- VCC → 5V
- GND → GND
- TX → pin 3 (RX software)
- RX → pin 2 (TX software)

LED RGB
- Cathode commune (patte la plus longue) → GND
- Rouge (à droite de la cathode) → pin 9 (PWM) via 330 Ω
- Vert (à gauche de la cathode) → pin 6 (PWM) via 330 Ω
- Bleu (extrême gauche) → pin 5 (PWM) via 330 Ω

Dérivation du calcul de résistance
On utilise la loi d'Ohm : V = I × R.

Le fil vers A0 a une résistance négligeable → courant quasi nul → R₁ (1 kΩ) et R₂ (eau) en série.
V₁ = I×R₁, V₂ = I×R₂ → V₂/V₁ = R₂/R₁.
En série : V₁ + V₂ = 5V → V₂ = 5 - V₁.
On définit buffer = (5 - V₁) / V₁ → R₂ = buffer × R₁.
Principe de fonctionnement
- Calculer la résistance de l'eau (R₂).
- En déduire la résistivité :
r = R₂ × A / L(L = distance entre électrodes, A = section du fil). - Conductivité :
C = 1 / r(en S/m). - TDS :
TDS = C × 7000(facteur empirique).
Bibliothèques nécessaires
Installables via le gestionnaire de bibliothèques de l'IDE Arduino.

Code complet
// Surveillance qualité eau - Arduino UNO + HC-05 + LCD + LED RGB
#include <SoftwareSerial.h>
#include <LiquidCrystal.h>
SoftwareSerial BTserial(3, 2); // RX | TX
float reads; int pin = A0;
float vOut = 0, vIn = 5, R1 = 1000, R2 = 0, buffer = 0;
float TDS, R = 0, r = 0, L = 0.06, A = 0.000154;
float C = 0, Cm = 0;
int rPin = 9, bPin = 5, gPin = 6;
int rVal = 255, bVal = 255, gVal = 255;
LiquidCrystal lcd(7, 8, 10, 11, 12, 13);
void setup() {
Serial.begin(9600); BTserial.begin(9600);
lcd.begin(16, 2);
pinMode(rPin, OUTPUT); pinMode(bPin, OUTPUT); pinMode(gPin, OUTPUT);
pinMode(pin, INPUT);
lcd.print("Conductivity: ");
}
void loop() {
reads = analogRead(A0);
vOut = reads * 5.0 / 1023.0;
Serial.println(reads);
buffer = (vIn / vOut) - 1;
R2 = R1 * buffer;
Serial.println(R2);
delay(500);
r = R2 * A / L; // résistivité
C = 1 / r; // conductivité S/m
Cm = C * 10; // conductivité mS/cm
TDS = Cm * 700; // TDS ppm
lcd.setCursor(0, 1);
lcd.print(C);
// LED RGB selon conductivité (lecture analogique)
if (reads < 600) {
if (reads <= 300) setColor(255, 0, 255);
else if (reads > 200) setColor(200, 0, 255);
} else {
if (reads <= 900) setColor(0, 0, 255);
else if (reads > 700) setColor(0, 255, 255);
}
// Envoi Bluetooth vers app Ardutooth
BTserial.print(C); BTserial.print(",");
BTserial.print(TDS); BTserial.print(";");
delay(500);
}
void setColor(int red, int green, int blue) {
analogWrite(rPin, 255 - red);
analogWrite(gPin, 255 - green);
analogWrite(bPin, 255 - blue);
}
Boîtier personnalisé
J'ai utilisé un vieux tube à essai : deux trous aux extrémités pour les fils, maintenus par de la pâte à modeler.
Schéma global
Processus de fabrication
- Raspberry Pi et HDC2010 : guide complet de configuration du capteur I2C température et humidité
- Connecter un Raspberry Pi 3 au capteur DHT11 et envoyer les données vers le cloud ThingsIo.ai
- Poubelle intelligente : Une solution IoT cellulaire pour la gestion automatisée des déchets
- Capteur de qualité de l'air solaire basé sur Helium : Guide de conception et déploiement
- Intégration du capteur d'eau haute sensibilité Phantom YoYo avec l'ADC MCP3008 sur Raspberry Pi
- Surveillance Précise de Température et Humidité avec SHT15 sur Windows 10 IoT Core
- Système de Capteur de Température Multi-Position pour Intégration Domotique
- Bouteille d'eau intelligente Arduino : Suivi temps réel et alertes
- Capteur NO₂ avancé à base de carbone pour une surveillance de la qualité de l'air intérieur améliorée