Medición nivel agua, con sensor de presión.

Hola buenas tardes. Me he propuesto realizar la medición de sondeo de un pozo de agua. Mi objetivo es medir la altura que se encuentra el agua respecto a la superficie, y añadir una alarma cuando baja de cierto nivel. Agradecería mucho opiniones, mejoras etc...

La medición de nivel la realizo partiendo de la presión hidrostática:

Con el compresor de hinchar las ruedas del coche, manómetro (bar) y una llave que cierra la tubería para que no pierda presión. No tomaré encuentra los efectos de la temperatura, densidad ni gravedad. Ya que es para tener una medida más o menos real.

La bomba del pozo está sumergida en el agua y el nivel del agua no debe de bajar más de este nivel de la bomba. Por eso también añadiré una alarma de bajo nivel, para cuando llegue a este me avise o pare directamente el motor.
De la superficie hasta la parte inferior de la bomba, hay un tubo de plástico de 6 mm donde conecto el manómetro y el compresor. Al aplicarle presión con el compresor, el manómetro nos indica la presión en bares. Donde 1 bar es equivalente a más o menos 10 mts.
Lo que realizo es, calcular la distancia que se encuentra el extremo sumergido del tubo y el nivel del agua.
Por ejemplo, si el extremo del tubo está sumergido en el agua a 100 mts. de la superficie, y la medición del manómetro nos indica 2 bares. Esto nos dice que:
Como 2 bares son 20 mts. 100 - 20= 80 mts es la altura que se encuentra el nivel del agua respecto a la superficie.
Todo esto lo realizo manualmente.

Esta medición la quiero realizar con Arduino, que me indique en pantalla lcd los bares de presión, los metros a descontar y altura a la que se encuentra el agua respecto a la superficie. Además quiero poner una alarma de nivel para evitar que la bomba se quede sin agua y funcione en vacio.

Los materiales que tengo pensado utilizar son: Arduino Uno, sensor de presión y pantalla lcd 16x2.
El sensor de presión me está llevando quebraderos de cabeza, cual utilizo... Y además, son muy caros de 100€ no bajan. Yo tengo pensado utilizar uno que no sea menor a 4 Bares ni mayor a 10 bares. Voy a poner como ejemplo este:

Lo primero que me encuentro, la variación del sensor es de 0 a 10 V. Por lo tanto tendría que hacer un divisor de tensión en la entrada analógica de Arduino para que no entrara más de 5v. Utilizaría 2 resistencias de 1kohm. En esta página se explica muy bien:

http://www.luisllamas.es/2014/09/entradas-analogicas-en-arduino/

Otras de las cosas que creo que tendré que tener en cuenta es, realizar medida de cuando el sensor este en 0 bar, y ver que tensión tiene de salida, para así tomar esa tensión como 0 bar en el Arduino. Igualmente tendré que realizar medida de cuando el sensor llegue a 6 bares y ver que tensión tiene (esta ultima medida supongo que me será mas difícil).

Según las características del sensor me dice que la alimentación es de 24 VDC. Con un transformador de 240V a 24DC podría alimentarlo. Pero para alimentar el Arduino no puedo aplicarle esta tensión, ya que su voltaje de entrada limites son de 6 a 20v, que es la optima de trabajo para Arduino. Tendría que utilizar un regulador que me pasara de 24V a 9V, (LM7809 el límite de voltaje de entrada para este regulador es de 35V, tendría que colocar un buen disipador, o bajar la tensión por medio de un divisor a un voltaje apropiado).

Expongo mi sketch realizado:

