Sumar entradas digitales

Buen día tengan.

El arduino debe tomar lecturas cada 4 segundos una compuerta se abrira y arrojara pelotas (situacion ficticia),y se oprimirán botones (son 4 botones),no siempre caera la misma cantidad,puede caer 1,3,2;con un máximo de 4.
Leerá cual tiene estado lógico de 1 o 0, y el led1 se encendera (si lo oprimen o no),dependiendo el numero de push botton que se opriman,debe arrojar una lectura en un display de 7 segmentos de anodo común;si oprimo 2 botones,en el display debe aparecer 2.Osea deben sumarse los pulsos (señales) de los push botton y arrojar la lectura en el display.Ademas,dichas cantidades que se obtienen cada 4 segundos,se van ir sumando, y al alcanzar una sumatoria de 16,un led2 se encenderá y debe arrojar en el puerto serial una leyenda que diga "Muestra completa"

const int pinBtn_1= 10;
const int pinBtn_2= 11;
const int pinBtn_3= 12;
const int pinBtn_4= 13;

const int Ld_a= 2;
const int Ld_b= 3;
const int Ld_c= 4;
const int Ld_d= 5;
const int Ld_e= 6;
const int Ld_f= 7;
const int Ld_g= 8;

int cont = 0;
/*int estado_2 = 0;
int estado_3 = 0;
int estado_4 = 0;*/

void setup() {
  
  Serial.begin(9600);
  
  pinMode (pinBtn_1,INPUT);
  pinMode (pinBtn_2,INPUT);
  pinMode (pinBtn_3,INPUT);
  pinMode (pinBtn_4,INPUT);
  pinMode (Ld_a,OUTPUT);
  pinMode (Ld_b,OUTPUT);
  pinMode (Ld_c,OUTPUT);
  pinMode (Ld_d,OUTPUT);
  pinMode (Ld_e,OUTPUT);
  pinMode (Ld_f,OUTPUT);
  pinMode (Ld_g,OUTPUT);
  

}

void n_0 ()
{
  digitalWrite(Ld_a, LOW);
  digitalWrite(Ld_b, LOW);
  digitalWrite(Ld_c, LOW);
  digitalWrite(Ld_d, LOW);
  digitalWrite(Ld_e, LOW);
  digitalWrite(Ld_f, LOW);
  digitalWrite(Ld_g, HIGH);
}
  void n_1 ()
 {
  digitalWrite(Ld_a, HIGH);
  digitalWrite(Ld_b, LOW);
  digitalWrite(Ld_c, LOW);
  digitalWrite(Ld_d, HIGH);
  digitalWrite(Ld_e, HIGH);
  digitalWrite(Ld_f, HIGH);
  digitalWrite(Ld_g, HIGH);
 }
  void n_2 ()
  {
  digitalWrite(Ld_a, LOW);
  digitalWrite(Ld_b, LOW);
  digitalWrite(Ld_c, HIGH);
  digitalWrite(Ld_d, LOW);
  digitalWrite(Ld_e, LOW);
  digitalWrite(Ld_f, HIGH);
  digitalWrite(Ld_g, LOW);
  }
  void n_3 ()
 {
  digitalWrite(Ld_a, LOW);
  digitalWrite(Ld_b, LOW);
  digitalWrite(Ld_c, LOW);
  digitalWrite(Ld_d, LOW);
  digitalWrite(Ld_e, HIGH);
  digitalWrite(Ld_f, HIGH);
  digitalWrite(Ld_g, LOW);
 }
  void n_4 ()
 {
  digitalWrite(Ld_a, HIGH);
  digitalWrite(Ld_b, LOW);
  digitalWrite(Ld_c, LOW);
  digitalWrite(Ld_d, HIGH);
  digitalWrite(Ld_e, HIGH);
  digitalWrite(Ld_f, LOW);
  digitalWrite(Ld_g, LOW);
 }
void loop() {
}

Es lo que llevo

Lo estas haciendo para catodo común, al menos la definición de los bits

Vamos a mejorar la idea usando un vector que define los bits que se encienden/apagan

llamemos digito a esta variable tipo byte (8 bits)

cuando defines una variable en bits usas este formato bXXXXXXXX donde b denota bits o en binario.

entonces supongamos que la llamamos display

int dig[16] = { // defino todo para poder escribir mensajes si quiero
// bits     6543210
// digits   abcdefg
          0b1111110,//0
          0b0110000,//1
          0b1101101,//2
          0b1111001,//3
          0b0110011,//4
          0b1011011,//5
          0b1011111,//6
          0b1110000,//7
          0b1111111,//8
          0b1111011,//9
          0b1110111,//a
          0b0011111,//b
          0b1001110,//c
          0b0111101,//d
          0b1001111,//e
          0b1000111 //f
};

el código completo sería

 int ledStart = 4; // vamos a mostrar este valor

// una variable para poder usar todo para ánodo o cátodo común
boolean commonHigh = true;


void setup() {
  // habilito segmentos a-g y el DP punto decimal como salidas. 
  for(int i=0;i<8;++i) {
    pinMode(ledStart + i, OUTPUT);
    digitalWrite(ledStart + i, commonHigh?1:0); // Nota 1.
  }
}

void loop() {
  // escribo los numeros de 0 a F (hex)
  // en el display cada medio segundo 
  for(int i=0;i<16;i++) {
    escriboDigitoEnDisplay(i);
    delay(500);
  }
}

// defino los bits ON y OFF
// para cada segmento. Se usan en la función que encendera/apagara los segmentos

int dig[16] = {
// bits     6543210
// digits   abcdefg
          0b1111110,//0
          0b0110000,//1
          0b1101101,//2
          0b1111001,//3
          0b0110011,//4
          0b1011011,//5
          0b1011111,//6
          0b1110000,//7
          0b1111111,//8
          0b1111011,//9
          0b1110111,//a
          0b0011111,//b
          0b1001110,//c
          0b0111101,//d
          0b1001111,//e
          0b1000111 //f
};

void escriboDigitoEnDisplay(int digit) {
  
  for(int i=0;i<7;++i) {      // iteramos en cada bit
    
    int currentBit = (1<<(6-i));   // aislo el bit en curso dentro del loop.
    // y lo comparo con el bit en el digito definido arriba

    int bitOn = (currentBit&dig[digit])!=0;
    
    // si estamos en anodo común entonce invierto la logica, como si 0 fuera ON.
    if(commonHigh) {
      bitOn = !bitOn;
    }
    
    // y entonces enciendo el bit
    digitalWrite(ledStart+i, bitOn);
  }
}

lo escribí un poco al vuelo asi que no se si funciona.
las definiciones de los bits ya la tengo pero como vos definis para catodo común y hablas de anodo te puse como para que cambiando boolean commonHigh = true; a false el programa funcione con catodo común.

Profe Surbyte!! Trabajo Practico aprobado :wink: