This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

A cookie will be stored in your browser regardless of choice to prevent you being asked this question again. You will be able to change your cookie settings at any time using the link in the footer.

  • 1 voto(s) - 2 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Contador de créditos
#1
Hola buenas, soy nuevo en este foro y en el mundillo del arduino ... tengo un problema ... tengo un contador de creditos (como si fuese un contador normal olvidense de los creditos xD) cuando le doy a un switch la cuenta aumenta a 4 cada vez que le de (por ahora hasta 8 porque nose poner otro display para que funcione ... ._.) después hay otro pulsador que "gasta creditos" (baja de 1 en 1 cada vez que le das) cuando llega a 0 un relé se activa abriendo un circuito para que no funcione sin meterle mas creditos. Ahora el problema .... necesito desbloquear y bloquear ese pulsador de "gastar creditos" con otro pulsador como lo haria? e pensado en usar un relé pero no tengo ni idea de como hacerlo ni código ni nada ...

Muchas gracias de antemano Mola
  Responder
#2
A ver si he entendido... quieres "deshabilitar" un pulsador cuando se aprieta otro? o quieres que se deshabilite al quedarte sin créditos?

A nivel de programación ambas opciones son muy simples, únicamente tienes que tener unos contadores (o variable booleana si es el primer caso), y en función del valor que tengan, ignorar la pulsación o no.
  Responder
#3
WeSo escribió:A ver si he entendido... quieres "deshabilitar" un pulsador cuando se aprieta otro? o quieres que se deshabilite al quedarte sin créditos?

A nivel de programación ambas opciones son muy simples, únicamente tienes que tener unos contadores (o variable booleana si es el primer caso), y en función del valor que tengan, ignorar la pulsación o no.

Quiero deshabilitar y habilitar un pulsador pulsando otro simples claro que puede ser para alguien que sabe pero yo ... XD fuera de automatismos industriales no se nada Facepalm
  Responder
#4
Has hecho algo de lecturas digitales con Arduino? Te podría poner un código sin probar, pero creo que lo mejor de Arduino es hacerlo uno mismo para aprender Lengua
La idea es la siguiente en pseudocodigo:
Código:
estadoAnteriorPulsador = abierto
deshabilitado = falso
bucle principal
    estado = leerPulsadorDeshabilitar
    si estado != estadoAnteriorPulsador && estado = cerrado // hay pulsación
        deshabilitado = !deshabilitado // Habilitados o deshabilitamos en cada pulsación
    estadoAnteriorPulsador = estado

    si deshabilitado
        ignoramos pulsacionCreditos
    no deshabilitado
        operamos pulsacionCreditos

Más o menos sería algo así, simplemente tener en cuenta las pulsaciones, que sólo te cuente la primera (por si dejas el pulsador apretado), y en función del booleano "deshabilitado", pues ignoras las pulsaciones del botón de créditos o no.

Lo suyo sería hacerlo con interrupciones y tal, pero bueno, con arduino se suele hacer más "a lo bruto" :elrisas:
  Responder
#5
Tendria que indicar un pin de entrada y un pin de salida para ese pulsador no? si le pongo una función antirebote evitaria el problema de mantener pulsado y que se vuelva loco no? xD (otra cosa que no viene a cuento ... WeSo ... me encanta tu prusa pronto me pillaré la mia a ver si hay suerte jajaja estoy trabajando en un taller enfrente de Createc3D y cada vez que paso al lado babeo xD)
  Responder
#6
Pin de entrada para cada uno de los pulsadores... y de salida si quieres que éstos hagan alguna acción.

Para evitar rebotes puedes hacerlo por software o por hardware. En el primer caso suele bastar con poner un delay de unos milisegundos al detectar una pulsación, para que ignore dichos rebotes; en el segundo caso, el compañero @Jorge diseñó unas plaquitas pequeñas con el pulsador y su sistema antirebotes.

Mi prusa no es de las más bonitas del foro, pero sí que estoy orgulloso de la calidad que me saca Sonrisa Ten cuidado que ésto es un vicio!!
  Responder
