Sistema IoT de Calidad de Agua con Arduino – Monitorización en Tiempo Real
Componentes y materiales
- Arduino UNO – 1 ud.
- Cables jumper macho/hembra – 1 ud.
- Módulo Bluetooth HC-05 – 1 ud.
- LED RGB cátodo común difuso – 1 ud.
- Resistencia 330 Ω – 3 uds.
- Potenciómetro rotatorio genérico – 1 ud.
- Kit shield LCD RGB 16x2 – 1 ud.
- Resistencia 1 kΩ – 1 ud.
Herramientas necesarias
- Pelacables y cortador 26–14 AWG
Software y servicios online
- Arduino IDE
- Aplicación Ardutooth (para visualización móvil vía Bluetooth)
Sobre el proyecto
El agua es un recurso esencial. Debemos asegurar su calidad para el consumo.
¿Qué es TDS?
TDS = Total Dissolved Solids (Sólidos Totales Disueltos). Indica la cantidad de sólidos disueltos en agua, en ppm (partes por millón). Se calcula a partir de la conductividad eléctrica [S/m]: mayor conductividad → mayor TDS.
- Agua pura: 80–150 ppm
- Agua de grifo: 250–350 ppm
- Agua subterránea: 500–1000 ppm
- Agua de mar: ~30 000 ppm
La OMS recomienda TDS < 300 ppm para agua potable. Por debajo de 100 ppm carece de minerales esenciales; por encima de 300 se considera «dura» (exceso de minerales).
Normalmente se usa un medidor TDS de bolígrafo, pero no se integra con Arduino. Existen medidores TDS compatibles, pero he optado por hacerlo sin medidor dedicado.

El circuito
Arduino
- 5 V → rail de alimentación protoboard
- GND → otro rail
- Resistencia 1 kΩ: un extremo a GND, otro a protoboard. Pin A0 al nodo entre resistencia y cable libre. Un cable a 5 V, otro al nodo; extremos libres a pinzas de cocodrilo (electrodos).

Pantalla LCD
- VSS → GND
- VDD → 5 V
- V0 → pin central potenciómetro (extremos a 5 V y GND)
- RS → pin 7
- R/W → GND
- E → pin 8
- D4–D7 → pines 10–13

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

LED RGB
- Cátodo común (pata larga) → GND
- Rojo (derecha cátodo) → PWM pin 9 vía 330 Ω
- Verde (izquierda cátodo) → PWM pin 6 vía 330 Ω
- Azul (extremo izq.) → PWM pin 5 vía 330 Ω

Deducción para calcular resistencia entre cables libres
Usamos la ley de Ohm: V = I·R.

La resistencia del cable al pin A0 es despreciable → corriente mínima → R₁ (1 kΩ) y R₂ (agua) en serie.
V₁ = I·R₁, V₂ = I·R₂ → V₂/V₁ = R₂/R₁.
En serie: V₁ + V₂ = 5 V → V₂ = 5 - V₁.
Sustituyendo: (5 - V₁)/V₁ = R₂/R₁. Definimos buffer = (5 - V₁)/V₁ → R₂ = buffer * R₁.
Funcionamiento
Calculamos resistencia del agua, luego resistividad, conductividad y finalmente TDS.
R = r·L/A → r = R·A/L
c = 1/r
TDS = c * 7000
Donde L = distancia entre electrodos (m), A = sección transversal (m²).
Librerías
- LiquidCrystal: arduinolibraries.info
- SoftwareSerial: pdfpunk.weebly.com
Instalar vía Gestor de librerías (Herramientas → Gestionar librerías).

Código
Código de monitorización de calidad de agua
//include libraries
#include <SoftwareSerial.h>
#include <LiquidCrystal.h>
// Bluetooth: RX=3, TX=2
SoftwareSerial BTserial(3,2);
float reads;
int pin = A0;
float vOut = 0;
float vIn = 5;
float R1 = 1000;
float R2 = 0;
float buffer = 0;
float TDS;
float R = 0;
float r = 0;
float L = 0.06; // distancia entre electrodos (m)
double A = 0.000154; // sección cable (m²)
float C = 0; // conductividad S/m
float Cm = 0; // conductividad mS/cm
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;
C = 1 / r;
Cm = C * 10;
TDS = Cm * 700;
lcd.setCursor(0,1);
lcd.print(C);
// LED RGB según lectura
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);
}
// Enviar a app Ardutooth vía Bluetooth
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);
}
Piezas personalizadas y cajas
Usé un tubo de ensayo viejo: agujereé ambos extremos, pasé cables y fijé con masilla.
Esquemáticos
Proceso de manufactura
- Raspberry Pi y HDC2010: Guía completa de configuración I2C para sensor de temperatura y humedad
- Conectar Raspberry Pi 3 a sensor DHT11 y subir datos a cloud ThingsIo.ai
- Papelera Inteligente: Solución IoT Celular para Gestión Automatizada de Residuos
- Sensor de Calidad del Aire Solar con Helium: Guía de Diseño y Despliegue
- Integración del Sensor de Agua Phantom YoYo de Alta Sensibilidad con ADC MCP3008 en Raspberry Pi
- Monitorización Precisa de Temperatura y Humedad con SHT15 en Windows 10 IoT Core
- Sistema de Sensor de Temperatura Multiposición para Integración en Hogar Inteligente
- Botella de agua inteligente con Arduino: Monitorización en tiempo real y alertas
- Pistola de Agua Inteligente Activada por Movimiento con Arduino Nano
- Estación meteorológica Arduino Nano: Sensores BMP280, DHT11, UV y RTC en OLED 0,96"
- Sensor avanzado de NO₂ basado en carbono mejora monitorización de calidad del aire interior