Hoy os traigo un truco simple para mejorar las lecturas analógicas de tu Arduino. Una de las cosas que notas cuando empiezas a usar Arduino y realizar lecturas analógicas, es la fluctuación que hay entre medidas debido a la sensibilidad de los pines analógicos. En mi caso cuando más lo noté fue el día que quise usar un STM32, el cual al disponer de mucha más sensibilidad que el Arduino Uno, fluctuaba más.

No existe un truco mágico para mejorar estas lecturas, pero podemos mejorarlas con unos simples tips:

  • Mantén el recorrido del cable lo más corto posible, para así reducir las interferencias externas.
  • Mantén el cableado y las pistas del PCB lejos de fuentes de interferencias, como transformadores, inductores…
  • Haz varias medidas y saca la media de todas ellas

Obviamente no he creado este post para soltar obviedades, ya que quien más o quién menos conoce alguno o todos los tips de arriba. Os he traído hasta aquí para compartiros una librería que he hecho para gestionar el último tip. Esta librería la he llamado Averager, y la puedes descargar del siguiente enlace.

Seguramente te preguntarás por qué usar una librería para simplemente sacar la media de varias mediciones. A mi personalmente, me parece una media más real hacerla con mediciones sacadas a lo largo del tiempo, que sacarlas a la vez.

Cómo sacar una media para mejorar las lecturas analógicas de Arduino

Para sacar una media puedes usar dos métodos:

  1. La más simple, haces X mediciones, y divides el total entre el número de mediciones.
  2. La mejor, usas las X últimas mediciones para sacar una media.

La primera opción es la más cómoda, ya que simplemente haces X mediciones y sacas la media, pero también es la más lenta. Supongamos que tienes un programa que mide un pin analógico. Para medir correctamente no puedes sacar 5 mediciones de golpe, ya que posiblemente te darán la misma medición, sino que tienes que dejar un pequeño espacio de tiempo entre mediciones. Pongamos que hacemos 5 mediciones con un espacio de 100ms entre ellas, el resultado tardará en estar listo 500ms.

La segunda opción soluciona este problema manteniendo un listado de las últimas 5 mediciones, y haciendo la media de todas ellas. Así siguiendo el ejemplo anterior, cada 100ms podrías sacar la media sin esperar a tener X mediciones. Esto es útil para propósitos como el mío, que es sacar una medida de voltaje que no cambiase bruscamente cada poco tiempo, sino suavizarlas. Para hacerlo bien tienes que crear un array para mantener los items, y cada vez que añadas uno nuevo borrar el más antiguo, y es eso lo que hace mi librería. Total, ya que lo he hecho, por qué no compartirlo.

Cómo usar la librería

Instalación

La instalación es como la de cualquier otra librería. Descargamos el código descargado a C:\Users\<user>\Documents\Arduino\libraries\Averager, e incluimos la librería en nuestro sketch.

#include <averager.h>

Crear un objeto averager

Bueno, para un trabajo tan simple no iba a crear una librería difícil de usar, así que sólo tienes que inicializarla indicando el tipo de variable a usar, por ejemplo double, y cuántas mediciones quieres mantener para hacer la media.

averager<double, 6> voltage;

En el ejemplo de arriba inicializas un objeto averager del tipo double, y que guarde los 6 últimos items.

Añadir un item y sacar la media

Una vez que tengamos el objeto creado, añadir items y sacar la media es muy fácil. Para ello tenemos dos métodos que se encargarán de la gestión.

# Añadimos un item
voltage.append(15.2);

# Sacamos la media
double voltAverage = voltage.getAverage();
Serial.println(volAverage);

Puedes ir añadiendo items con voltage.append, y al llegar al número indicado al inicializar él se encargará de descartar el item más antiguo. Obviamente al añadir una medición no obtendremos ninguna media, y la media se irá suavizando según añadamos más.

Ejemplo de cómo mejorar las lecturas analógicas en Arduino

Para despedirme os dejaré un pequeño ejemplo de cómo usar la librería para sacar la media en un loop simple.

#include <averager.h>

averager<double> voltage;

void setup() {
  Serial.begin(9600);
}

void loop() {
  // Measure voltage
  int measured_voltage = analogRead(1);
  voltage.append(5 / 1024 * measured_voltage);

  // Display average
  Serial.print("Average voltage: ");
  Serial.println(voltage.getAverage());
  
  // Wait a bit
  delay(100);
}

En cada loop recuperará el voltaje del pin analógico, lo añadirá al objeto averager y mostrará la media por el puerto serie.

Espero que os haya gustado, y que os sirva en vuestros proyectos. Un saludo!!

Daniel Carrasco

DevOps con varios años de experiencia, y arquitecto cloud con experiencia en Google Cloud Platform y Amazon Web Services. En sus ratos libres experimenta con Arduino y electrónica.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.