#include <LiquidCrystal.h>  ///////////MEDICION NIVEL AGUA
LiquidCrystal  lcd(7,8,9,10,11,12);
float  AN0;  //entrada analogica, conversion, precision de 0 a 1023.
float  V;  //equivalencia conversion, AN0 a Voltaje. De 0 a 5V.
float BarPresion;  //equivalencia conversion, AN0 a Bares. De 0 a 6Bar.
float UnBar=1; //para calcular equi 1 bar son 10.2Mts.
float EquiBarMts=10.2;  //equivalencia 1Bar son 10,2Mts.
float BarMax=6;  //Bares maximo del sensor.
float VMax=5;  //Voltaje maximo de entrada arduino.
float AnConverMax=1024;  //Entrada analogica conversion maxima.
float BombaMts=267;  //Metros profundidad a la que esta la bomba.
float DescuentoMts;  //Metros a descontar a BombaMts. 
float NivelAguaMts=0;  //Metros nivel del agua respecto al suelo.
float AlarmaMts=264;  //Alarma de nivel. Si sube de este nivel activa alarma pin 2.
int Alarma=2; //Salida digital pin 2 de activacion/desactivacion alarma nivel.

void setup() {
  pinMode(Alarma,OUTPUT);
  lcd.begin(16,2);
  Serial.begin(9600);  
}

void loop() {
  AN0=analogRead(A0);   //sera un valor comprendido entre 0 y 1023.
  V=AN0*0.00488;        //variacion de voltaje de 0 a 5 V.
  lcd.setCursor(0,0);
  //CentBar=map(AN0,0,1023,0,600); //mapeo a 600 centibares. NO REALIZO MAPEO me resulta mas complicado.
  //Serial.println(CentBar,2);
  BarPresion=(BarMax*AN0)/AnConverMax; //Pasamos Conversion a Bar.
  DescuentoMts=(EquiBarMts*BarPresion)/UnBar; //Mts a descontar ha MtsBomba.
  NivelAguaMts=BombaMts-DescuentoMts;
  lcd.print("S:");
  lcd.print(NivelAguaMts,2);  //Medida resultado nivel del agua respecto suelo.
  lcd.print("-");
  lcd.print(DescuentoMts,2);  //Mts ha descontar. 
  lcd.setCursor(0,1);
  lcd.print("Bar:");  
  lcd.print(BarPresion,2);  //Bares de presion obtenidos.
  lcd.print("-V:"); 
  lcd.print(V,2);  //voltaje en la entrada analogica.
  delay(10000); //tiempo de resfresco 1 segundo.
  lcd.clear();
  
  ////////////////////ALARMA DE NIVEL////////////////////////////////////////////////////
  if(AlarmaMts<=NivelAguaMts)
  {
    digitalWrite(Alarma,HIGH);
    Serial.println("Alarma ON");
    }
    else
    {
      digitalWrite(Alarma,LOW);
      Serial.println("Alarma OFF");
      }
}

Me gustaría que me aportarais alguna idea, ayuda o si estoy equivocado en algunas de las líneas anteriores. Muchas gracias de antemano.

Bueno empezando por el sensor de presión no termino de entender de que tipo es.
Yo suelo usar algo mas accesible MPX5XXXDP y para cubrir 100mts requieres de uno de 1000kpa
Acá las alternativas de Freescale curiosamente el MPX5999. Según NXP cuesta 6.6dolares en cantidad de 1000 piezas. Claro que no vas a comprar 1000 pero suele estar 16 dolares por unidad.

Ahora supongamos que sigues por la línea que has indicado. Tu sensor de mas de 100 euros.
Divisor de tensión no con 1k sino con 10k, es mucha carga para un sensor usar 2k.

Respecto de las fuentes no estoy de acuerdo.
Usa un step-down para entregarle 6.5 o 7V a la entrada del arduino.
Los consigues por menos dinero de lo que te costara usar un LM7809 mas disipador.

Esto no es 1 seg sino 10 seg

delay(10000); //tiempo de resfresco 1 segundo.

10x1000mseg = 10000 mseg.
debes usar 1000 si quieres 1 seg.

El calculo de la altura de agua podrías simplificarlo pero es una observación menor.
Por cierto se divide por 1023 no 1024.
El AD entrega entre 0 y 1023 lo que hace 1024 pasos, si usas 1024 pasos jamás tu sensor dara 5V cuando leas 1023 porque el cociente 1023/1024 no es 1.

Gracias Surbyte por tu observaciones y aclaraciones.

