filtrado-senal-arduino-media-movil-ema-mediana

Técnicas de medición: cómo limpiar el ruido de tus sensores

  • 4 min

Un filtro digital es un algoritmo que modifica una secuencia de muestras para reducir ruido o destacar información útil.

Acabas de conectar tu sensor de temperatura LM35 o tu sensor de distancia ultrasónico. Miras el Monitor Serie y ves esto: 20.1, 20.2, 20.1, 25.8, 19.9, 20.1...

Espera, ¿25.8? ¿Ha subido la temperatura 5 grados en un milisegundo? No. Es ruido.

En el mundo real, las señales eléctricas son sucias. Motores arrancando, cables largos que actúan como antenas y la propia inestabilidad del ADC del microcontrolador ensucian tus datos. Si usas ese valor “crudo” para tomar decisiones (ej. encender un ventilador), tu sistema se volverá loco encendiendo y apagando.

Hoy vamos a ver las 4 técnicas de software estándar para convertir una señal ruidosa en una línea suave y elegante.

Comparativa de técnicas

TécnicaIdeal para…Coste Computacional
Promedio de muestrasRuido aleatorioAlto si bloquea durante muchas lecturas
Media móvilSuavizado generalAlto (Memoria RAM)
MedianaEliminar picos locosMedio (requiere ordenar)
EMAUso general (Estándar)Muy Bajo (Rápido y ligero)

Promedio de varias muestras

Es una técnica básica que funciona bien frente a ruido aleatorio no correlacionado. En lugar de leer el sensor una vez y confiar en él, lo leemos 10, 50 o 100 veces seguidas muy rápido y hacemos la media.

¿Por qué funciona? El ruido blanco es aleatorio (a veces suma, a veces resta). Al sumar muchas muestras, el ruido tiende a cancelarse entre sí, mientras que la señal real permanece.

// Ejemplo: Promedio simple
float leerSensorSuave() {
  long suma = 0;
  int n_muestras = 50;
  
  for(int i=0; i<n_muestras; i++) {
    suma += analogRead(A0);
    delay(1); // Pequeña pausa para estabilidad
  }
  
  return (float)suma / n_muestras;
}
Copied!
  • Ventaja: Muy fácil de programar.
  • Desventaja: “Bloquea” el procesador. Si tomas 100 muestras con pausas, tu código se congela durante ese tiempo.

La media móvil simple (SMA)

Imagina una ventana que se desliza sobre tus datos. Tomas las últimas 10 lecturas, las promedias y esa es tu salida. Cuando entra un dato nuevo, borras el más antiguo.

Esto suaviza la curva maravillosamente.

  • El problema de la memoria: Para hacer esto en Arduino, necesitas un array (lista) para guardar los últimos N valores.
  • Si quieres promediar 50 valores, necesitas gastar memoria RAM para guardar 50 enteros. En chips pequeños, esto es un lujo.

El filtro de mediana

A veces el ruido no es suave, son picos. Imagina un sensor de distancia: 10cm, 10cm, 11cm, 800cm, 10cm...

Ese “800” es un error de lectura.

  • Si haces la media: (10+10+11+800+10) / 5 = 168 cm. ¡El promedio se rompe por culpa del pico!
  • Si haces la mediana: Ordenas los valores (10, 10, 10, 11, 800) y coges el del centro -> 10 cm.

La mediana es robusta frente a valores aislados muy alejados. Resulta útil en sensores ultrasónicos o infrarrojos que producen picos ocasionales.

El filtro EMA (media móvil exponencial)

El filtro EMA (o filtro paso bajo digital) suaviza las lecturas sin guardar una ventana completa de muestras: solo necesita conservar el estado anterior.

Funciona dando un “peso” a la lectura nueva frente a la historia acumulada.

La fórmula:

Donde alfa es un número entre 0 y 1 que define la suavidad:

  • Alfa = 1.0: Sin filtro (tomas el valor actual tal cual).
  • Alfa = 0.1: El valor nuevo solo afecta un 10%. El 90% del valor depende de la historia pasada. (Muy suave, pero lento).

Implementación en código:

float valorFiltrado = 0; // Estado del filtro
bool inicializado = false;
float alfa = 0.05;       // Factor de suavizado (0.01 a 1.0)

void loop() {
  int lecturaCruda = analogRead(A0);
  
  if (!inicializado) {
    valorFiltrado = lecturaCruda;
    inicializado = true;
  } else {
    valorFiltrado = (alfa * lecturaCruda) + ((1.0 - alfa) * valorFiltrado);
  }
  
  Serial.println(valorFiltrado);
  delay(10);
}
Copied!

¿Qué ventajas tiene?

  1. Memoria: Solo necesitas 1 variable (valorFiltrado).
  2. Ajuste: Cambiando alfa ajustas cuánto filtra.
  3. Equivalencia aproximada: con un periodo de muestreo constante y un alfa bien elegido, se comporta como un paso bajo de primer orden comparable a un filtro RC.

El precio a pagar: el retardo (lag)

Cuanto más filtres una señal (más promedios, o un alfa más pequeño en EMA), más estable será el número, pero más tardará en reaccionar.

  • Si mides la temperatura ambiente, te da igual tener 2 segundos de retraso. ¡Filtra mucho!
  • Si mides el giroscopio de un dron para que no se estrelle, necesitas reacción instantánea. ¡Filtra poco!

El arte de la ingeniería está en encontrar el equilibrio entre una señal limpia y una respuesta rápida.