martes, 18 de junio de 2013

Monitor de nivel de agua con Arduino y ultrasonido

Construcción de un monitor de nivel de agua con Arduino Uno R3.

Está pensado para usarse con alimentación 220v y comunicación por red cableada.
Toma una medición cada 10 minutos y muestra una gráfica usando las últimas 10 mediciones que puede accederse via web.
Fue pedido por el servicio de agua potable de Zapala (Neuquen) para controlar el nivel en uno de su tanques.
Nos basamos en un sensor de distancia ultrasónico capáz de medir la distancia entre 4cm y 4m.

Componentes
  • Arduino uno rev 3 
  • Ethernet shield 
  • Sensor ultrasonico URM37 V3.2 
  • Caja estanco pequeña 
  • Pasacable 
  • Cable Ethernet 
  • Fuente 5V 
Herramientas
  • Taladro 
  • Mecha con diametro similar a cable Ethernet 
  • Pistola eléctrica de barra de silicona 

















Montaje de prueba

Código fuente:
 #include <SoftwareSerial.h>  
 #include <URMSerial.h>  
 #include <SPI.h>  
 #include <Ethernet.h>  
 byte mac[] = {   
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };  
 IPAddress ip(192,168,69,1); //Ip Fija. Modificala segun tu red 
 EthernetServer server(80);  
 URMSerial urm;   
 #define DISTANCE 1   
 #define TEMPERATURE 2   
 #define ERROR 3   
 #define NOTREADY 4   
 void setup() {  
  Serial.begin(9600);  
  urm.begin(2,3,9600);  
   while (!Serial) {  
   ;  
  }  
  Ethernet.begin(mac, ip);  
  server.begin();  
  Serial.print("server is at ");  
  Serial.println(Ethernet.localIP());  
 }  
 int tacometro;  
 int distancia[10];  
 int dvalue;  
 void loop() {  
  delay(100);  
  tacometro++;  
  if (tacometro>=60000){ //60000 vueltas de 100ms, sería cada 10 minutos
   urm.requestMeasurementOrTimeout(DISTANCE, dvalue);  
   dvalue=400-dvalue;  //400 representa un tanque de 4 metros altura desde el fondo hasta el sensor.
   for (int i=1; i<10; i++){  
   distancia[i-1]=distancia[i];  
   }  
   distancia[9]=dvalue;  
   tacometro = 0;  
  }  
  EthernetClient client = server.available();  
  if (client) {  
   Serial.println("new client");  
   boolean currentLineIsBlank = true;  
   while (client.connected()) {  
    if (client.available()) {  
     char c = client.read();  
     Serial.write(c);  
     if (c == '\n' && currentLineIsBlank) {  
      client.println("HTTP/1.1 200 OK");  
      client.println("Content-Type: text/html");  
      client.println("Connection: close");  
       client.println("Refresh: 60");  
      client.println();  
      client.println("<!DOCTYPE HTML>");  
      client.println("<html>");  
      client.println("<head>");  
      client.println("<script type=\"text/javascript\" src=\"https://www.google.com/jsapi\"></script>");  
      client.println("<script type=\"text/javascript\">");  
      client.println("google.load(\"visualization\", \"1\", {packages:[\"corechart\"]});");  
      client.println("google.setOnLoadCallback(drawChart);");  
      client.println("function drawChart() {");  
      client.println("var data = google.visualization.arrayToDataTable([");  
      client.println("['Tiempo', 'Nivel de Agua en cm '],");  
      client.println("['0', "+String(distancia[0])+"],");  
      client.println("['10', "+String(distancia[1])+"],");  
      client.println("['20', "+String(distancia[2])+"],");  
      client.println("['30', "+String(distancia[3])+"],");  
      client.println("['40', "+String(distancia[4])+"],");  
      client.println("['50', "+String(distancia[5])+"],");  
      client.println("['60', "+String(distancia[6])+"],");  
      client.println("['70', "+String(distancia[7])+"],");  
      client.println("['80', "+String(distancia[8])+"],");  
      client.println("['90', "+String(distancia[9])+"]");  
      client.println("]);");  
      client.println("var options = {");  
      client.println("title: 'Grafico de nivel',");  
      client.println("hAxis: {title: 'Tiempo en minutos', titleTextStyle: {color: 'red'}}");  
      client.println("};");  
      client.println("var chart = new google.visualization.AreaChart(document.getElementById('chart_div'));");  
      client.println("chart.draw(data, options);");  
      client.println("}");  
      client.println("</script>");  
      client.println("</head>");  
      client.println("<body>");  
      client.println("<H1 style='margin-bottom: 0px;margin-top: 0px;'>Sistema de Monitoreo Ultrasonico Remoto</H1>");  
      client.println("<div id=\"chart_div\" style=\"width: 900px; height: 500px;\"></div>");  
      client.println("<H2>Medicion actual</H2>");  
      client.println("Valor de nivel :");  
      client.println(dvalue);  
      client.println("<br/>");  
      client.println("<hr/>");  
      client.println("Desarrollado por COTESMA  - www.cotesma.com.ar");  
      client.println("</body>");  
      client.println("</html>");  
      break;  
     }  
     if (c == '\n') {  
      currentLineIsBlank = true;  
     }   
     else if (c != '\r') {  
      currentLineIsBlank = false;  
     }  
    }  
   }  
   delay(1);  
   client.stop();  
   Serial.println("client disonnected");  
  }  
 }  


El monitor se instaló dentro del tanque. Un metro por debajo de la puerta de acceso que se ve de color óxido al borde de la cúpula.

Monitor instalado dentro del tanque.

15 comentarios:

  1. Respuestas
    1. Saludos, yo he realizado purebas de concepto, aun no he realizado el montaje definitivo y me ha servido perfectamente ese sensor

      Eliminar
  2. Saludos, Quisiera saber que proteccion le pusiste al sensor ultrasonico para que la humedad y la condensacion del ambiente dentro del tanque no dañe el sensor?

    ResponderEliminar
  3. -quisiera saber si aun funciona el sistema, si ha tenido alguna insidencia, cada cuanto has tenido que cambiar el sensor.

    ResponderEliminar
  4. me hago la misma pregunta, estoy implementando algo similar

    ResponderEliminar
  5. Si... todavía funciona. Recientemente cambiamos la programación para que envíe datos a ThingSpeek, proximamente lo colocaremos dentro del tanque nuevamente... https://thingspeak.com/channels/143846
    En cuanto al sensor, no tiene ninguna protección y ha funcionado continuamente durante 3 años.

    https://thingspeak.com/channels/143846

    ResponderEliminar
  6. Consulta, entre el UMR37 y el HC SR04 cual te parece mejor?. Saludos.

    ResponderEliminar
  7. Hola amigo, es un proyecto muy interesante, donde puedo descargar las librerías de este? Agradezco tu apoyo. Saludos desde Mexico.

    ResponderEliminar
  8. Muy buen proyecto!! Gracias por compartir

    ResponderEliminar
  9. Gracias por compartir. Estoy implementando algo similar para las cisternas de mi casa.

    ResponderEliminar
  10. Buenas tardes, mi pregunta es por la durabilidad del sensor de ultrasonidos por la propia corrosión que produce el agua... ¿Cómo lo proteges?.

    Gracias.

    ResponderEliminar
  11. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  12. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  13. Muchas gracias x la respuesta, no la vi antes!, saludos

    ResponderEliminar