Control de nivel de agua

Hola, buenas. Estoy haciendo un proyecto de un nivel de agua con el Arduino y soy 100% nuevo con el Arduino uno, así que os pido que me reviséis el código porque creo que hay algo que va mal.

Mi objetivo es que cuando la entrada 8 se pone a positivo mediante un sensor, que en el lcd imprima "Agua II ", y cuando pongo a positivo el pin 9 salga "Agua I "
Pero al parecer el lcd se me resetea y pasa de agua II a agua I el solo.

Si ven cual es el problema me gustaría que me explicasen como resolverlo.

Este es el código:
Código:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
 
int sensor=8;  //Indicamos el pin al que tenemos conectado el sensor de nivel de liquido
int sensor1=9;      //Indicamos el pin al que tenemos conectado el led que indica alarma
 
void setup()
{   
   lcd.clear (); 
   lcd.setCursor (0, 1); 
   lcd.print("Agua     ");
    
  pinMode(sensor,INPUT);   
  pinMode(sensor1,INPUT); 
  
  
  
 }
 
void loop()
{  
 
   if(digitalRead(sensor1)==HIGH)
    lcd.clear ();
    lcd.setCursor (0, 1);
    lcd.print("Agua I    ");
    
   
    if(digitalRead(sensor)==HIGH)
    lcd.clear ();
    lcd.setCursor (0, 1);
    lcd.print("Agua II   ");
        
}
Gracias.
 
Última edición por un moderador:
¿Qué pasa, al final te rendiste con Basic?

Pues claro que el LCD se te resetea, no haces más que llamar a la función clear(). ¿Qué es lo que hace esa función?

Y no estás usando bien los "if". ¿En 3 días no has podido aprenderlo? Es algo básico de C. Busca un poco, seguro que encuentras tus fallos y respuestas a tus preguntas ;)
 
Bueno la verdad es que lo poco que se de basic y de C lo he aprendido del instituto, el código de basic que tiene mal los if es porque me equivoque y subí unos de mis primeros experimentos y no me fije que era ese el que estaba mal, respecto a lo del tema del programa en C con los clear, los uso por que si no se me ve las letras de derecha a izquierda como locas y aunque he puesto que salga en el lcd en (0,1) siguen moviéndose igual y descubrí que con el clear no lo hacia pero se me limpiaba la lcd constantemente, si me pudieses dar algún consejo te lo agradecería.

Un cordial saludo.
Wenceslao.
 
Si usas la función clear() constantemente crearás efectos en la pantalla no deseado. Ten en cuenta que tu código se está ejecutando miles de veces por segundo, ya que no haces ninguna especie de retardo.

Pero incluso usando retardos, llamar a clear() antes de modificar algo en la pantalla, creará efectos de parpadeo y otros problemas de visualización. Usando solamente setCursor(x,y) y print() es suficiente para modificar el texto de la pantalla.

Pero tienes que tener en cuenta una cosa. Si haces esto:
Código:
lcd.setCursor(0,1);
lcd.print("12345");
Aparecerá en la pantalla el texto "12345". Si después haces esto:
Código:
lcd.setCursor(0,1);
lcd.print("abc");
El '1' se cambiará por la 'a', el '2' por la 'b', y el '3' por la 'c'. Pero el 4 y el 5 obviamente van a seguir ahí. Tienes que tener esto en cuenta y completar los huecos con espacios.
Código:
lcd.setCursor(0,1);
lcd.print("abc  ");
En cuanto al fallo que estás teniendo con los "ifs", cualquier manual básico de C o C++ te sirve para ver el error.

EDITO: Veo que sí estás teniendo en cuenta lo de los espacios. El problema de que las letras "se vean locas" tiene que venir del hecho de que ejecutas el código miles de veces por segundo. Utiliza un retardo.
 
Muchas gracias, he estado corrigiendo eso y he hecho este código:


Código:
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
 
int AGUA1=8;     //Indicamos el pin al que tenemos conectado el sensor de nivel de liquido
int AGUA2=9;    //Indicamos el pin al que tenemos conectado el sensor de nivel de liquido  
int AGUA3=10;   //Indicamos el pin al que tenemos conectado el sensor de nivel de liquido
void setup()
{   
   lcd.clear ();
   lcd.setCursor (0, 1); 
   lcd.print("Agua     ");
}
 
void loop()
{  
  pinMode(AGUA1,INPUT);   
  pinMode(AGUA2,INPUT); 
  pinMode(AGUA3,INPUT);
   
    if(digitalRead(AGUA3)==HIGH);
    lcd.setCursor (0, 1); 
    lcd.print ("AGUA III");
   
    if(digitalRead(AGUA2)==HIGH);
    lcd.setCursor (0, 1); 
    lcd.print ("AGUA II ");
    
   
    if(digitalRead(AGUA1)==HIGH);
    lcd.setCursor (0, 1); 
    lcd.print ("AGUA I  ");
    
    delay(1000);
}
Pero aunque debería de funcionar, no lo hace puesto que en el lcd se ve AGUA I y cuando le aplico 5V a los pines del arduino no cambia a AGUA II NI AGUA III.
 
Última edición por un moderador:
Si usas la función clear() constantemente crearás efectos en la pantalla no deseado. Ten en cuenta que tu código se está ejecutando miles de veces por segundo, ya que no haces ninguna especie de retardo.

Pero incluso usando retardos, llamar a clear() antes de modificar algo en la pantalla, creará efectos de parpadeo y otros problemas de visualización. Usando solamente setCursor(x,y) y print() es suficiente para modificar el texto de la pantalla.

Pero tienes que tener en cuenta una cosa. Si haces esto:
Código:
lcd.setCursor(0,1);
lcd.print("12345");
Aparecerá en la pantalla el texto "12345". Si después haces esto:
Código:
lcd.setCursor(0,1);
lcd.print("abc");
El '1' se cambiará por la 'a', el '2' por la 'b', y el '3' por la 'c'. Pero el 4 y el 5 obviamente van a seguir ahí. Tienes que tener esto en cuenta y completar los huecos con espacios.
Código:
lcd.setCursor(0,1);
lcd.print("abc  ");
En cuanto al fallo que estás teniendo con los "ifs", cualquier manual básico de C o C++ te sirve para ver el error.

EDITO: Veo que sí estás teniendo en cuenta lo de los espacios. El problema de que las letras "se vean locas" tiene que venir del hecho de que ejecutas el código miles de veces por segundo. Utiliza un retardo.



Buenas amigo mi problema con los if es que no les pongo corchetes como asi deberia?

if(digitalRead(AGUA2)==HIGH);
{
lcd.setCursor (0, 1);
lcd.print ("AGUA II ");
}
 
Buenas amigo mi problema con los if es que no les pongo corchetes como asi deberia?
Código:
 if(digitalRead(AGUA2)==HIGH);
    {
    lcd.setCursor (0, 1); 
    lcd.print ("AGUA II ");
    }

¡Exacto! Veo que por fin te diste cuenta. Enhorabuena.
También está bien el delay.
Un detalle: la función pinMode() no tiene mucho sentido ponerla en el loop() [bucle principal del programa], en el 99.9% de los casos debe estar en el setup() [rutina de inicialización y configuración].

Saludos.
 
¡Exacto! Veo que por fin te diste cuenta. Enhorabuena.
También está bien el delay.
Un detalle: la función pinMode() no tiene mucho sentido ponerla en el loop() [bucle principal del programa], en el 99.9% de los casos debe estar en el setup() [rutina de inicialización y configuración].

Saludos.


Jajaja, al final conseguistes que me diese cuenta amigo, pues hice lo que me dijistes de cambiar los pinMode() en el setup() y cargué el programa.
Lo que sucede es que en el LCD aparece Agua III, al cabo de 10 segundos cambia a Agua II y al cabo de otros 10 segundos cambia a Agua I sin que yo haya puesto las entradas a nivel alto para que se cambie el agua.

¿Alguna ayuda?

Te dejo mi código rectificado:
Código:
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
 
int AGUA1 = 8;     //Indicamos el pin al que tenemos conectado el sensor de nivel de liquido
int AGUA2 = 9;    //Indicamos el pin al que tenemos conectado el sensor de nivel de liquido  
int AGUA3 = 10;   //Indicamos el pin al que tenemos conectado el sensor de nivel de liquido
void setup()
{   
   lcd.clear ();
   lcd.setCursor (0, 1); 
   lcd.print("Agua     ");
   
   pinMode(AGUA1,INPUT);   
   pinMode(AGUA2,INPUT); 
   pinMode(AGUA3,INPUT);
}
 
void loop()
{  
 
   
    if(digitalRead(AGUA3)==HIGH);
    {
    lcd.setCursor (0, 1); 
    lcd.print ("AGUA III");
    }
    delay(100);
    
    if(digitalRead(AGUA2)==HIGH);
    {
    lcd.setCursor (0, 1); 
    lcd.print ("AGUA II ");
    }
    delay(100);
   
    if(digitalRead(AGUA1)==HIGH);
    {
    lcd.setCursor (0, 1); 
    lcd.print ("AGUA I  ");
    }
    delay(100);
    
}
 
Última edición por un moderador:
Hola:

Para coger ideas.

También con ultrasonido.
http://forum.arduino.cc/index.php?topic=78566.0

Otro vídeo.

Fuente:
http://tallerarduino.com/2012/10/26/sensor-de-nivel-de-liquido-y-arduino-o-pinguino-pic/

Aquí hce tiempo di ideas.
https://www.forosdeelectronica.com/...o-tanque-sensor-ultrasonico-73387/#post641158

http://proyectosgeek.blogspot.com.es/2013/06/monitor-de-nivel-de-agua-con-arduino-y.html

application.png


http://arduino-bolivia.blogspot.com.es/p/control-de-nivel-de-agua-con.html

