Go Down

Topic: leer el boton  (Read 156 times) previous topic - next topic

Nicovitale

Hola, buenos días!

necesito resolver un tema medio raro... les cuento, tengo un pequeño problema con unas lineas de código en las que tengo una funcion que me lee el estado de un boton, y cuando esta distinto a HIGH activa una bomba de agua, el boton es un sensor de nivel de agua(un flotante)... el problema es que necesito que cuando lea distinto de HIGH active la bomba de agua pero solo una vez, hasta que vuelva a pasar a HIGH y vuelva a estar distinto de HIGH... debido a que sino cuando la bomba de agua no tenga agua se va a quemar por prenderse tantas veces....

Code: [Select]
  if (digitalRead(BOTON_2)!=HIGH) {
    Serial.println("Flotante activado");
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Flotante");
    digitalWrite(CARGA, LOW);
    delay(12000);
    pantalla_principal();
  }



desde ya muchas gracias!

angelxulo

Hola @Nicovitale, antes que nada decirte que lo mejor seria que publiques el código entero ya que el error puede estar en otro lugar.

Segun veo...

Code: [Select]
if (digitalRead(BOTON_2)!=HIGH) {
 
Preguntas si "BOTON_2" esta al contrario de HIGH, cuando lo mas normal seria simplemente comprobar si esta en "LOW" como tu pides...

Code: [Select]
if (digitalRead(BOTON_2) == LOW) {

Sigamos, por lo que veo utilizas un LCD, al cual le dices que cuando detecte "LOW" escriba "Flotante" en una determinada posicion, hasta ahi todo bien.
De repente veo esto:

Code: [Select]
digitalWrite(CARGA, LOW);

Le pides que cuando se cumpla lo anterior, cambie el pin "CARGA" a LOW, es raro ya que si algún día falla alguna conexión o el Arduino, se quedaría activado tu motor. Pero bueno supongamos que utilizas  ese método por alguna razon importante...

Si seguimos no veo nada mas que un simple "delay", ahora me pregunto yo... ¿Cuando le has dicho al programa que pare el motor? Nunca manda un HIGH al pin de "CARGA".
Simplemente añade esto al final:

Code: [Select]
else {
            digitalWrite(CARGA, HIGH);
        }


Quedando el codigo final asi:

Code: [Select]
  if (digitalRead(BOTON_2) == LOW) {
    Serial.println("Flotante activado");
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Flotante");
    digitalWrite(CARGA, LOW);
    delay(12000);
    pantalla_principal();
  } else {
    digitalWrite(CARGA, HIGH);
    }

Nicovitale

Hola, muchas gracias por la ayuda, ya pude resolverlo, el problema venia por otro lado pero era medio complicado de explicar, muchas gracias!

surbyte

Intenta no leer estados de botones o contactos y luego usar cosas como esta

Code: [Select]
delay(12000);

o peores!!


Con eso digo que cuando el código alcanza el delay() se detiene y no hace nada.

Imagina que uses un delay de 15 min y tu contacto detecta, tanque lleno y por 15 min no hace nada porque debe esperar 15 min para apagarla.

He ahi un ejemplo de lo desastrozo que puede ser delay() en un código.

Kike_GL

#4
Sep 22, 2019, 06:57 pm Last Edit: Sep 22, 2019, 06:58 pm by Kike_GL
Tu sensor de nivel esta en el tanque de agua antes o después de la bomba ?

Imaginemos que quieres transferir agua del tanque A al tanque B. Tiene que tener 2 sensores de nivel, es decir preguntar si el tanque B no tiene agua pero el tanque A si la tiene entonces arranca la bomba.

Code: [Select]

const byte A = 2;
const byte B = 3;
const byte bomba = 13;
bool tanqueA,tanqueB;

void setup(){
   pinMode(A, INPUT_PULLUP);
   pinMode(B, INPUT_PULLUP);
   pinMode(bomba, OUTPUT);
}

void loop(){
   tanqueA = digitalRead(A);    //LOW = Hay agua en tanque A
   tanqueB = digitalRead(B);    //HIGH = No hay agua en tanque B
   if (!tanqueA && tanqueB){
      digitalWrite(bomba, HIGH);  //Prende bomba
   }else{
      digitalWrite(bomba, LOW);   //Apaga bomba
   }
}
Saludos, Kike_GL

Go Up