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.