Contador ascendente y descendente con botón y display 7 segmentos

Que tal amigos, soy algo nuevo en eso del arduino y quisiera saber si podrian ayudarme....

Tengo este código el cual por medio de 2 botones incrementa o decrementa la cuenta en el display pero quisiera hacer una modificación para que hiciera lo siguiente:

1.- Comienza el contador en 0.
2.- Al presionar el botón1 incremente la cuenta.
3.- Presionar el botón2.
4.- Al presionar el boton1 decremente la cuenta.
5.- Presionar el botón2.
6.- Al presionar el botón1 vuelva a incrementar la cuenta.

Y asi sucesivamente, en pocas palabras deseo hacer que el segundo botón sea el encargado de elegir si el botón1 incrementa o decrementa la cuenta en el display 7 segmentos.

Agradeceria si pudieran ayudarme..

Gracias.

/*

Contador númerico ascendente y descendente con 2 botones 
uno para incrementar y el otro para decrementar

*/


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 botonIncremento = 9;          // boton de incremento conectado al pin 10
const int botonDecremento = 10;         // boton de decremento conectado al pin 9

const int tiempoAntirebote = 10;
int cuenta = 0;                         // lleva la cuenta de las veces que presionamos el botón
int estadoBotonIncremento;
int estadoBotonAnteriorIncremento;
int estadoBotonDecremento;
int estadoBotonAnteriorDecremento;

//Función antirebote botón inicio

boolean antirebote(int pin) {
int contador = 0;
boolean estado;                       // guarda el estado del botón
boolean estadoAnterior;               // guarda el último estado del botón

do {
  estado = digitalRead(pin);          // Leer el estado del botón y guardarla en la variable "estado"
  if(estado != estadoAnterior) {      // comparamos el estado actual del botón con el anterior
  contador = 0;                       // si es diferente contador va a valer 0 y reiciamos el contador, "!=" significa diferente a
  estadoAnterior = estado;            // guardamos el valor de "estado" que leimos en "estadoAnterior"
  }
  else {
    contador = contador + 1;          // en caso de que sea igual "contador" sumará 1
  }
  delay(1);
} while(contador < tiempoAntirebote);

return estado;
}

// Función antirebote botón fin

void actualizarNumero() {
switch(cuenta) {
  case 0:
    digitalWrite(a, HIGH);                // encendido número 0
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);
    digitalWrite(f, HIGH);
    digitalWrite(g, LOW);
    break;
   case 1:
    digitalWrite(a, LOW);                 // encendido número 1
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);
    break;
   case 2:
    digitalWrite(a, HIGH);                // encendido número 2
    digitalWrite(b, HIGH);
    digitalWrite(c, LOW);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);
    digitalWrite(f, LOW);
    digitalWrite(g, HIGH);
    break;
   case 3:
    digitalWrite(a, HIGH);                // encendido número 3
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, HIGH);
    break;
   case 4:
    digitalWrite(a, LOW);                // encendido número 4
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    break;
   case 5:
    digitalWrite(a, HIGH);                // encendido número 5
    digitalWrite(b, LOW);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, LOW);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    break;
   case 6:
    digitalWrite(a, HIGH);                // encendido número 6
    digitalWrite(b, LOW);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    break;
   case 7:
    digitalWrite(a, HIGH);                // encendido número 7
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);
    break;
   case 8:
    digitalWrite(a, HIGH);                // encendido número 8
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    break;
   case 9:
    digitalWrite(a, HIGH);                // encendido número 9
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, LOW);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    break;
}
}


void setup() {
pinMode(a, OUTPUT);                   // declaramos los LEDS como salidas
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
pinMode(botonIncremento, INPUT);      // declaramos los botones como entradas
pinMode(botonDecremento, INPUT);
}

