Hola a tod@s,
Necesito medir el nivel de agua en un pozo, realmente es en una tubería de pvc de 125mm de diámetro, que no excederá de los 2,5m de columna de agua.
He empezado a hacer pruebas con un MPX5500DP de Freescale y tengo la impresión de que me he equivocado al elegirlo, pues es para 500Kpa (aproximadamente 50m de columna de agua) y ya tengo pedido un MPX5050DP que seria para 5m.
La idea es colocar el sensor en su placa electrónica en un sitio seguro y desde el mismo llevar los dos puertos con tubo de silicona de 4x6mm hasta la boca del tubo de pvc, la distancia de esos tubos será de unos 5m el mas corto que irá libre en la parte superior de la tubería y el otro en el fondo de la misma, por ello pensé que podría necesitar el 5500, pero como comento arriba creo que me he equivocado con la elección.
Los primeros problemas que estoy teniendo con este sensor es la estabilidad en la medición, quizá porque al ser de tan amplio rango es muy sensible, pero con el sensor en la mesa de trabajo y ambos puertos expuestos a la misma presión tengo variaciones de +- 10mv que se traduce en unos +-10cm de altura de nivel de agua, lo cual no me termina de gustar.
Respecto al hardware, estoy usando un ESP32 con el circuito prototipo realizado con soldaduras en placa perforada sin mucha complicación, alimentación externa a 5V 3A, los condensadores recomendados por NPX en el sensor y en la salida un divisor de voltaje con 3 resistencias de 10k para conseguir los 3.3v en una entrada analógica del ESP, no se si añadiendo algún condensador en esa entrada podría estabilizar un poco mas la señal.


En cuanto al software, estoy usando 2 filtros, un primer filtro de media móvil en la lectura de la entrada analógica con 20 muestras en cada medición separadas 5ms entre ellas y un segundo filtro de media de 20 mediciones ya convertidas a cm de nivel de agua, con eso consigo estabilizar algo mas los valores, pero aun así tengo variaciones considerables de +- 2cm; el código aun necesita limpieza y algunos retoques, pero el resultado podría ser válido, no necesito precisión milimétrica
// Sensor de presion diferencial MPX5500DP
const int MPX5500DP_PIN = 36; // PIN del esp32 donde va conectada la salida de voltaje del sensor
double level; // Nivel teorico
double level_media; // Nivel filtrado
int samples = 20; // Numero de muestras
double voltage_output; // Voltaje de salida del sensor
double pressure; // Presion
double voltage_supply = 5.0; // Voltaje de entrada del sensor
double pressure_compensation = 16.75; // Ajusta la medida de presión
int water_density = 997; // Densidad del agua
double gravity = 9.8; // Gravedad
double TF_var_1 = 0.0018; // DataSheet, variable 1 de funcion de transferencia
double TF_var_2 = 0.04; // DataSheet, variable 2 de funcion de transferencia
/**
* @brief Obtener nivel de agua
*/
void getLevel()
{
double sum_values = 0; // Variable auxiliar para suma de muestreos
double analog_read = 0; // Variable auxiliar para almacenar lectura analogica
double sum_analog = 0; // Variable auxiliar para suma de lectura analogica
static double analog_read_filtered = 0; // Variable auxiliar para almacenar ultima lectura analogica, permanece estática
double sum_analog_filtered = 0; // Variable auxiliar para suma de lectura analogica filtrada
double alpha = 0.05; // Filtro media movil
//Voltaje del Sensor MPX5500DP
for(int i = 0; i < samples; i++)
{
// Filtro media movil - https://www.youtube.com/watch?v=Pl79Ni3NUsY
// An = a*M+(1-a)*An
analog_read = analogRead(MPX5500DP_PIN);
analog_read_filtered = (alpha * analog_read) + ((1 - alpha) * analog_read_filtered);
//sum_analog += analog_read;
sum_analog_filtered += analog_read_filtered;
sum_values += ( float( analog_read_filtered ) * 5.0 / 4095.0 ); //voltios
delay(5);
}
voltage_output = sum_values / samples;
//Presión en Kpa según gráfica 4 del DataSheet
pressure = ( voltage_output - TF_var_2 * voltage_supply ) / (TF_var_1 * voltage_supply) + pressure_compensation;
// Nivel de agua en centimetros
level = ( (pressure * 1000) / (water_density * gravity) ) * 100;
//level_media = avgAddValue(pressure); // Para calibrar presion de compensacion
level_media = avgAddValue(level); // Añadir registro a segundo filtro de media, 20 valores
}
Entiendo que las variaciones se reducirán con el MPX5050DP, pero aun así podría intentar filtrar algo mas la entrada en el hardware si me indicáis como (no controlo mucho de electrónica y menos de filtrado de señales).
Sobre la posición del tubo de silicona en la tubería de PVC, he consultado un tema de @Surbyte de 2014 en el que usa una campana en el extremo inferior de la sonda y no termino de entender el motivo, tenía intención de meter el tubo de silicona "tal cual" al fondo de la tubería, pero lo de la campana me hace pensar un poco.




