Caso práctico: alarma de bomba de achique con Arduino UNO

Caso práctico: alarma de bomba de achique con Arduino UNO — hero

Objetivo y caso de uso

Qué construirás: Un prototipo de controlador de bomba de sumidero de doble flotador que automatiza un relé de 5V según los niveles de agua y activa una alarma de zumbador piezoeléctrico si el agua permanece peligrosamente alta.

Por qué es importante / Casos de uso

  • Prevención de inundaciones en sótanos: Enciende automáticamente una bomba antes de que el agua desborde el pozo del sumidero, previniendo costosos daños por agua.
  • Monitorización de tanques industriales: Mantiene los niveles de fluido dentro de una banda de operación segura específica sin que el hardware de la bomba haga ciclos cortos.
  • Riego agrícola: Automatiza el llenado o vaciado de abrevaderos de ganado o depósitos hidropónicos.
  • Teoría de control educativa: Introduce la histéresis de hardware, utilizando dos umbrales diferentes para prevenir una conmutación mecánica rápida y dañina, y extender la vida útil del relé.

Resultado esperado

  • El relé de 5V se activa (bomba ENCENDIDA) solo cuando el agua levanta el interruptor de flotador Alto.
  • El relé permanece activo incluso cuando el agua cae por debajo del flotador Alto, desactivándose solo cuando el flotador Bajo cae (bomba APAGADA).
  • Si el flotador Alto permanece activado durante más de 5 segundos, un zumbador piezoeléctrico emite una alarma audible que indica un posible fallo en la bomba.

Audiencia: Desarrolladores de IoT, creadores de hardware y entusiastas de la domótica; Nivel: Intermedio

Arquitectura/flujo: Interruptores de flotador dobles (Entradas digitales) → Microcontrolador (Lógica de histéresis & Temporizador de 5s) → Relé de 5V (Control de bomba) & Zumbador piezoeléctrico (Alarma)

Nota educativa de validación

Antes de publicar este caso, el contenido pasó la puerta automática de validación de Prometeo con estado PASS. El validador comprobó los bloques de código, la estructura del artículo, los comandos copiables y la coherencia con el catálogo de dispositivos soportados.

Evidencia de validación publicada

  • Resultado automático: PASS.
  • Estructura parseada: 3 apartados, 3 tablas y 2 bloques de código detectados antes de publicar.
  • Código comprobado: 2 Arduino/arduino-cli compile.
  • Catálogo soportado: el texto se contrastó contra los perfiles de dispositivo validables de Prometeo y los stacks no soportados bloquean la publicación.
  • Hallazgos del informe: sin hallazgos bloqueantes.

Esta validación confirma compatibilidad sintáctica y de herramientas para el material publicado, pero no sustituye la prueba física sobre tu hardware, cableado y entorno exactos.

Nota educativa de seguridad

Este proyecto es un prototipo educativo de bajo voltaje, no un producto certificado. Antes de encender la configuración, verifique el cableado de su Arduino UNO R3, evite cortocircuitar 5 V, GND o los pines digitales, desconecte la alimentación antes de cambiar las conexiones y use módulos de interfaz adecuados para relés, motores o cargas externas.

Diagrama de bloques conceptual

Vista de alto nivel: qué entra, qué procesa cada bloque y qué sale del sistema.

Arquitectura funcional