void loop() {

// codigo botón incremento inicio

estadoBotonIncremento = digitalRead(botonIncremento);          // leemos el estado del botón
if(estadoBotonIncremento != estadoBotonAnteriorIncremento) {   // si hay cambio con respecto al estado anterior
  if(antirebote(botonIncremento)) {                            // checamos si está presionado y si lo está,
  cuenta++;                                                    // aumentamos la cuenta en 1
  if(cuenta > 9) {
    cuenta = 9;
  }
 }
}
estadoBotonAnteriorIncremento = estadoBotonIncremento;         // guardamos el estado del botón 

// codigo botón incremento fin

// codigo botón decremento inicio

estadoBotonDecremento = digitalRead(botonDecremento);          // leemos el estado del botón
if(estadoBotonDecremento != estadoBotonAnteriorDecremento) {   // si hay cambio con respecto al estado anterior
  if(antirebote(botonDecremento)) {                            // checamos si está presionado y si lo está,
  cuenta--;                                                    // disminuimos la cuenta en 1
  if(cuenta < 0) {
    cuenta = 0;
  }
 }
}
estadoBotonAnteriorDecremento = estadoBotonDecremento;         // guardamos el estado del botón 

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

}

// codigo botón decremento fin

Saludos
Alonso cuanto post vas a hacer? mientras mas hagas menos ayuda recibes. Ya que estas infringiendo las normas del foro.

Piensa lo que debes hacer inténtalo y luego preguntas.
Usa los tag para colocar codigo.

Ya te escribí la solución pero quedó en la notebook de mi casa y se hizo tarde y no pude corregirla.
Mas tarde la posteo

max_saeta soy nuevo en el grupo y no tenia sabía el dato de como postear el código.

surbyte gracias, agradeceria si pudieran ayudarme.

bueno a ver si funciona esto que te he modificado.
No te asustes por la simplificación. Si algo no entiendes te lo explico

/* Contador númerico ascendente y descendente con 2 botones 
   uno para incrementar y el otro para decrementar						*/


const int PinContador 	= 9;          // boton de Incr conectado al pin 10
const int PinUpDown 	= 10;         // boton de Decr conectado al pin 9

const int tiempoAntirebote = 10;
int cuenta = 0;                         // lleva la cuenta de las veces que presionamos el botón
byte BtnContador;
byte BtnContadorAnt;
byte BtnUpDown;
byte BtnUpDownAnt;
byte UpDown = true;  				// UpDown = true incrementa Updown = false decremetna


const byte pin[] = {2,3,4,5,6,7,8};

//            0          1            2        3          4          
const byte segmento[] = {0b1111110, 0b0110000, 0b1111001, 0b1111001, 0b0110011, 
                         // 5          6          7          8          9
                         0b1011011, 0b1011111, 0b1110000, 0b1111111, 0b1111011};

//Función antirebote botón inicio
boolean antirebote(byte pin) {
  int contador = 0;
  boolean estado;                       // guarda el estado del botón
  boolean estadoAnt;               // guarda el último estado del botón
  
  do {
    estado = digitalRead(pin);          // Leer el estado del botón y guardarla en la variable "estado"
    if(estado != estadoAnt) {      // comparamos el estado actual del botón con el Ant
    contador = 0;                       // si es diferente contador va a valer 0 y reiciamos el contador, "!=" significa diferente a
    estadoAnt = estado;            // guardamos el valor de "estado" que leimos en "estadoAnt"
    }
    else {
      contador = contador + 1;          // en caso de que sea igual "contador" sumará 1
    }
    delay(1);
  } while(contador < tiempoAntirebote);
  
  return estado;
}

// Función antirebote botón fin



void actualizarNumero() {
   for (int i=0; i<7; i++){
       digitalWrite(pin[i], segmento[cuenta]);
   }
}


void setup() {
   
   // declaramos los LEDS como salidas
   for (int i=0; i<7; i++){
       pinMode(pin[i], OUTPUT);
   }
                     
  pinMode(PinContador, INPUT);      // declaramos los botones como entradas
  pinMode(PinUpDown, INPUT);
 }