#7
Menudo lio a ver ... te pongo el codigo que estoy usando (ya algunas cosas son chapuceras como la salida 11 para un relé xD en codigo esta copiado con unas modificaciones que necesitaba.

Código:
/* se declaran las contantes para identificar cada led*/
const int r = 11;
const int a = 2;
const int b = 3;
const int c = 4;
const int d = 5;
const int e = 6;
const int f = 7;
const int g = 8;
const int BtnIncremento = 9; // boton de incremento conectadoa al pin 9
const int BtnDecremento = 10; // boton de decremento conectadoa al pin 10

const int tiempoAntirebote =10;
int cuenta =0;    //lleva la cuenta
int estadoBtnIncremento;
int estadoBtnIncrementoAnterior;
int estadoBtnDecremento;
int estadoBtnDecrementoAnterior;

boolean antirebote  (int pin ) {
  int  contador =0;
  boolean estado;               // guarda el estado del boton
  boolean estadoAnterior;      // guarda el ultimo estado del boton

  do {  
    estado = digitalRead (pin);
    if (estado != estadoAnterior ){   // comparamos el estado actual
      contador =0;                    // reiniciamos el contador
      estadoAnterior= estado;
    }
    else{
      contador = contador +1;          // aumentamos el contador en 1
    }
    delay (1);
  }
  while (contador < tiempoAntirebote);
  return estado;
}
/* Metodo para elegir que numero mostrar en el display*/
void actualizarNumero(){
  switch (cuenta) {
  case 0:
    /*Bloque para mostrar un 0*/
    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);
    digitalWrite(f, HIGH);
    digitalWrite(g, LOW);
    digitalWrite(r, HIGH);
    break;
  case 1:
    /*Bloque para mostrar un 1*/
    digitalWrite(a, LOW);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);
    digitalWrite(r, LOW);
    break;
  case 2:
    /*Bloque para mostrar un 2*/
    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH);
    digitalWrite(c, LOW);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);
    digitalWrite(f, LOW);
    digitalWrite(g, HIGH);
    digitalWrite(r, LOW);
    break;
  case 3:
    /*Bloque para mostrar un 3*/
    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, HIGH);
    digitalWrite(r, LOW);
    break;
  case 4:
    /*Bloque para mostrar un 4*/
    digitalWrite(a, LOW);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    digitalWrite(r, LOW);
    break;
  case 5:
    /*Bloque para mostrar un 5*/
    digitalWrite(a, HIGH);
    digitalWrite(b, LOW);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, LOW);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    digitalWrite(r, LOW);
    break;
  case 6:
    /*Bloque para mostrar un 6*/
    digitalWrite(a, HIGH);
    digitalWrite(b, LOW);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    digitalWrite(r, LOW);
    break;
  case 7:
    /*Bloque para mostrar un 7*/
    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);
    digitalWrite(r, LOW);
    break;
  case 8:
    /*Bloque para mostrar un 8*/
    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    digitalWrite(r, LOW);
    break;
  case 9:
    /*Bloque para mostrar un 9*/
    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, LOW);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    digitalWrite(r, LOW);

  }
}

void setup(){
  /*Declaramos los segmetos del display como salidas*/
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);
  pinMode(r, OUTPUT);
  /*Declaramos los botones como entradas*/
  pinMode(BtnIncremento, INPUT);
  pinMode(BtnDecremento, INPUT);

}

void loop() {
  estadoBtnIncremento = digitalRead(BtnIncremento);
  if (estadoBtnIncremento  != estadoBtnIncrementoAnterior) {     // si hay cambio con respeto al estado
    if (antirebote (BtnIncremento)){            //checamos  si esta preionado y si lo esta
      cuenta = cuenta + 4;                                       //aumentamos la cuenta
      if (cuenta > 9){                        
        cuenta = 9;
      }
    }
  }
  estadoBtnIncrementoAnterior = estadoBtnIncremento;              // guardamos el estado del boton

  estadoBtnDecremento = digitalRead(BtnDecremento);        //leemos el estado del boton
  if (estadoBtnDecremento  != estadoBtnDecrementoAnterior) {     // si hay cambio con respeto al estado anterior
    if (antirebote (BtnDecremento)){    //si el boton esta presionado disminuimos la cuenta
      cuenta--;                              
      if (cuenta<0){

        cuenta = 0;
      }
    }
  }
  estadoBtnDecrementoAnterior = estadoBtnDecremento;  //guardamos el estado del boton

  actualizarNumero();    //desplegamos la cuenta en el display
}

Como lo harias? estoy perdido hasta tanto no llego x.x me quedan libres los pines 12 y 13.
  Responder
#8
Es similar la idea a lo que yo te puse Confundidois1: Utiliza una función antirebote con un bucle de X loops con un delay de 1ms, en lugar de poner directamente un delay mayor. Y luego en el loop pues lo mismo, comprueba los botones y modifica los estados. Lo que te falta añadir sería lo de deshabilitar el botón de decrementar (entendí que es ese) con un tercer pulsador.

Sería algo así, reutilizando tu código y estructura (utilizando el pin 12):
Código:
/* se declaran las contantes para identificar cada led*/
    const int r = 11;
    const int a = 2;
    const int b = 3;
    const int c = 4;
    const int d = 5;
    const int e = 6;
    const int f = 7;
    const int g = 8;
    const int BtnIncremento = 9; // boton de incremento conectadoa al pin 9
    const int BtnDecremento = 10; // boton de decremento conectadoa al pin 10
    const int BtnBloqueo = 12; // boton de bloqueo conectado al pin 12

    const int tiempoAntirebote =10;
    int cuenta =0;   //lleva la cuenta
    int estadoBtnIncremento;
    int estadoBtnIncrementoAnterior;
    int estadoBtnDecremento;
    int estadoBtnDecrementoAnterior;
    int estadoBtnBloqueo;
    int estadoBtnBloqueoAnterior;    
    boolean bloqueo = false; // De inicio está desbloqueado, también se podría hacer con el estado

    boolean antirebote  (int pin ) {
      int  contador =0;
      boolean estado;               // guarda el estado del boton
      boolean estadoAnterior;      // guarda el ultimo estado del boton

      do {
        estado = digitalRead (pin);
        if (estado != estadoAnterior ){   // comparamos el estado actual
          contador =0;                    // reiniciamos el contador
          estadoAnterior= estado;
        }
        else{
          contador = contador +1;          // aumentamos el contador en 1
        }
        delay (1);
      }
      while (contador < tiempoAntirebote);
      return estado;
    }
    /* Metodo para elegir que numero mostrar en el display*/
    void actualizarNumero(){
      switch (cuenta) {
      case 0:
        /*Bloque para mostrar un 0*/
        digitalWrite(a, HIGH);
        digitalWrite(b, HIGH);
        digitalWrite(c, HIGH);
        digitalWrite(d, HIGH);
        digitalWrite(e, HIGH);
        digitalWrite(f, HIGH);
        digitalWrite(g, LOW);
        digitalWrite(r, HIGH);
        break;
      case 1:
        /*Bloque para mostrar un 1*/
        digitalWrite(a, LOW);
        digitalWrite(b, HIGH);
        digitalWrite(c, HIGH);
        digitalWrite(d, LOW);
        digitalWrite(e, LOW);
        digitalWrite(f, LOW);
        digitalWrite(g, LOW);
        digitalWrite(r, LOW);
        break;
      case 2:
        /*Bloque para mostrar un 2*/
        digitalWrite(a, HIGH);
        digitalWrite(b, HIGH);
        digitalWrite(c, LOW);
        digitalWrite(d, HIGH);
        digitalWrite(e, HIGH);
        digitalWrite(f, LOW);
        digitalWrite(g, HIGH);
        digitalWrite(r, LOW);
        break;
      case 3:
        /*Bloque para mostrar un 3*/
        digitalWrite(a, HIGH);
        digitalWrite(b, HIGH);
        digitalWrite(c, HIGH);
        digitalWrite(d, HIGH);
        digitalWrite(e, LOW);
        digitalWrite(f, LOW);
        digitalWrite(g, HIGH);
        digitalWrite(r, LOW);
        break;
      case 4:
        /*Bloque para mostrar un 4*/
        digitalWrite(a, LOW);
        digitalWrite(b, HIGH);
        digitalWrite(c, HIGH);
        digitalWrite(d, LOW);
        digitalWrite(e, LOW);
        digitalWrite(f, HIGH);
        digitalWrite(g, HIGH);
        digitalWrite(r, LOW);
        break;
      case 5:
        /*Bloque para mostrar un 5*/
        digitalWrite(a, HIGH);
        digitalWrite(b, LOW);
        digitalWrite(c, HIGH);
        digitalWrite(d, HIGH);
        digitalWrite(e, LOW);
        digitalWrite(f, HIGH);
        digitalWrite(g, HIGH);
        digitalWrite(r, LOW);
        break;
      case 6:
        /*Bloque para mostrar un 6*/
        digitalWrite(a, HIGH);
        digitalWrite(b, LOW);
        digitalWrite(c, HIGH);
        digitalWrite(d, HIGH);
        digitalWrite(e, HIGH);
        digitalWrite(f, HIGH);
        digitalWrite(g, HIGH);
        digitalWrite(r, LOW);
        break;
      case 7:
        /*Bloque para mostrar un 7*/
        digitalWrite(a, HIGH);
        digitalWrite(b, HIGH);
        digitalWrite(c, HIGH);
        digitalWrite(d, LOW);
        digitalWrite(e, LOW);
        digitalWrite(f, LOW);
        digitalWrite(g, LOW);
        digitalWrite(r, LOW);
        break;
      case 8:
        /*Bloque para mostrar un 8*/
        digitalWrite(a, HIGH);
        digitalWrite(b, HIGH);
        digitalWrite(c, HIGH);
        digitalWrite(d, HIGH);
        digitalWrite(e, HIGH);
        digitalWrite(f, HIGH);
        digitalWrite(g, HIGH);
        digitalWrite(r, LOW);
        break;
      case 9:
        /*Bloque para mostrar un 9*/
        digitalWrite(a, HIGH);
        digitalWrite(b, HIGH);
        digitalWrite(c, HIGH);
        digitalWrite(d, HIGH);
        digitalWrite(e, LOW);
        digitalWrite(f, HIGH);
        digitalWrite(g, HIGH);
        digitalWrite(r, LOW);

      }
    }

    void setup(){
      /*Declaramos los segmetos del display como salidas*/
      pinMode(a, OUTPUT);
      pinMode(b, OUTPUT);
      pinMode(c, OUTPUT);
      pinMode(d, OUTPUT);
      pinMode(e, OUTPUT);
      pinMode(f, OUTPUT);
      pinMode(g, OUTPUT);
      pinMode(r, OUTPUT);
      /*Declaramos los botones como entradas*/
      pinMode(BtnIncremento, INPUT);
      pinMode(BtnDecremento, INPUT);
      pinMode(BtnBloqueo, INPUT);
    }

    void loop() {
      estadoBtnBloqueo = digitalRead(BtnBloqueo);
      if (estadoBtnBloqueo  != estadoBtnBloqueoAnterior) {     // si hay cambio con respeto al estado
        if (antirebote (BtnBloqueo)){         //checamos  si esta preionado y si lo esta
          bloqueo = !bloqueo;
        }
      }
      estadoBtnIncrementoAnterior = estadoBtnIncremento;              // guardamos el estado del boton

      estadoBtnIncremento = digitalRead(BtnIncremento);
      if (estadoBtnIncremento  != estadoBtnIncrementoAnterior) {     // si hay cambio con respeto al estado
        if (antirebote (BtnIncremento)){         //checamos  si esta preionado y si lo esta
          cuenta = cuenta + 4;                                       //aumentamos la cuenta
          if (cuenta > 9){                  
            cuenta = 9;
          }
        }
      }
      estadoBtnIncrementoAnterior = estadoBtnIncremento;              // guardamos el estado del boton

      if (!bloqueo) { // Si está bloqueado, lo ignoramos, y en otro caso, lo leemos
          estadoBtnDecremento = digitalRead(BtnDecremento);      //leemos el estado del boton
          if (estadoBtnDecremento  != estadoBtnDecrementoAnterior) {     // si hay cambio con respeto al estado anterior
            if (antirebote (BtnDecremento)){   //si el boton esta presionado disminuimos la cuenta
              cuenta--;                            
              if (cuenta<0){

                cuenta = 0;
              }
            }
          }
          estadoBtnDecrementoAnterior = estadoBtnDecremento;  //guardamos el estado del boton
      }

      actualizarNumero();   //desplegamos la cuenta en el display
    }

