Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos » Arduino y Raspberry Pi
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

27/07/2014 #1


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.
27/07/2014 #2

Avatar de MikeLunatiko

¿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
28/07/2014 #3


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.
28/07/2014 #4

Avatar de MikeLunatiko

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.
28/07/2014 #5


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.
28/07/2014 #6


MikeLunatiko dijo: Ver Mensaje
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 ");
}
28/07/2014 #7

Avatar de MikeLunatiko

wence25 dijo: Ver Mensaje
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.
29/07/2014 #8


MikeLunatiko dijo: Ver Mensaje
¡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);
    
}
30/07/2014 #9

Avatar de MikeLunatiko

En ese caso tienes que tener algo mal en la electrónica, al menos yo no veo cómo puede ocurrir eso con ese código.
30/07/2014 #11


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!!!!!
11/08/2014 #12


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);
}
08/11/2014 #13

Avatar de Meta

Hola:

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


Más ideas para fabricar uno.

Con transistores.

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

Saludo.
12/11/2014 #14

Avatar de Meta

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.


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



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/Ind...os-de-medicion

Saludo.
12/11/2014 #15

Avatar de JoaquinFerrero

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.
12/11/2014 #16

Avatar de Meta

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.
22/11/2014 #17

Avatar de Meta

Hola:

Más enlaces de control de nivel de agua más barato y fácil de montar que he visto.



http://comohacer.eu/como-hacer-un-in...nivel-de-agua/
23/11/2014 #18


Circuito sencillo con transistor
Hola
Aquí un circuito bastante sencillo y económico
solo es dejar volar la imaginación y desarrollar proyectos complejos de algo sencillo
NIVELAGUA2.JPG
23/11/2014 #19

Avatar de Meta

Muy bueno. Solo que este detecta el nivel máximo, con poner más transistores hará el mismo efecto en otras posiciones.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Arduino y Raspberry Pi

Cerrar
Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos » Arduino y Raspberry Pi

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.