Hola buen día a todos,
estoy trabajando en un proyecto, en el que tengo un sensor que mide la temperatura cada unos segundos y lo mete en un array con 24 valores. Lo que quiero es obtener el promedio de esos 24 valores una vez el array esté lleno. Para eso escribí este código:
int temp[24];
int suma = 0;
int promedio = 0;
void prom() {
float Druck, Temp, Feuchte;
bme.read(Druck, Temp, Feuchte);
for (int k=0; k<24; k++){
temp[k]= Temp;
suma = suma + temp[k]
}
promedio = suma/24;
}
El problema aparece cuando el sensor lee más de 24 datos. Lo que me gustaría que pasara es que el primer valor leído, es decir temp[0], se convierta en el segundo, es decir temp[1], y así con todos los valores, para que el primer valor leído ya no esté en el array y al final quede un espacio para el nuevo valor que el sensor lee.
Es decir, si
temp[21] = 18;
temp[22] = 20;
temp[23] = 21;
y el sensor mide un nuevo valor para la temperatura, quiero que le pase esto al array:
temp[21] = 20;
temp[22] = 21;
temp[23] = nuevo valor;
Pero no logro que haga eso y estoy muy perdida. Les agradecería que me pudieran ayudar por favor!
Otra opción es llenar el array con una variable contador que cuando llegue a 24 hagas la media, regresarla a 0 y activar un swich que te diga que ya tienes 24, de manera que sólo promediarás cuando tengas 24 y swich en True, de esa manera al llegar a 24 la primera vez, cambias el swich a TRUE, regresas el contador a 0 y sigues iterando, así te evitas desplazar todas las lecturas, total necesitas 24, ahora, si las deseas ordenadas de más antigua a más nueva (FILO) esto no te serviría, pero si sólo quieres promedio, me parece la manera más rápida y que menos recursos de tiempo consume.
Tal cual, lo que propuse fue en base a lo que planteo @gabanana, aunque personalmente haría lo que dice @TonyDiana, al llegar a 23 reiniciar el contador y empezar a reescribir los valores desde 0. A los fines prácticos es lo mismo, se van descartando las primeras lecturas sin la necesidad de desplazar los datos del array.
Incluso se podrían hacer 24 lecturas en el setup solo para cargar el array y luego en el loop ir reescribiendo los datos y hacer el cálculo del promedio.
En definitiva, hay varias formas de llegar al mismo resultado.
Yo creo que todo depende de si necesitas FIFO o FILO, si sólo se desea un promedio, lo mejor es ahorrar memoria y ciclos de programa y el FILO es el más adecuado; yo no haría un promedio FIFO nunca, pero bueno, depende de lo que se esté midiendo
Y si lo llevamos a otro nivel?
Mira este tutorial de Luis Llamas Filtro de media móvil
En este caso si deseas usar 24 valores, el sistema siempre agrega el ultimo valor a la serie de datos y descarta el mas viejo.
Lo encuentras en esta libreria Mean Filter
Este es un tema muy utilizado por todos cuando tomamos un sensor y decidimos promediar valores, pero qué ocurre si esos valores tienen espúreos? El promedio se descontrola y terminamos descreyendo de los resultados.
El promedio es un estimador poco robusto en ciertos casos, un solo punto fuera de lugar puede provocar un gran desvió de lo esperable.
Por eso tenemos la estadística que nos provee de una herramienta que se conoce como mediana.
Luis llamas de nuevo al rescate con este tutorial y su librería filtro Mediana
OJO: también la mediana tiene restricciones. Uso de número de muestras impares, etc.
Si, exácto a eso me refiero, si se desplaza te acercas que no al FIFO, pero por eso digo que hay que tener presente el dato que entra cuando lo quieres sacar