Por otro lado, con un integrado podrías ahorrarte utilizar 8 pines para manejar el 7 segementos. Por ejemplo con el CD4511, únicamente necesitarías 4 salidas. Pero vamos, ésto ya es algo opcional y como dato por si necesitas pines.
  Responder
#9
Voy a probar a ver si consigo hacerlo yo XD en ese código que me has pasado ya esta todo incluido? solo tendria que poner el pulsado en el pin 12?
  Responder
#10
Ese código si pones el pulsador al pin 12, cada vez que lo pulses, habilitará o deshabilitará el pulsador de decremento. No lo he probado, pero la teoría es esa xDD He comentado las lineas que he añadido, que son pocas y no tiene complicación Lengua
  Responder
#11
Pues no va ._. o soy yo (que no seria raro xD) meti por un lado del pulsador 5 v y la salida del pulsador al pin 12
  Responder
#12
Qué malo soy para ésto del copy&paste :elrisas:

Prueba ésto, que no cambié el nombre de un par de variables :roto2:
Código:
/* se declaran las contantes para identificar cada led*/
        const int r = 11;
        const int a = 2;
        const int b = 3;
        const int c = 4;
        const int d = 5;
        const int e = 6;
        const int f = 7;
        const int g = 8;
        const int BtnIncremento = 9; // boton de incremento conectadoa al pin 9
        const int BtnDecremento = 10; // boton de decremento conectadoa al pin 10
        const int BtnBloqueo = 12; // boton de bloqueo conectado al pin 12

        const int tiempoAntirebote =10;
        int cuenta =0;   //lleva la cuenta
        int estadoBtnIncremento;
        int estadoBtnIncrementoAnterior;
        int estadoBtnDecremento;
        int estadoBtnDecrementoAnterior;
        int estadoBtnBloqueo;
        int estadoBtnBloqueoAnterior;  
        boolean bloqueo = false; // De inicio está desbloqueado, también se podría hacer con el estado

        boolean antirebote  (int pin ) {
          int  contador =0;
          boolean estado;               // guarda el estado del boton
          boolean estadoAnterior;      // guarda el ultimo estado del boton

          do {
            estado = digitalRead (pin);
            if (estado != estadoAnterior ){   // comparamos el estado actual
              contador =0;                    // reiniciamos el contador
              estadoAnterior= estado;
            }
            else{
              contador = contador +1;          // aumentamos el contador en 1
            }
            delay (1);
          }
          while (contador < tiempoAntirebote);
          return estado;
        }
        /* Metodo para elegir que numero mostrar en el display*/
        void actualizarNumero(){
          switch (cuenta) {
          case 0:
            /*Bloque para mostrar un 0*/
            digitalWrite(a, HIGH);
            digitalWrite(b, HIGH);
            digitalWrite(c, HIGH);
            digitalWrite(d, HIGH);
            digitalWrite(e, HIGH);
            digitalWrite(f, HIGH);
            digitalWrite(g, LOW);
            digitalWrite(r, HIGH);
            break;
          case 1:
            /*Bloque para mostrar un 1*/
            digitalWrite(a, LOW);
            digitalWrite(b, HIGH);
            digitalWrite(c, HIGH);
            digitalWrite(d, LOW);
            digitalWrite(e, LOW);
            digitalWrite(f, LOW);
            digitalWrite(g, LOW);
            digitalWrite(r, LOW);
            break;
          case 2:
            /*Bloque para mostrar un 2*/
            digitalWrite(a, HIGH);
            digitalWrite(b, HIGH);
            digitalWrite(c, LOW);
            digitalWrite(d, HIGH);
            digitalWrite(e, HIGH);
            digitalWrite(f, LOW);
            digitalWrite(g, HIGH);
            digitalWrite(r, LOW);
            break;
          case 3:
            /*Bloque para mostrar un 3*/
            digitalWrite(a, HIGH);
            digitalWrite(b, HIGH);
            digitalWrite(c, HIGH);
            digitalWrite(d, HIGH);
            digitalWrite(e, LOW);
            digitalWrite(f, LOW);
            digitalWrite(g, HIGH);
            digitalWrite(r, LOW);
            break;
          case 4:
            /*Bloque para mostrar un 4*/
            digitalWrite(a, LOW);
            digitalWrite(b, HIGH);
            digitalWrite(c, HIGH);
            digitalWrite(d, LOW);
            digitalWrite(e, LOW);
            digitalWrite(f, HIGH);
            digitalWrite(g, HIGH);
            digitalWrite(r, LOW);
            break;
          case 5:
            /*Bloque para mostrar un 5*/
            digitalWrite(a, HIGH);
            digitalWrite(b, LOW);
            digitalWrite(c, HIGH);
            digitalWrite(d, HIGH);
            digitalWrite(e, LOW);
            digitalWrite(f, HIGH);
            digitalWrite(g, HIGH);
            digitalWrite(r, LOW);
            break;
          case 6:
            /*Bloque para mostrar un 6*/
            digitalWrite(a, HIGH);
            digitalWrite(b, LOW);
            digitalWrite(c, HIGH);
            digitalWrite(d, HIGH);
            digitalWrite(e, HIGH);
            digitalWrite(f, HIGH);
            digitalWrite(g, HIGH);
            digitalWrite(r, LOW);
            break;
          case 7:
            /*Bloque para mostrar un 7*/
            digitalWrite(a, HIGH);
            digitalWrite(b, HIGH);
            digitalWrite(c, HIGH);
            digitalWrite(d, LOW);
            digitalWrite(e, LOW);
            digitalWrite(f, LOW);
            digitalWrite(g, LOW);
            digitalWrite(r, LOW);
            break;
          case 8:
            /*Bloque para mostrar un 8*/
            digitalWrite(a, HIGH);
            digitalWrite(b, HIGH);
            digitalWrite(c, HIGH);
            digitalWrite(d, HIGH);
            digitalWrite(e, HIGH);
            digitalWrite(f, HIGH);
            digitalWrite(g, HIGH);
            digitalWrite(r, LOW);
            break;
          case 9:
            /*Bloque para mostrar un 9*/
            digitalWrite(a, HIGH);
            digitalWrite(b, HIGH);
            digitalWrite(c, HIGH);
            digitalWrite(d, HIGH);
            digitalWrite(e, LOW);
            digitalWrite(f, HIGH);
            digitalWrite(g, HIGH);
            digitalWrite(r, LOW);

          }
        }

        void setup(){
          /*Declaramos los segmetos del display como salidas*/
          pinMode(a, OUTPUT);
          pinMode(b, OUTPUT);
          pinMode(c, OUTPUT);
          pinMode(d, OUTPUT);
          pinMode(e, OUTPUT);
          pinMode(f, OUTPUT);
          pinMode(g, OUTPUT);
          pinMode(r, OUTPUT);
          /*Declaramos los botones como entradas*/
          pinMode(BtnIncremento, INPUT);
          pinMode(BtnDecremento, INPUT);
          pinMode(BtnBloqueo, INPUT);
        }

        void loop() {
          estadoBtnBloqueo = digitalRead(BtnBloqueo);
          if (estadoBtnBloqueo  != estadoBtnBloqueoAnterior) {     // si hay cambio con respeto al estado
            if (antirebote (BtnBloqueo)){         //checamos  si esta preionado y si lo esta
              bloqueo = !bloqueo;
            }
          }
          estadoBtnBloqueoAnterior = estadoBtnBloqueo;              // guardamos el estado del boton

          estadoBtnIncremento = digitalRead(BtnIncremento);
          if (estadoBtnIncremento  != estadoBtnIncrementoAnterior) {     // si hay cambio con respeto al estado
            if (antirebote (BtnIncremento)){         //checamos  si esta preionado y si lo esta
              cuenta = cuenta + 4;                                       //aumentamos la cuenta
              if (cuenta > 9){                
                cuenta = 9;
              }
            }
          }
          estadoBtnIncrementoAnterior = estadoBtnIncremento;              // guardamos el estado del boton

          if (!bloqueo) { // Si está bloqueado, lo ignoramos, y en otro caso, lo leemos
              estadoBtnDecremento = digitalRead(BtnDecremento);      //leemos el estado del boton
              if (estadoBtnDecremento  != estadoBtnDecrementoAnterior) {     // si hay cambio con respeto al estado anterior
                if (antirebote (BtnDecremento)){   //si el boton esta presionado disminuimos la cuenta
                  cuenta--;                            
                  if (cuenta<0){

                    cuenta = 0;
                  }
                }
              }
              estadoBtnDecrementoAnterior = estadoBtnDecremento;  //guardamos el estado del boton
          }

          actualizarNumero();   //desplegamos la cuenta en el display
        }

