El análisis estadístico de datos en Arduino se vuelve una necesidad a medida que nos involucramos en proyectos más profundos, con integración de sensores y grandes volúmenes de información. Sin embargo, es importante recordar que Arduino posee una capacidad limitada de memoria SRAM. Si no se tiene cuidado a la hora de declarar variables y asignarles valores, posiblemente el programa fallará en tiempo de ejecución.
En el siguiente artículo explicaré brevemente el uso de la librería Average (descargar en Github), con la cual podemos almacenar y analizar grandes cantidades de datos. La documentación de esta librería se encuentra disponible de forma gratuita a través del sitio web de Arduino.
Funciones de la librería Average
La librería Average fue diseñada hace un par de años para analizar grandes volúmenes de datos almacenados en un Array en Arduino. La librería cuenta con las siguientes funciones:
- rolling: Calcula la media móvil de la serie de datos
- mean Calcula la mediana de la serie de datos
- mode: Calcula la moda
- minimum: Devuelve el valor mínimo de una serie de datos
- maximum: Devuelve el valor máximo de una serie de datos
- stddev: Calcula la desviación estándar
- leastSquares: Cálculo de mínimos cuadrados
- push: Agrega un elemento al array
- get: Obtiene un elemento almacenado en el array
- getCount: Cantidad de elementos almacenados en el array
Es posible agregar nuevas funciones a esta librería debido a que el proyecto se encuentra disponible en Github.
Utilización de la librería Average
Para utilizar la librería Average se necesita instalar la librería en el Arduino IDE. Es importante recordar que cuando se instala una librería se debe reiniciar el software para que el IDE la reconozca.
Se debe llamar la librería a través de la instrucción #include <Average.h> en el inicio del código. Luego se debe crear una instancia de la librería a través de la instrucción: Average<int> ave(10). En esta sentencia, Average es el nombre de la clase, int es el tipo de dato que se almacenará en el buffer y 10 es la cantidad de datos que se almacenará en el buffer.
Es importante tomar en cuenta que el tipo de datos y la cantidad de datos que se almacenan en el buffer puede tener un impacto directo sobre la memoria del microcontrolador. Se debe tener claro los conceptos de tipo de datos y los espacios que ocupan en la memoria. También es saludable estimar la cantidad de datos que se va a guardar para optimizar el uso de memoria.
Análisis estadístico de datos en Arduino
El siguiente ejemplo muestra el uso de esta librería.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
#include <Average.h> void setup() { //Se inicia la comunicación serial Serial.begin(9600); } void loop() { /* Se crea una instancia de la librería, con un tamaño de buffer de 10 datos tipo float */ Average<float> ave(10); /* Variables para almacenamiento del índice del valor minimo y maximo */ int minat = 0; int maxat = 0; //Se imprime la inscripcion Data Series Serial.println("Data Series"); /* Se generan 10 numeros aleatorios y se almacenan en el buffer. A la vez, se imprimen los valores generados */ for (int i = 0; i < 10; i++) { int num = rand(); ave.push(num); Serial.print(num); Serial.print(" "); } /* Se imprimen los resultados obtenidos a partir de la serie de datos generada en el ciclo for */ Serial.println(); Serial.print("Mean: "); Serial.println(ave.mean()); //media Serial.print("Mode: "); Serial.println(ave.mode()); //moda Serial.print("Max: "); Serial.println(ave.maximum(&maxat)); //valor maximo Serial.print(" at: "); Serial.println(maxat); //indice del valor maximo Serial.print("Min: "); Serial.println(ave.minimum(&minat)); //valor minimo Serial.print(" at: "); Serial.println(minat); //indice del valor minimo Serial.print("StdDev: "); Serial.println(ave.stddev()); //desviacion estandar //El proceso se repite cada 10 segundos delay(10000); } |
Este ejemplo es sumamente sencillo, pero ilustrativo de la capacidad de la librería Average. Me ha parecido una herramienta sumamente útil y por ello he compartido este contenido con ustedes. Espero que la información sea de utilidad para ustedes.
Gracias,
Hola, mi nombre es Ulises y su clases de física en México a nivel bachillerato.
Me será muy útil esta información para los proyectos con mis estudiantes.
Estoy leyendo otros de tus posts.
Saludos
hola y gracias por el tema.
soy nuevo en el tema de programacion y me surgen muchas preguntas con el tema que expuso.
como por ejemplo tengo un sensor de color tcs que arroja diferentes valores en rango del r g y b y quisiera sacar las medidas estadisticas de estos 3, mediante la realizacion de un muestreo de 100 datos.
tratare de ser mas explicito. el sensor aroja valores asi r: 98.54 g:115.32 b: 54.32, cierto ahora quisiera tomar 100 datos, es decir que en total me sacaría 3*100=300 datos .ahora quiero sacar las medidas estadisticas de cada componente r g y b. con lo expuesto por usted nos dice que se debe crear una instanciade la libreria con un tamaño x. mi pregunta es esa instancia para mi seria de 300 o de 100.
gracias por atencion prestada
Crea 3 instancias de tamaño 100, una para cada color