Interruptores de flotador dobles (Entrada…

Microcontrolador

Relé de 5V (Control de bomba) & Zumbador…

Flujo conceptual de señales y responsabilidades entre bloques del dispositivo.

Ruta de validación

Sketch

arduino-cli compile

Upload

Prueba funcional

Resumen conceptual de las herramientas usadas para comprobar el material publicado.

Requisitos previos

Antes de comenzar este tutorial, debes tener:
* Una comprensión básica de la lógica digital (estados HIGH/LOW).
* Familiaridad con el concepto de resistencias pull-up (específicamente el INPUT_PULLUP interno del Arduino).
* Un ordenador con la interfaz de línea de comandos (Terminal/Símbolo del sistema) disponible.
* Arduino CLI instalado y añadido al PATH de tu sistema.

Materiales

Para construir este prototipo específico, necesitarás los siguientes componentes exactos:
* Microcontrolador: Arduino UNO R3 (ATmega328P)
* Sensores: 2x Interruptores mecánicos de flotador (verticales u horizontales, tipo interruptor de láminas magnético estándar)
* Actuador: 1x Módulo de relé de 5 V (estándar de 1 canal, optoaislado)
* Alarma: 1x Zumbador piezoeléctrico (se prefiere un zumbador activo de 5V, aunque el pasivo funciona con la función tone() utilizada en este código)
* Prototipado: 1x Placa de pruebas (breadboard) sin soldadura
* Cableado: Surtido de cables puente macho-macho y macho-hembra
* Alimentación: Cable USB estándar A a B para programar y alimentar el Arduino

Configuración/Conexión

Este proyecto se basa en las resistencias pull-up internas del Arduino para los interruptores de flotador. Esto simplifica el cableado al eliminar la necesidad de resistencias externas. Cuando el interruptor de flotador está abierto, el pin del Arduino lee HIGH. Cuando el agua sube y cierra el interruptor de flotador, conecta el pin a Tierra (Ground), y el Arduino lee LOW.

La mayoría de los módulos de relé estándar de 5 V son «Activos en BAJO» (Active LOW), lo que significa que llevar el pin de señal a LOW energiza la bobina del relé, y ponerlo en HIGH lo apaga. El código proporcionado tiene en cuenta este comportamiento común.

Tabla de asignación de pines

ComponentePin Arduino UNO R3Conexión del componenteNotas
Interruptor de flotador BajoPin digital 2Cable 1El cable 2 va al GND del Arduino
Interruptor de flotador AltoPin digital 3Cable 1El cable 2 va al GND del Arduino
Módulo de relé de 5 VPin digital 4IN / SeñalVCC a 5V, GND a GND
Zumbador piezoeléctricoPin digital 5Positivo (+)Negativo (-) al GND del Arduino

Nota sobre la orientación del interruptor de flotador: Los interruptores mecánicos de flotador generalmente contienen un interruptor de láminas magnético y un anillo flotante. A menudo puedes quitar el clip en C en la parte inferior para voltear el anillo del flotador. Para este proyecto, configura ambos interruptores para que estén Abiertos en reposo (abajo) y Cerrados cuando floten (arriba).

Código validado

El proyecto utiliza dos archivos de código separados. El primero es una prueba de hardware para asegurar que tu relé y zumbador estén cableados correctamente. El segundo es la lógica principal del controlador.

Sketch de prueba de hardware (hardware_test.ino)

Crea un directorio llamado hardware_test y guarda el siguiente código como hardware_test.ino dentro de él. Este sketch alterna el relé y el zumbador secuencialmente para que puedas verificar tu cableado antes de añadir la complejidad de los sensores de flotador.

/*
 * hardware_test.ino
 * Basic validation sketch to verify Relay and Buzzer connections.
 */

const int RELAY_PIN = 4;
const int BUZZER_PIN = 5;

// Most 5V relay modules are Active LOW.
const int RELAY_ON = LOW;
const int RELAY_OFF = HIGH;

void setup() {
  Serial.begin(9600);
  Serial.println("Starting Hardware Test...");

  pinMode(RELAY_PIN, OUTPUT);
  pinMode(BUZZER_PIN, OUTPUT);

  // Ensure relay and buzzer are OFF initially
  digitalWrite(RELAY_PIN, RELAY_OFF);
  digitalWrite(BUZZER_PIN, LOW);
}

void loop() {
  Serial.println("Testing Relay: ON");
  digitalWrite(RELAY_PIN, RELAY_ON);
  delay(2000);

  Serial.println("Testing Relay: OFF");
  digitalWrite(RELAY_PIN, RELAY_OFF);
  delay(2000);

  Serial.println("Testing Buzzer: ON");
  tone(BUZZER_PIN, 1000); // Play 1kHz tone
  delay(1000);

  Serial.println("Testing Buzzer: OFF");
  noTone(BUZZER_PIN);
  delay(2000);

  Serial.println("Hardware test cycle complete. Repeating...");
  Serial.println("----------------------------------------");
}

Lógica principal del controlador (sump_controller.ino)

Crea un directorio llamado sump_controller y guarda el siguiente código como sump_controller.ino. Este código implementa la lógica de histéresis y el temporizador de alarma sin bloqueo.

Vista pública parcial del archivo validado. El código completo se muestra a miembros y en PDF/Print.

/*
 * sump_controller.ino
 * Dual-float sump pump controller with hysteresis and high-water alarm.
 * Target: Arduino UNO R3 (ATmega328P)
 */

// --- Pin Definitions ---
const int LOW_FLOAT_PIN = 2;
const int HIGH_FLOAT_PIN = 3;
const int RELAY_PIN = 4;
const int BUZZER_PIN = 5;

// --- Logic Definitions ---
// Using INPUT_PULLUP: Switch closed (floating up) connects to GND (LOW)
const int FLOAT_TRIGGERED = LOW;
const int FLOAT_RESTING = HIGH;

// Standard 5V relay modules are typically Active LOW
const int RELAY_ON = LOW;
const int RELAY_OFF = HIGH;

// --- Alarm Configuration ---
// Time in milliseconds before triggering alarm if High Float stays triggered
const unsigned long ALARM_DELAY_MS = 5000; 

// --- State Variables ---
bool pumpIsActive = false;
bool alarmIsActive = false;
unsigned long highFloatStartTime = 0;

void setup() {
  Serial.begin(9600);
  while (!Serial) { ; } // Wait for serial port to connect

  Serial.println("Initializing Sump Pump Controller...");

  // Configure float switch pins with internal pull-ups
  pinMode(LOW_FLOAT_PIN, INPUT_PULLUP);
  pinMode(HIGH_FLOAT_PIN, INPUT_PULLUP);

  // Configure output pins
  pinMode(RELAY_PIN, OUTPUT);
  pinMode(BUZZER_PIN, OUTPUT);

  // Set initial safe states
  digitalWrite(RELAY_PIN, RELAY_OFF);
  noTone(BUZZER_PIN);

  Serial.println("System Ready.");
  Serial.println("-----------------------------------");
}
// ...

🔒 Este contenido es premium. Con la suscripción mensual (7 días gratis) podrás desbloquear el material didáctico completo y el pack PDF listo para imprimir.🔓 Desbloquéalo — 7 días gratis
/*
 * sump_controller.ino
 * Dual-float sump pump controller with hysteresis and high-water alarm.
 * Target: Arduino UNO R3 (ATmega328P)
 */

// --- Pin Definitions ---
const int LOW_FLOAT_PIN = 2;
const int HIGH_FLOAT_PIN = 3;
const int RELAY_PIN = 4;
const int BUZZER_PIN = 5;

// --- Logic Definitions ---
// Using INPUT_PULLUP: Switch closed (floating up) connects to GND (LOW)
const int FLOAT_TRIGGERED = LOW;
const int FLOAT_RESTING = HIGH;

// Standard 5V relay modules are typically Active LOW
const int RELAY_ON = LOW;
const int RELAY_OFF = HIGH;

// --- Alarm Configuration ---
// Time in milliseconds before triggering alarm if High Float stays triggered
const unsigned long ALARM_DELAY_MS = 5000; 

// --- State Variables ---
bool pumpIsActive = false;
bool alarmIsActive = false;
unsigned long highFloatStartTime = 0;

void setup() {
  Serial.begin(9600);
  while (!Serial) { ; } // Wait for serial port to connect

  Serial.println("Initializing Sump Pump Controller...");

  // Configure float switch pins with internal pull-ups
  pinMode(LOW_FLOAT_PIN, INPUT_PULLUP);
  pinMode(HIGH_FLOAT_PIN, INPUT_PULLUP);

  // Configure output pins
  pinMode(RELAY_PIN, OUTPUT);
  pinMode(BUZZER_PIN, OUTPUT);

  // Set initial safe states
  digitalWrite(RELAY_PIN, RELAY_OFF);
  noTone(BUZZER_PIN);

  Serial.println("System Ready.");
  Serial.println("-----------------------------------");
}

void loop() {
  // 1. Read the current state of both float switches
  int lowFloatState = digitalRead(LOW_FLOAT_PIN);
  int highFloatState = digitalRead(HIGH_FLOAT_PIN);

  // 2. Evaluate Hysteresis Logic for the Pump
  if (highFloatState == FLOAT_TRIGGERED) {
    // Water has reached the top float. Turn pump ON.
    if (!pumpIsActive) {
      pumpIsActive = true;
      digitalWrite(RELAY_PIN, RELAY_ON);
      Serial.println("ACTION: High level reached. Pump turned ON.");
    }
  } 
  else if (lowFloatState == FLOAT_RESTING) {
    // Water has dropped below the bottom float. Turn pump OFF.
    if (pumpIsActive) {
      pumpIsActive = false;
      digitalWrite(RELAY_PIN, RELAY_OFF);
      Serial.println("ACTION: Low level cleared. Pump turned OFF.");
    }
  }
  // Note: If water is between the two floats, pumpIsActive retains its previous state.
  // This is the core of hysteresis.

  // 3. Evaluate Alarm Logic (Non-blocking timer)
  if (highFloatState == FLOAT_TRIGGERED) {
    // If this is the first moment we see the high float triggered, record the time
    if (highFloatStartTime == 0) {
      highFloatStartTime = millis();
    }

    // Check if the high float has been triggered longer than the allowed delay
    if ((millis() - highFloatStartTime >= ALARM_DELAY_MS) && !alarmIsActive) {
      alarmIsActive = true;
      tone(BUZZER_PIN, 2000); // 2kHz warning tone
      Serial.println("ALARM: Water level critically high! Pump may be failing.");
    }
  } else {
    // Water is no longer at the high float. Reset alarm states.
    if (highFloatStartTime != 0 || alarmIsActive) {
      highFloatStartTime = 0;
      alarmIsActive = false;
      noTone(BUZZER_PIN);
      Serial.println("STATUS: High water condition cleared. Alarm reset.");
    }
  }

  // Small delay to debounce switch chattering from simulated water ripples
  delay(100); 
}

Entendiendo la lógica del código

El sketch del controlador principal se basa en dos conceptos fundamentales de ingeniería:

  1. Histéresis: Si solo usáramos un interruptor de flotador, las ondulaciones en el agua harían que el interruptor rebotara rápidamente entre ENCENDIDO y APAGADO. Este «ciclo corto» destruye los relés mecánicos y los motores de las bombas. Al usar un flotador Alto para encender la bomba y un flotador Bajo completamente separado para apagar la bomba, el nivel del agua debe recorrer la distancia física entre los dos interruptores antes de que el estado cambie.
  2. Temporizadores sin bloqueo: En lugar de usar delay(5000) para la alarma —lo cual congelaría todo el Arduino y detendría la comprobación de los flotadores—, el código usa millis(). Registra una marca de tiempo cuando se activa el flotador alto (highFloatStartTime) y la resta continuamente del tiempo actual. Si la diferencia supera los 5000 milisegundos, suena la alarma, todo mientras el Arduino continúa evaluando la lógica de la bomba 10 veces por segundo.

Comandos de Compilación/Flasheo/Ejecución

Usa Arduino CLI para compilar y subir el código a tu Arduino UNO R3.

Tabla de referencia de comandos

TareaComando
Actualizar índicearduino-cli core update-index
Instalar núcleo AVRarduino-cli core install arduino:avr
Compilar códigoarduino-cli compile --fqbn arduino:avr:uno sump_controller
Subir a la placaarduino-cli upload --fqbn arduino:avr:uno --port <PORT> sump_controller
Monitor seriearduino-cli monitor --port <PORT> --config baudrate=9600

Nota: Reemplaza <PORT> con tu puerto serie real (por ejemplo, COM3 en Windows, /dev/ttyACM0 en Linux, o /dev/cu.usbmodem14101 en macOS).

Flujo de ejecución

  1. Abre tu terminal y navega hasta el directorio que contiene tu carpeta sump_controller.
  2. Actualiza tu índice de núcleos y asegúrate de que la arquitectura AVR esté instalada (los dos primeros comandos de la tabla).
  3. Compila el sketch para verificar que no haya errores de sintaxis.
  4. Conecta tu Arduino UNO R3 vía USB.
  5. Sube el código compilado a la placa.
  6. Inicia el monitor serie para ver los registros del sistema y comenzar la validación física.

Validación paso a paso

Con el monitor serie abierto, manipula manualmente los interruptores de flotador físicos para simular la subida y bajada del agua.

  1. Estado inicial (Pozo vacío)
    • Acción: Deja ambos flotadores colgando hacia abajo (en reposo/abiertos).
    • Observación esperada: El monitor serie muestra «System Ready.» El relé está en silencio. El zumbador está en silencio.
    • Condición de aprobación: El pin 4 está en HIGH (Relé APAGADO), el pin 5 está en LOW.
  2. Agua subiendo (Nivel medio)
    • Acción: Levanta el flotador Bajo (cerrado). Deja el flotador Alto abajo.
    • Observación esperada: No hay cambios en el relé ni en el zumbador.
    • Condición de aprobación: El sistema espera al flotador Alto. La histéresis previene la activación prematura.
  3. Agua subiendo (Nivel alto / Activación de la bomba)
    • Acción: Mantén el flotador Bajo arriba y levanta el flotador Alto.
    • Observación esperada: Un «clic» distintivo del módulo de relé. El monitor serie registra «ACTION: High level reached. Pump turned ON.»
    • Condición de aprobación: El LED indicador del relé se enciende. La lógica de la bomba se activa con éxito.
  4. Disparador de alarma (Simulación de fallo de la bomba)
    • Acción: Mantén ambos flotadores arriba durante más de 5 segundos.
    • Observación esperada: Después de exactamente 5 segundos, el zumbador piezoeléctrico emite un tono fuerte de 2kHz. El monitor serie registra «ALARM: Water level critically high!».
    • Condición de aprobación: El temporizador sin bloqueo evalúa con éxito el tiempo transcurrido y activa la advertencia.
  5. Agua retrocediendo (Nivel medio)
    • Acción: Deja caer el flotador Alto (abierto). Mantén el flotador Bajo arriba.
    • Observación esperada: El zumbador se detiene inmediatamente. El monitor serie registra «STATUS: High water condition cleared.» Crucialmente, el relé permanece ENCENDIDO (con clic).
    • Condición de aprobación: La lógica de histéresis mantiene la bomba activa para continuar drenando el pozo.
  6. Agua retrocediendo (Pozo vacío)
    • Acción: Deja caer el flotador Bajo (abierto).
    • Observación esperada: El relé hace «clic» para apagarse. El monitor serie registra «ACTION: Low level cleared. Pump turned OFF.»
    • Condición de aprobación: El sistema regresa al estado seguro inicial.

Solución de problemas

SíntomaCausa probableSolución
El relé se enciende cuando los flotadores están ABAJO, y se apaga cuando están ARRIBAEl clip en C del interruptor de flotador está invertido (Normalmente Cerrado en lugar de Normalmente Abierto).Quita el clip en C inferior del flotador, voltea el anillo magnético al revés y vuelve a colocar el clip.
El LED del relé se enciende, pero no se escucha ningún «clic»Energía insuficiente para la bobina del relé.Asegúrate de que el VCC del módulo de relé esté conectado al pin de 5V del Arduino, no al pin de 3.3V.
La bomba hace ciclos cortos rápidamente (El relé repiquetea)Los interruptores de flotador están cableados al revés en los pines del Arduino.Intercambia los cables en los pines D

Encuentra este producto y/o libros sobre este tema en Amazon

Ir a Amazon

Como afiliado de Amazon, gano con las compras que cumplan los requisitos. Si compras a través de este enlace, ayudas a mantener este proyecto.

Quiz rápido

Pregunta 1: ¿Qué tipo de prototipo se describe en el artículo?




Pregunta 2: ¿Qué componente principal se automatiza según los niveles de agua?




Pregunta 3: ¿Qué acción toma el sistema si el agua permanece en un nivel peligrosamente alto?




Pregunta 4: ¿Cuál es el beneficio principal del sistema en sótanos?




Pregunta 5: En aplicaciones industriales, ¿qué problema evita el uso de este controlador?




Pregunta 6: ¿Qué uso agrícola se menciona para este prototipo?




Pregunta 7: ¿Qué concepto de teoría de control educativo introduce este proyecto?




Pregunta 8: ¿Por qué es importante utilizar dos umbrales diferentes (histéresis) en este sistema?




Pregunta 9: Según el resultado esperado, ¿cuándo se enciende exactamente la bomba (relé activado)?




Pregunta 10: ¿Qué sucede con el relé cuando el nivel del agua cae justo por debajo del flotador Alto?




Carlos Núñez Zorrilla
Carlos Núñez Zorrilla
Electronics & Computer Engineer

Ingeniero Superior en Electrónica de Telecomunicaciones e Ingeniero en Informática (titulaciones oficiales en España).

Sígueme:
Scroll al inicio