Exacto se me paso, en el comentario, al final el refresco lo dejo a 10 seg. Y buen apunte con el 1023 no había caído en ello.

Respecto al sensor que me refiero es un sensor de presión. Pero busco uno donde pueda adaptar un tubo de plástico de 1/4". Actualmente la medición la realizo con los componentes de la foto:

El sensor que me indicas me serviría perfectamente. Pero como podría adaptarlo a un tubo de 1/4". O mejor dicho, como podría tomar la presión del tubo de 1/4". Por eso busco un sensor que ya tenga adaptado algo para poderlo conectar al tubo. Por que si no tiene ¿como podría hacerlo?

Respecto a la fuente, estas en todo lo cierto, un step-down es lo mejor, a veces nos complicamos la vida habiendo cosas más sencillas y mejores. En aliexpress he encontrado uno y no muy caro. No me deja poner la pagina, pero si colocamos en google aliexpress step-down de 24 a out 7v nos sale.

Mira este es un sensor parecido

Yo suelo usar un conector de bronce de 1/4 con adaptador para una manguera plásitca del diametro del puerto del sensor que tiene 4.93 de diámetro

Algo asi

Muchas gracias de nuevo surbyte. Este tipo de sensor si se adapta a mis necesidades y el adaptador de lujo. Aun que tengo una preguntilla más:

¿Cual me aconsejáis el MPX5500Kpa o el MPX5700Kpa?

Para mi un sensor de 5 o 7 Bares me va de sobra. Pero al ir a las características de dichos sensores me encuentro lo siguiente:

MPX5500 sensor de presión diferencial integrado.

MPX5700 diferencial, manómetro y sensor de presión absoluta integrada.

Para el MPX5500 entiendo que necesito dos presiones, si uno lo dejo libre y el otro lo conecto al tubo de plástico que va a la bomba me dará correcta la medida. ¿estoy en lo cierto?
El MPX5700, que quiere decir presión absoluta integrada o que diferencia hay con el otro sensor.
Los dos sensores me vendrían bien para mi proyecto pero ¿cual me aconsejáis?

Una vez tengo esto claro empezare a pedir el material y ponerme mano a la obra.

Gracias.

Para el MPX5500 entiendo que necesito dos presiones, si uno lo dejo libre y el otro lo conecto al tubo de plástico que va a la bomba me dará correcta la medida. ¿estoy en lo cierto?

Si, es correcto, uno te da presión positiva y otro negativa. Uno va abierto a presión ambiente y el otro al pozo. Funciona perfecto yo uso eso para medir tanques de agua. El mas grande es de 5 mts. En mi casa no quise subir al techo y por mucho tiempo lo tuve con un MPX5100DP de 10 mts de columna de agua y veía el 0 y el máximo desde abajo o sea con toda la columna de agua de 7mts que tiene mi tanque. Funcionaba bien salvo si usabas esa misma cañería y tenía algunos cambios bruscos. Normal.
En tu caso no habra nada de eso.

Yo siempre hablé de DP o Diferencial, no uso presión absoluta. Nunca lo usé.
La presión ambiente cambia, no recuerdo ahora.. (perdón porque es básico) si viene calibrado el de presión absoluta contra 1 atmosfera.
Puedes usar MPX5500DP o MPX5700DP siempre diferenciales.

Un MPX5500DP te sirve para medir hasta 50.99 mts de agua
un MPX5700DP te sirve para medir hasta 71.38 mts de agua.
Tu sabes cual te conviene, el pozo debe estar abierto para que la lectura sea correcta.

Muchas gracias surbyte. Ya pedí el material. Jeje he pedido uno de cada. Ahora me toca esperar, lo he pedido en aliexpress y tiene un periodo de tardanza de 15 a un mes.En recibir el material me pondré manos a la obra. Y ya te cuento.

Gracias

Como va el proyecto chufi, ha pasado un buen tiempo y como mucha gente consulta sobre estos sensores de presión sería bueno una actualización o cerramos el hilo definitivamente.