void loop() {
  
  // codigo botón Incr inicio
  
  BtnContador = digitalRead(PinContador);   // leemos el estado del botón
  if(BtnContador != BtnContadorAnt) {   	// si hay cambio con respecto al estado Ant
    if (antirebote(PinContador)) {          // checamos si está presionado y si lo está,
       if (UpDown)  {                  // cambia de UP a Down con cada pulsada
          cuenta++;
		  if (cuenta > 9) {
		     cuenta = 9;
		  }
		} else {
			cuenta--;
			if (cuenta < 0) {
	      		cuenta = 0;
    	}	
		}
   }
  }

  BtnContadorAnt = BtnContador;         // guardamos el estado del botón

  BtnUpDown = digitalRead(PinUpDown);   // leemos el estado del botón
  if(BtnUpDown != BtnUpDownAnt) {   	// si hay cambio con respecto al estado Ant
    if (antirebote(PinUpDown)) {        // checamos si está presionado y si lo está,
	    UpDown = !UpDown;                                                    // disminuimos la cuenta en 1
	}
  }
  BtnUpDownAnt = BtnUpDown;             // guardamos el estado del botón 
  
  actualizarNumero();                   // desplegamos la cuenta en el display
  
}
  
  // codigo botón Decr fin

Cambios:

  1. Agregué esto
const byte pin[] = {2,3,4,5,6,7,8};

//            0          1            2        3          4          
const byte segmento[] = {0b1111110, 0b0110000, 0b1111001, 0b1111001, 0b0110011, 
                         // 5          6          7          8          9
                         0b1011011, 0b1011111, 0b1110000, 0b1111111, 0b1111011};

pin tiene la lista de tus salidas del display 7 segmentos. Al tenerlas en un vector simplifica el uso.
segmentos tiene una lista de como visualizas los segmentos en tu display.
0bXXXXXXX es una notación en formato binario.
Solo copia como tenias definido cada número.
Donde tienes un HIGH yo puse un 1 empezando por el segmento a y terminando por el g
0babcdefg es como estan dispuestos

Si miras tu definición del 0 veras que tienes
HIGH 1
HIGH 1
HIGH 1
HIGH 1
HIGH 1
HIGH 1
LOW 0
eso conforma 0b1111110 para el 0 en la posición 0 del vector segmento.

  1. Tus botones cambiaron a BtnContador y BtnUpDown
    UpDown con cada cambio modifica la variable UpDown que sera 1 con UP y 0 con Down
    Y en BtnContador con cada presión según este UpDown ira en forma ascendente o descendente.

Escucho tus comentarios

Que tal surbyte, mil gracias por la ayuda, creo haber entendido tus cambios, pero lo compilo en mi arduino y encenden todos los leds del display 7 segmentos como si estuviera marcando un 8 y presiono los botones y no sucede nada, podrías ayudarme?

Gracias.

Que tal surbyte modifique la parte del display por la anterior que yo tenia y funcionó como yo queria, me gustaría saber que error hay en la otra forma que me comentaste tu que sustituía a las entradas de los LEDS del display ya que si es más reducido.

Ya intentando mejorarlo quisiera saber como agregarle 2 LEDS, uno que encienda cuando el primer botón incrementa y otro LED que encienda cuando decremente.

Gracias!

Tienes razón, torpeza de mi parte
Modifica esto

void actualizarNumero() {
   for (int i=0; i<7; i++){
       digitalWrite(pin[i], segmento[cuenta]&(1<<(6-i)));
   }
}

Esta línea dice

1<<(6-i)

Desplazar a izquierda 6-i posiciones el valor de la diferencia.
Cuando i=0 => 6-i=6 y 1<<6 = 64 = 0x01000000

Y la operacion de segmento[cuenta] con (1<<(6-i)) hace esto.
Ejemplo: supongamos cuenta = 0
segmento[cuenta]=segmento[0]= 0b1111110
si estamos en el primero paso del for o sea i = 0
1<<(6-i) ==1<<(6-0)=1<<6=0b1000000
// 6543210 6543210
o sea que segmento[0] && (1<<6) = 0b1111110 && 0b1000000 =
como verás en la posición del bit 6 tenemos 1 en ambos bytes
asi que 1 && 1 = 1 y el bit enciende
asi ocurrirá en cada caso
para el bit 5 tenemos lo mismo
e igual hasta el bit 1 pero en el bit 0 segmento[cuenta] vale 0 y entonces no encenderà.

Esto se repite para cada caso tome el valor que tome cuenta lo que direccionará el valor del vector segmento y siempre estaremos barriendo cada bit y como resultado de la operación lógica resultará si debe encender o apagar.