Hay muchísimos ejemplos.

Saludo.
 
Por fin lo conseguí, el problema era el punto y coma al final de la linea de if

if(digitalRead(AGUA3)==HIGH);
{
lcd.setCursor (0, 1);
lcd.print ("AGUA III");
}
delay(100);


Muchas gracias a todos y gracias a Mike por la ayuda!!!!!
 
Si tienes 3 sensores de nivel, no tiene sentido que tu programa te muestre
Agua I
delay(100)
Agua II
delay(100)
Agua III

Lo lógico es que te muestre el sensor correspondiente cuando es alcanzado y no los que están por debajo.
entre 0 y S1 (sensor 1) debe decir 0
entre S1 y S2 debe decir Agua I
entre S2 y S3 debe decir Agua II
mayor que S3 debe decir Agua III

Eso lo logras de este modo:

Código:
void loop()
{  
    bool agua1 = digitalRead(AGUA1);
    bool agua2 = digitalRead(AGUA2);
    bool agua3 = digitalRead(AGUA3);


    lcd.setCursor(0,1);
    
    if (!agua1 && !agua2 && !agua3)  { // No alcanzó S1
       lcd.print ("< AGUA I");
    }
    if (agua1 && !agua2 && !agua3)   { // S1 en 1 los demas en 0
       lcd.print ("AGUA I");
    }
    if (agua1 && agua2 && !agua3)   { // S1 y S2 en 1 S3 en 0
       lcd.print ("AGUA II");
    }
    if (agua1 && agua2 && agua3)   { // todos en 1
       lcd.print ("AGUA III");
    }
    delay(100);
}
 
Última edición por un moderador:
Hola:

Viendo este sensor de agua a 36,60 €, me parece carísimo. Me pregunto como será por dentro par meterle la copiada.

ArtM167N_1000x750.png

Más ideas para fabricar uno.

Con transistores.

Si encuentran más información útil, es bueno publicarlo aquí.

Saludo.
 
Hola:

Si alguien tiene el medidor de agua comprado. Quiero que sea tan amagle y valiente sin miedo a desarmarlo para ver que electrónica usa, más bien los nombres de los componentes. 36 € es algo muy caro para lo que es.

M167N_animation.gif

Aquí por 33,90 €, sigue siendo caro.

Tonne_ganz.jpg


Parece que solo funciona con transistores y condendasoroes que hace de interruptor, con solo conectar la base al agua. El otro Led que hace detectar si la batería está Ok, no se como lo hicieron.

http://www.tiendafotovoltaica.es/Indicador-Nivel-de-Depositos-de-agua-aljibes-10-Puntos-de-medicion

Saludo.
 
Para saber si una cosa es cara o no, tienes que medir cuánto tiempo necesitas para hacerlo tu mismo.

Por ejemplo: si tengo los componentes para realizar ese montaje, quizás tarde una hora en preparar el diseño, hacer la placa, soldar y probar el montaje.

¿Cuánto vale una hora de mi TIEMPO? Yo suelo facturar mis horas a 50 €. El precio de los componentes va aparte, por supuesto.

Entonces, tenemos que he invertido una hora de mi tiempo en la que he dejado de ganar 50 €, por ahorrar 36 € en la compra del producto.

Mal negocio: pierdo 14 €. Y gano la posibilidad de que mi montaje no funcione bien.

En otro caso, si tu hora de trabajo está valorada en 36 €/hora (o menos), entonces si consigues realizar el proyecto en una hora (o menos), habrás ahorrado dinero.
 
Hola:

Si es para un punto de empresa si, ejjejeje. En España cobrar por algo por 50 € te mandan a la calle , así de simple, hasta los extranjeros.

Ahora con un CD4017 más fácil aún y requiere menos tiempo que solo transistores, resistencias y condensadores para no estar todo el santo día soldando. Ya que a veces tengo tiempo libre, prefiero hacerlo yo mismo, y confiar de que funcione bien haciendo todo tipo de pruebas. Si dudo, me pasará como a ti, no lo hago.

Más vídeos como curiosidad con el CD4017.

Si es para clientes, entonces me callo. Eso si, si lo hago yo mismo me ahorro dinero que me puede hacer falta para otras cosas, como no tengo empleo, me animo hacerlo yo, proque si compro, compro y compro, engordo al empresario y yo mirando. Más bien es para los que tengan empleo en estos momentos duros. :)

Saludos.
 
Última edición:
Buenos días, quisiera ver si alguien me puede ayudar (soy novato con arduino) tengo dos tanques de agua en la misma propiedad y la bomba de agua en el medio del terreno, me es imposible realizar el cableado hacia los tanques, por lo cual pensaba si se puede activar o desactivar la bomba de agua de acuerdo a los niveles establecidos utilizando sensores ultrasónicos; en forma remota o sea utilizando un nodemcu en cada tanque como esclavos y un maestro en donde está la bomba de agua.Tengo muy buena señal de wifi.
 
Atrás
Arriba