Hola Surbyte, ayer mismo te mande un mensaje para ser si era mejor abrir un nuevo hilo y borrar este, o seguir en este.
Pero vamos al tema. Pedí los sensores por aliexpress me tardaron 3 meses en llegar. Pero si, ya el proyecto lo tengo realizado y estoy en pruebas de sondeo. Primero de todo os dejo el código. Se que no es del todo eficiente pero funciona. Por lo tanto si veis algo mejorable me gustaría que me lo indicarais:

/*
 * SONDEO DE POZO DE AGUA Version:1.0 3-02-2017.
 * Sondeo de pozo de agua mediante un sensor de presion MPX5700DP
 * LCD: RS=D7 Entrada =>Salida desde Arduino 0= Arduino transferir introcciones
 *                                           1= Arduino transferir datos (ASCII)
 *      E=D8  Entrada =>Salida desde Arduino 0=Pantalla LCD deshabilitada (en alta impedancia)                                        
 *                                           1=Pantalla LCD habilitada.
 *      D4=D9, D5=D10, D6=D11, D7=D12 (bus instrucciones/datos).
 * 
 * Valor 0Kpa empezara en 0,23V (AN0=48). Calibrado es la variable AnCalimin. Esta calibración
 * se realizara sin presión. El valor obtenido en AN0 será el valor 0Kpa.
 * Variables a modificar para cada Pozo: BombaMts (indicar la profundidad de la bomba)
 *                                       AlarmaMts (indicar cuando salta alarma)
 * 
 */
#include <LiquidCrystal.h> //libreria con funciones LCD
LiquidCrystal  lcd(7,8,9,10,11,12); //inicia la libreria, conexiones LCD(Arduino) 

/*CONSTANTES*/
float UnBar=1; //para calcular equi 1 bar son 10.2Mts.
float KPaaBar=100; //conversión KPa a Bar.
float EquiBarMts=10.2;  //equivalencia 1Bar son 10,2Mts.
float  AN0;  //entrada analógica, conversion, precision de 0 a 1023.
float  V;  //equivalencia conversion, AN0 a Voltaje. De 0 a 5V.
float TiemMili=3000; //Tiempo de refreco de pantalla en milisegundos.

/*Maxima y mínima entrada analogica conversion*/
float AnConverMax=1023;  //Entrada analogica conversion maxima.
float AnCaliMin=48; //Calibración entada analógica sensor empieza en 0KPa con 0,23V.
/*Máxima y mínima medición del sensor en KPa*/
float KPaSensorMax=700; //Medida máxima de KPa del sensor.
float KPaSensorMin=0;  //Medida mínima de KPa del sensor.

float KPa; //Valor en KPa.
float Bar;  //Bares presión.

float BombaMts=267;  //Metros profundidad a la que esta la bomba.
float DescuentoMts;  //Metros a descontar a BombaMts. 
float NivelAguaMts=0;  //Metros nivel del agua respecto al suelo.

float AlarmaMts=264;  //Alarma de nivel. Si sube de este nivel activa alarma pin 2.
int Alarma=2; //Salida digital pin 2 de activacion/desactivacion alarma nivel.

void setup() {
  pinMode(Alarma,OUTPUT);
  lcd.begin(16,2); //indico 2 filas de 16 caracteres.
}