Aún así, te funciona todo de normal, sin el bloqueo, no?
  Responder
#13
Sigue sin ir, si ... funciona todo menos el bloqueo, lo e copiado tal como lo has puesto y tampoco va.
  Responder
#14
Pero qué no va exactamente? no compila? al darle al botón de bloqueo no lo bloquea? no va nada? un poco más de info vendría bien Lengua

Habría que ver si "bloqueo" cambia de valor o está siempre a false. Para depurar en Arduino te puedes hacer un Serial y conectar por ejemplo con Putty al puerto para leer valores:
Código:
/* se declaran las contantes para identificar cada led*/
            const int r = 11;
            const int a = 2;
            const int b = 3;
            const int c = 4;
            const int d = 5;
            const int e = 6;
            const int f = 7;
            const int g = 8;
            const int BtnIncremento = 9; // boton de incremento conectadoa al pin 9
            const int BtnDecremento = 10; // boton de decremento conectadoa al pin 10
            const int BtnBloqueo = 12; // boton de bloqueo conectado al pin 12

            const int tiempoAntirebote =10;
            int cuenta =0;   //lleva la cuenta
            int estadoBtnIncremento;
            int estadoBtnIncrementoAnterior;
            int estadoBtnDecremento;
            int estadoBtnDecrementoAnterior;
            int estadoBtnBloqueo;
            int estadoBtnBloqueoAnterior;  
            boolean bloqueo = false; // De inicio está desbloqueado, también se podría hacer con el estado

            boolean antirebote  (int pin ) {
              int  contador =0;
              boolean estado;               // guarda el estado del boton
              boolean estadoAnterior;      // guarda el ultimo estado del boton

              do {
                estado = digitalRead (pin);
                if (estado != estadoAnterior ){   // comparamos el estado actual
                  contador =0;                    // reiniciamos el contador
                  estadoAnterior= estado;
                }
                else{
                  contador = contador +1;          // aumentamos el contador en 1
                }
                delay (1);
              }
              while (contador < tiempoAntirebote);
              return estado;
            }
            /* Metodo para elegir que numero mostrar en el display*/
            void actualizarNumero(){
              switch (cuenta) {
              case 0:
                /*Bloque para mostrar un 0*/
                digitalWrite(a, HIGH);
                digitalWrite(b, HIGH);
                digitalWrite(c, HIGH);
                digitalWrite(d, HIGH);
                digitalWrite(e, HIGH);
                digitalWrite(f, HIGH);
                digitalWrite(g, LOW);
                digitalWrite(r, HIGH);
                break;
              case 1:
                /*Bloque para mostrar un 1*/
                digitalWrite(a, LOW);
                digitalWrite(b, HIGH);
                digitalWrite(c, HIGH);
                digitalWrite(d, LOW);
                digitalWrite(e, LOW);
                digitalWrite(f, LOW);
                digitalWrite(g, LOW);
                digitalWrite(r, LOW);
                break;
              case 2:
                /*Bloque para mostrar un 2*/
                digitalWrite(a, HIGH);
                digitalWrite(b, HIGH);
                digitalWrite(c, LOW);
                digitalWrite(d, HIGH);
                digitalWrite(e, HIGH);
                digitalWrite(f, LOW);
                digitalWrite(g, HIGH);
                digitalWrite(r, LOW);
                break;
              case 3:
                /*Bloque para mostrar un 3*/
                digitalWrite(a, HIGH);
                digitalWrite(b, HIGH);
                digitalWrite(c, HIGH);
                digitalWrite(d, HIGH);
                digitalWrite(e, LOW);
                digitalWrite(f, LOW);
                digitalWrite(g, HIGH);
                digitalWrite(r, LOW);
                break;
              case 4:
                /*Bloque para mostrar un 4*/
                digitalWrite(a, LOW);
                digitalWrite(b, HIGH);
                digitalWrite(c, HIGH);
                digitalWrite(d, LOW);
                digitalWrite(e, LOW);
                digitalWrite(f, HIGH);
                digitalWrite(g, HIGH);
                digitalWrite(r, LOW);
                break;
              case 5:
                /*Bloque para mostrar un 5*/
                digitalWrite(a, HIGH);
                digitalWrite(b, LOW);
                digitalWrite(c, HIGH);
                digitalWrite(d, HIGH);
                digitalWrite(e, LOW);
                digitalWrite(f, HIGH);
                digitalWrite(g, HIGH);
                digitalWrite(r, LOW);
                break;
              case 6:
                /*Bloque para mostrar un 6*/
                digitalWrite(a, HIGH);
                digitalWrite(b, LOW);
                digitalWrite(c, HIGH);
                digitalWrite(d, HIGH);
                digitalWrite(e, HIGH);
                digitalWrite(f, HIGH);
                digitalWrite(g, HIGH);
                digitalWrite(r, LOW);
                break;
              case 7:
                /*Bloque para mostrar un 7*/
                digitalWrite(a, HIGH);
                digitalWrite(b, HIGH);
                digitalWrite(c, HIGH);
                digitalWrite(d, LOW);
                digitalWrite(e, LOW);
                digitalWrite(f, LOW);
                digitalWrite(g, LOW);
                digitalWrite(r, LOW);
                break;
              case 8:
                /*Bloque para mostrar un 8*/
                digitalWrite(a, HIGH);
                digitalWrite(b, HIGH);
                digitalWrite(c, HIGH);
                digitalWrite(d, HIGH);
                digitalWrite(e, HIGH);
                digitalWrite(f, HIGH);
                digitalWrite(g, HIGH);
                digitalWrite(r, LOW);
                break;
              case 9:
                /*Bloque para mostrar un 9*/
                digitalWrite(a, HIGH);
                digitalWrite(b, HIGH);
                digitalWrite(c, HIGH);
                digitalWrite(d, HIGH);
                digitalWrite(e, LOW);
                digitalWrite(f, HIGH);
                digitalWrite(g, HIGH);
                digitalWrite(r, LOW);

              }
            }

            void setup(){
              /*Declaramos los segmetos del display como salidas*/
              pinMode(a, OUTPUT);
              pinMode(b, OUTPUT);
              pinMode(c, OUTPUT);
              pinMode(d, OUTPUT);
              pinMode(e, OUTPUT);
              pinMode(f, OUTPUT);
              pinMode(g, OUTPUT);
              pinMode(r, OUTPUT);
              /*Declaramos los botones como entradas*/
              pinMode(BtnIncremento, INPUT);
              pinMode(BtnDecremento, INPUT);
              pinMode(BtnBloqueo, INPUT);
              Serial.begin(9600);
            }

            void loop() {
              estadoBtnBloqueo = digitalRead(BtnBloqueo);
              if (estadoBtnBloqueo  != estadoBtnBloqueoAnterior) {     // si hay cambio con respeto al estado
                if (antirebote (BtnBloqueo)){         //checamos  si esta preionado y si lo esta
                  bloqueo = !bloqueo;
                  Serial.println("Entra en bloqueo");
                }
              }
              estadoBtnBloqueoAnterior = estadoBtnBloqueo;              // guardamos el estado del boton

              estadoBtnIncremento = digitalRead(BtnIncremento);
              if (estadoBtnIncremento  != estadoBtnIncrementoAnterior) {     // si hay cambio con respeto al estado
                if (antirebote (BtnIncremento)){         //checamos  si esta preionado y si lo esta
                  cuenta = cuenta + 4;                                       //aumentamos la cuenta
                  if (cuenta > 9){                
                    cuenta = 9;
                  }
                }
              }
              estadoBtnIncrementoAnterior = estadoBtnIncremento;              // guardamos el estado del boton

              if (!bloqueo) { // Si está bloqueado, lo ignoramos, y en otro caso, lo leemos
                  estadoBtnDecremento = digitalRead(BtnDecremento);      //leemos el estado del boton
                  if (estadoBtnDecremento  != estadoBtnDecrementoAnterior) {     // si hay cambio con respeto al estado anterior
                    if (antirebote (BtnDecremento)){   //si el boton esta presionado disminuimos la cuenta
                      cuenta--;                            
                      if (cuenta<0){

                        cuenta = 0;
                      }
                    }
                  }
                  estadoBtnDecrementoAnterior = estadoBtnDecremento;  //guardamos el estado del boton
              }

              actualizarNumero();   //desplegamos la cuenta en el display
            }
  Responder
