Go Down

Topic: Oscilaciones Flotador (Read 185 times) previous topic - next topic

Aecb14

Buenas tardes,

Estoy trabajando en un sistema que mide el nivel de combustible a camiones para luego enviar esta info a un sistema de seguimiento, hasta ahora he logrado conectarme a la boya original del vehículo y obtener la medida y enviarla por el arduino. Cuando el vehiculo acelera o frena el contenido del tanque se mueve y en ese momento tengo oscilaciones de hasta 40% en la señal de entrada y ahi es donde esta mi problema, hasta ahora he intentado usando delay para tomar medidas cada cierto tiempo y tambien utilizar promedios pero no logro estabilizar la señal en esos casos.

Gracias por la atención.

ArduMyth

#1
Jul 13, 2018, 12:23 am Last Edit: Jul 13, 2018, 12:26 am by ArduMyth
Lo primero supongo que te refieres a un sensor de nivel. Aquí entra en juego no sólo el código sino qué estás usando.

Dices que envías la información a un sistema de seguimiento y haces un promedio con ¿¡¡¡delay()!!!?
¿Sabes que cuando uses delay() por ejemplo no podrás mandar ni recibir en ese tiempo NADA?
Detienes todo. Para que quede claro. La función nativa delay() su función expecíficamente es bloquear/parar TODO, NO ES UN TIMER. Es cierto, dado lo simple que resulta usar 1 línea está en todos los ejemplos básicos y la gente lo ha acabado usando como si de un interval en otro lenguaje se tratase.

Lo de promediar sí es buena idea pero tengo la impresión en que el problema puede ser el sensor que usas dado el medio donde está. Diferencias de un 40% es demasiado. implica que estando algo casi vacío te muestra que lo tienes un poco menor que la mitad de la capacidad.

Si la cuestión fuese de código cómo no has puesto nada de tu promedio no podemos decirte.
Si te fijas falta mucha información que no das para que alguien pueda ayudarte, ya se en la parte física cómo en la parte de software.

Saludos.

surbyte

#2
Jul 13, 2018, 01:33 am Last Edit: Jul 13, 2018, 01:33 am by surbyte
Los tanques suelen tener rompeolas, si tu tanque no lo tiene, me hace suponer que usas usas un tanque no profesional y menos que menos certificado aunque puedo equivocarme.
Un tanque común claro que en una frenanda arrastra el líquido a hacer de todo, por eso el rompeolas.

Como evitar las olas? Si miras un medidor de combustible de auto observarás que es MUY LENTO o su promediación es alta.

Una solución para probar sería un muestro alto de un promedio movil. Eso te permitiria estar con el valor real y dejar pasar perturbaciones como estas.

IMPLEMENTAR UN FILTRO DE MEDIA MÓVIL RÁPIDO EN ARDUINO

Y aca el Github con la librería

No uses 5 muestras, usa muchas mas. Digamos 100/150

Aecb14

#3
Jul 13, 2018, 01:50 am Last Edit: Jul 13, 2018, 02:02 am by surbyte
Hola, con respecto a lo del rompeolas hay vehículos de la flota que se monitorea que no los tienen (increíble pero cierto)

Probare la solución que propones a ver que tal me va

Gracias

Aecb14

No uses 5 muestras, usa muchas mas. Digamos 100/150
Un par de preguntas.

El tamaño de la ventana corresponde al numero de muestras cierto? en este caso las 100 o 150 que me sugieres

En caso de que lo anterior sea correcto como le mando esas 150 muestras al filtro? Mediante un ciclo?

Gracias.

Kike_GL

De hecho las soluciones fisicas tienes que aplicarlas, tanto la de poner rompeolas como la de la subcamara con orificio de comunicacion pequeño para el sensor.

Una solucion a tu problema de codigo seria limitar los cambios obtenidos por lecturas promedio recientes.

Nivel actual = Nivel anterior + promedio/100

Con eso logras que los cambios sean atenuados.
Saludos, Kike_GL

surbyte

Cuando alguien te sugiere algo, lo que debes hacer ir a verlo. Luego que lo miras detenidamente, consultas.
No creo que lo hayas visto, o probado los ejemplos.
Supongamos que si y aun asi, no entendiste como cambiar la cantidad de muestras.

Algo que me dice que no lo leiste est esto

Quote
En caso de que lo anterior sea correcto como le mando esas 150 muestras al filtro? Mediante un ciclo?
Pero vamos al ejemplo de la librería para floats.  MeanfilterFloat.ino

En ese ejemplo existe una vector ARMADO de varios elementos, que no será tu caso.

Luego lees esta línea que es la que toma los datos
Code: [Select]
float getMeasure()
{
 size_t static index = 0;
 index++;
 return values[index - 1];
}


y luego esta

Code: [Select]
// Instanciar filtro media movil con ventana tamaño 5
MeanFilter<float> meanFilter(5);

Acá es donde debes cambiar meanFilter(5) x meanFilter(150) por ejemplo


Aecb14

De hecho las soluciones fisicas tienes que aplicarlas, tanto la de poner rompeolas como la de la subcamara con orificio de comunicacion pequeño para el sensor.
Esa es la idea que se tiene pero no todos los clientes están dispuesto a que les hagan modificaciones a su tanque de combustible(Esto se implementaría en muchos camiones)

Aecb14

Acá es donde debes cambiar meanFilter(5) x meanFilter(150) por ejemplo

En realidad si había mirado la librería solo que intente enviar un vector con 150 muestras al utilizar

Code: [Select]
float mean = meanFilter.AddValue(); Y pues me tiraba error.

De todas formas con tu respuesta ya lo pude hacer funcionar y hasta ahora parece que es lo que necesito.

Muchas gracias a todos por su ayuda.

Go Up