void loop() {
  AN0=analogRead(A0);   //sera un valor comprendido entre 0 y 1023.
  V=AN0*0.00488;        //variacion de voltaje de 0 a 5 V.
  lcd.setCursor(0,0);
  //valor 41 (0,20V) analogico sera 0 KPa es para calibrar.
  KPa=map(AN0,AnCaliMin,AnConverMax,KPaSensorMin,KPaSensorMax); //mapeamos valor entrada analógica (0.20-5V) a 0-700 KPa.
  Serial.println(KPa,2);//resolución 2 decimas.
  //una vez lo tenemos en KPa convertimos a bar. Simple dividir KPa/KPaaBar.
  Bar=KPa/KPaaBar;
  //una vez tenemos los bar convertimos en mts. Para saber lo que tenemos que restar
  //a los mts de la profundidad de la bomba. regla de 3.
  DescuentoMts=(Bar*EquiBarMts)/UnBar;
  //restamos esos metros a la profuncidad de la bomba para saber el nivel del agua.
  NivelAguaMts=BombaMts-DescuentoMts;
  
  /***************************Empezamos a imprimer en el LCD datos.*****************/
  lcd.print("B:");
  lcd.print(Bar,2);  //Medida de descuento de presión Bar.
  lcd.print("-");
  lcd.print(DescuentoMts,2);  //Mts ha descontar. 
  lcd.setCursor(0,1);
  lcd.print("AN0:");  
  lcd.print(AN0,2);  //entrada analógica conversion A/D de 0 a 1023.
  lcd.print("-V:"); 
  lcd.print(V,2);  //voltaje en la entrada analogica.
  delay(TiemMili); //tiempo de resfresco de pantalla.
  lcd.clear();
  
  /***********************ALARMA DE NIVEL*********************************************/
  if(AlarmaMts<=NivelAguaMts)
  {
    digitalWrite(Alarma,HIGH);  //Estado alto salida pin 2 arduino.(Alarma ON)
    }
    else
    {
      digitalWrite(Alarma,LOW); //Estado bajo salida pin 2 arduino. (Alarma OFF)
      }
}

Finalmente me decante por el sensor de presión MPX5700DP. Tuve que realizar una serie de conversiones al darme los valores en KPa los traduje a Bar y para calcular los metros, hice la equivalencia de 1 bar = 10,2mts. En la pantalla como estoy de momento en pruebas me imprime; los bares de presión, el descuento en metros que tengo que realizar, la entrada analógica el valor de 0 a 1023 y el voltaje que me llega a la entrada analógica.

Es muy importante calibrar el nivel 0 de kpa sin presión. Donde mi valor fue 0,23V (AN0=48).

Bueno ahora la practica:
Realizando mediciones y comparándolas con un barómetro analógico las mediciones varían un poco con forme aumenta los metros de profundidad del agua y según en la zona de medición también. Lo que si que he observado que siempre el descuento de metros es mayor en el sensor MPX5700DP, que en el analógico. Pero la diferencia entre estas mediciones es casi siempre la misma. Por ejemplo, en 150 metros tenemos una diferencia de +-1 mt y esta diferencia es constante. En 200 metros la diferencia es de +-2 mts. Pero vamos he de realizar mas pruebas.

La conexión del sensor que he realizado es según el datasheet. Me indicaba que tenia que colocar 2 condensadores de desacople a la entrada de alimentación del sensor 1.0uF y 0.01uF y 1 condensador de filtrado en la salida Vout de 470pF :

http://www.nxp.com/assets/documents/data/en/data-sheets/MPX5700.pdf

PIN 1 Vout= Entrada analógica arduino AN0 de arduino.
PIN 2 GRAUND= GND arduino.
PIN 3 Vcc= Alimentación 5v arduino.

Saludos, y quiero darle las gracias por la ayuda a Surbyte. El me asesoro bien y me recomendó utilizar este sensor.

hola amigos, :slight_smile:
me parece intersante el tema que estan tratando y desde ya les agradezco toda esta informacion ya que soy nuevo en arduino pero desde ya es fascinate.
Una consulta, que sensor me recomiendan para este tanque elevado de 1.10 mt de diametro x 1.43 de altura. Lo instale en la azotea pero es un problema no saber en que nivel esta.
Y funcionaria el mismo codigo o que cambios le haria?
Gracias por su ayuda.

1406434_9.jpg

la presión hidroestatica esta compuesta de varios factores

ph=altura(metros)X densidad del liquido(en Kg/m3)xgravedad(mts/s2)

y se mide en pascales

osease ph=hXDXG

Es cierto y tmb es cierto que la densidad del agua cambia con la temperatura y la gravedad con la altura.
Asumiendo que no vas a mover el tanque de agua a medir, entonces nos quedamos con los cambios de densidad del agua.

Agrego este gráfico que es mas explicito que la tabla