#15
No bloquea, cuando abro el monitor serial empieza a espamear "entra en bloqueo"
  Responder
#16
Es decir, que aunque no pulses entra. La función antirebote devuelve HIGH o LOW, asi que prueba a igulalarlo en el IF a HIGH (le metes 5v):
Código:
/* se declaran las contantes para identificar cada led*/
            const int r = 11;
            const int a = 2;
            const int b = 3;
            const int c = 4;
            const int d = 5;
            const int e = 6;
            const int f = 7;
            const int g = 8;
            const int BtnIncremento = 9; // boton de incremento conectadoa al pin 9
            const int BtnDecremento = 10; // boton de decremento conectadoa al pin 10
            const int BtnBloqueo = 12; // boton de bloqueo conectado al pin 12

            const int tiempoAntirebote =10;
            int cuenta =0;   //lleva la cuenta
            int estadoBtnIncremento;
            int estadoBtnIncrementoAnterior;
            int estadoBtnDecremento;
            int estadoBtnDecrementoAnterior;
            int estadoBtnBloqueo;
            int estadoBtnBloqueoAnterior;  
            boolean bloqueo = false; // De inicio está desbloqueado, también se podría hacer con el estado

            boolean antirebote  (int pin ) {
              int  contador =0;
              boolean estado;               // guarda el estado del boton
              boolean estadoAnterior;      // guarda el ultimo estado del boton

              do {
                estado = digitalRead (pin);
                if (estado != estadoAnterior ){   // comparamos el estado actual
                  contador =0;                    // reiniciamos el contador
                  estadoAnterior= estado;
                }
                else{
                  contador = contador +1;          // aumentamos el contador en 1
                }
                delay (1);
              }
              while (contador < tiempoAntirebote);
              return estado;
            }
            /* Metodo para elegir que numero mostrar en el display*/
            void actualizarNumero(){
              switch (cuenta) {
              case 0:
                /*Bloque para mostrar un 0*/
                digitalWrite(a, HIGH);
                digitalWrite(b, HIGH);
                digitalWrite(c, HIGH);
                digitalWrite(d, HIGH);
                digitalWrite(e, HIGH);
                digitalWrite(f, HIGH);
                digitalWrite(g, LOW);
                digitalWrite(r, HIGH);
                break;
              case 1:
                /*Bloque para mostrar un 1*/
                digitalWrite(a, LOW);
                digitalWrite(b, HIGH);
                digitalWrite(c, HIGH);
                digitalWrite(d, LOW);
                digitalWrite(e, LOW);
                digitalWrite(f, LOW);
                digitalWrite(g, LOW);
                digitalWrite(r, LOW);
                break;
              case 2:
                /*Bloque para mostrar un 2*/
                digitalWrite(a, HIGH);
                digitalWrite(b, HIGH);
                digitalWrite(c, LOW);
                digitalWrite(d, HIGH);
                digitalWrite(e, HIGH);
                digitalWrite(f, LOW);
                digitalWrite(g, HIGH);
                digitalWrite(r, LOW);
                break;
              case 3:
                /*Bloque para mostrar un 3*/
                digitalWrite(a, HIGH);
                digitalWrite(b, HIGH);
                digitalWrite(c, HIGH);
                digitalWrite(d, HIGH);
                digitalWrite(e, LOW);
                digitalWrite(f, LOW);
                digitalWrite(g, HIGH);
                digitalWrite(r, LOW);
                break;
              case 4:
                /*Bloque para mostrar un 4*/
                digitalWrite(a, LOW);
                digitalWrite(b, HIGH);
                digitalWrite(c, HIGH);
                digitalWrite(d, LOW);
                digitalWrite(e, LOW);
                digitalWrite(f, HIGH);
                digitalWrite(g, HIGH);
                digitalWrite(r, LOW);
                break;
              case 5:
                /*Bloque para mostrar un 5*/
                digitalWrite(a, HIGH);
                digitalWrite(b, LOW);
                digitalWrite(c, HIGH);
                digitalWrite(d, HIGH);
                digitalWrite(e, LOW);
                digitalWrite(f, HIGH);
                digitalWrite(g, HIGH);
                digitalWrite(r, LOW);
                break;
              case 6:
                /*Bloque para mostrar un 6*/
                digitalWrite(a, HIGH);
                digitalWrite(b, LOW);
                digitalWrite(c, HIGH);
                digitalWrite(d, HIGH);
                digitalWrite(e, HIGH);
                digitalWrite(f, HIGH);
                digitalWrite(g, HIGH);
                digitalWrite(r, LOW);
                break;
              case 7:
                /*Bloque para mostrar un 7*/
                digitalWrite(a, HIGH);
                digitalWrite(b, HIGH);
                digitalWrite(c, HIGH);
                digitalWrite(d, LOW);
                digitalWrite(e, LOW);
                digitalWrite(f, LOW);
                digitalWrite(g, LOW);
                digitalWrite(r, LOW);
                break;
              case 8:
                /*Bloque para mostrar un 8*/
                digitalWrite(a, HIGH);
                digitalWrite(b, HIGH);
                digitalWrite(c, HIGH);
                digitalWrite(d, HIGH);
                digitalWrite(e, HIGH);
                digitalWrite(f, HIGH);
                digitalWrite(g, HIGH);
                digitalWrite(r, LOW);
                break;
              case 9:
                /*Bloque para mostrar un 9*/
                digitalWrite(a, HIGH);
                digitalWrite(b, HIGH);
                digitalWrite(c, HIGH);
                digitalWrite(d, HIGH);
                digitalWrite(e, LOW);
                digitalWrite(f, HIGH);
                digitalWrite(g, HIGH);
                digitalWrite(r, LOW);

              }
            }

            void setup(){
              /*Declaramos los segmetos del display como salidas*/
              pinMode(a, OUTPUT);
              pinMode(b, OUTPUT);
              pinMode(c, OUTPUT);
              pinMode(d, OUTPUT);
              pinMode(e, OUTPUT);
              pinMode(f, OUTPUT);
              pinMode(g, OUTPUT);
              pinMode(r, OUTPUT);
              /*Declaramos los botones como entradas*/
              pinMode(BtnIncremento, INPUT);
              pinMode(BtnDecremento, INPUT);
              pinMode(BtnBloqueo, INPUT);
              Serial.begin(9600);
            }

            void loop() {
              estadoBtnBloqueo = digitalRead(BtnBloqueo);
              if (estadoBtnBloqueo  != estadoBtnBloqueoAnterior) {     // si hay cambio con respeto al estado
                if (antirebote (BtnBloqueo) == HIGH){         //checamos  si esta preionado y si lo esta
                  bloqueo = !bloqueo;
                  Serial.println("Entra en bloqueo");
                }
              }
              estadoBtnBloqueoAnterior = estadoBtnBloqueo;              // guardamos el estado del boton

              estadoBtnIncremento = digitalRead(BtnIncremento);
              if (estadoBtnIncremento  != estadoBtnIncrementoAnterior) {     // si hay cambio con respeto al estado
                if (antirebote (BtnIncremento)){         //checamos  si esta preionado y si lo esta
                  cuenta = cuenta + 4;                                       //aumentamos la cuenta
                  if (cuenta > 9){                
                    cuenta = 9;
                  }
                }
              }
              estadoBtnIncrementoAnterior = estadoBtnIncremento;              // guardamos el estado del boton

              if (!bloqueo) { // Si está bloqueado, lo ignoramos, y en otro caso, lo leemos
                  estadoBtnDecremento = digitalRead(BtnDecremento);      //leemos el estado del boton
                  if (estadoBtnDecremento  != estadoBtnDecrementoAnterior) {     // si hay cambio con respeto al estado anterior
                    if (antirebote (BtnDecremento)){   //si el boton esta presionado disminuimos la cuenta
                      cuenta--;                            
                      if (cuenta<0){

                        cuenta = 0;
                      }
                    }
                  }
                  estadoBtnDecrementoAnterior = estadoBtnDecremento;  //guardamos el estado del boton
              }

              actualizarNumero();   //desplegamos la cuenta en el display
            }
No recuerdo el valor de HIGH, pero si es un 1, en C al meterlo en un if debería ser cierto...

Doy por hecho que está bien conectado y tal.
  Responder
#17
Diria que esta bien conectado ... no tengo ningún esquema pero bueno XD bueno si tengo un esquema del circuito del relé y del display y el boton de bloqueo va de los 5v del arduino al pulsador y del pulsador al pin 12 ._.

Pd. Con el codigo que me acabas de pasar sigue sin ir ._.
  Responder
#18
Has probado el último código? Si spammea el mensaje sin pulsar, es que está entrando, por lo que yo diría que no está bien conectado...
  Responder
#19
Esto es muy raro XD abro el monitor serial y sale esto http://prntscr.com/626u52 cuando pulso el de incremento ya se vuelve loco y solo sale entra en bloqueo
  Responder
#20
Es decir, no te está leyendo bien la entrada... cómo es el esquema? le has puesto alguna resistencia?

[Imagen: button.png]
  Responder


Posibles temas similares…
Tema Autor Respuestas Vistas Último mensaje
  LM35 y Contador binario Mentus 3 2,333 11-04-2015, 10:03 PM
Último mensaje: paredesivan4
  contador bolas airsoft harian33 15 4,611 24-06-2014, 08:00 PM
Último mensaje: harian33