Contador switch case BCD 8 LED

Buenas! Llevo dos días buscando como hacer este ejercicio y no encuentro la forma adecuada de hacerlo...

*Ejercicio en cuestión:

  • usa un pulsador para sumar+1 a un contador.

  • usa otro pulsador para restar -1

  • saca el resultado en código BCD a 8 leds (empieza por 4)

  • no habrá números negativos

  • utiliza la estructura 'switch case'

He conseguido hacerlo con 4 leds, utilizando 10 posibilidades. La idea es hacer otras 10 posibilidades con otros 4 leds con múltiplos de 10.

Luego también nos han dicho que se puede hacer todo solo con 10 variables.

La parte del contador y sumador ya la tengo hecha, el problema viene con el switch case.

Hola y bienvenido al foro.

Te invito a que te leas las NORMAS para que aprendas a postear correctamente tanto como código, imagenes, errores, enlaces, etc...

También te informo de que no hacemos los ejecicios de nadie, ayudamos en códigos que fallan, que no se entienden, etc.

En tu caso nos falta ¿qué código llevas hecho?

Gracias victorjam! No pretendo que me hagais los ejercicios, solo necesito saber como hacer una parte para luego aplicarla y seguir yo.

Aquí te mando el codigo

bool pulsacion=1; //creamos una variable booleana (0 o 1) para guardar la pulsacion del boton
int contador=0; //creamos una variable llamada contador y empieza a 0
#define BOTON 2 //creamos una constante llamada boton y le damos el valor 2
#define BOTON2 4
#define LED_ROJO 9
#define LED_VERDE 10
#define LED_BLANCO 11
#define LED_AMBAR 12

void setup() {
 pinMode (BOTON,INPUT); //definimos el pin 2 como una entrada
 pinMode (BOTON2,INPUT); //definimos el pin 4 como una entrada
 pinMode (LED_ROJO,OUTPUT);
 Serial.begin (9600); //iniciar monitor serie a 9600 baudios
 Serial.println (contador); //imprimir por pantalla el valor de contador
}

void loop() {
 pulsacion=digitalRead (BOTON); //lectura digital del pin numero boton (2)
 while(pulsacion==1){ //si pulsacion es 1 haz...
   delay(300);
   pulsacion=digitalRead (BOTON);
   if (pulsacion==0){
  contador++; //contador al que le sumas mas 1
   Serial.println(contador); //imprimir por pantalla el valor de contador
   }
 }
  pulsacion=digitalRead (BOTON2); //lectura digital del pin numero boton (3)
 while(pulsacion==1){ //si pulsacion es 0 haz...
   delay(300);
   pulsacion=digitalRead (BOTON2);
   if (pulsacion==0){
  contador--; //contador al que le resta 1
   Serial.println(contador); //imprimir por pantalla el valor de contador
   }
    }
    if (contador<0) {
     contador=0;
    }
    if (contador>99) {
     contador=0;
    }
  
    switch (contador){
     case 0: digitalWrite(LED_ROJO,LOW); 
     digitalWrite(LED_VERDE,LOW);
     digitalWrite(LED_BLANCO,LOW);
     digitalWrite(LED_AMBAR,LOW);
     break;
     case 1: digitalWrite(LED_ROJO,LOW); 
     digitalWrite(LED_VERDE,LOW);
     digitalWrite(LED_BLANCO,LOW);
     digitalWrite(LED_AMBAR,HIGH);
     break;
     case 2: digitalWrite(LED_ROJO,LOW); 
     digitalWrite(LED_VERDE,LOW);
     digitalWrite(LED_BLANCO,HIGH);
     digitalWrite(LED_AMBAR,LOW);
     break;
     case 3: digitalWrite(LED_ROJO,LOW); 
     digitalWrite(LED_VERDE,LOW);
     digitalWrite(LED_BLANCO,HIGH);
     digitalWrite(LED_AMBAR,HIGH);
     break;
     case 4: digitalWrite(LED_ROJO,LOW); 
     digitalWrite(LED_VERDE,HIGH);
     digitalWrite(LED_BLANCO,LOW);
     digitalWrite(LED_AMBAR,LOW);
     break;
     case 5: digitalWrite(LED_ROJO,LOW); 
     digitalWrite(LED_VERDE,HIGH);
     digitalWrite(LED_BLANCO,LOW);
     digitalWrite(LED_AMBAR,HIGH);
     break;
     case 6: digitalWrite(LED_ROJO,LOW); 
     digitalWrite(LED_VERDE,HIGH);
     digitalWrite(LED_BLANCO,HIGH);
     digitalWrite(LED_AMBAR,LOW);
     break;
     case 7: digitalWrite(LED_ROJO,LOW); 
     digitalWrite(LED_VERDE,HIGH);
     digitalWrite(LED_BLANCO,HIGH);
     digitalWrite(LED_AMBAR,HIGH);
     break;
     case 8: digitalWrite(LED_ROJO,HIGH); 
     digitalWrite(LED_VERDE,LOW);
     digitalWrite(LED_BLANCO,LOW);
     digitalWrite(LED_AMBAR,LOW);
     break;
     case 9: digitalWrite(LED_ROJO,HIGH);
     digitalWrite(LED_VERDE,LOW);
     digitalWrite(LED_BLANCO,LOW);
     digitalWrite(LED_AMBAR,HIGH);
     break;
     }
   }

Partiendo de que tu contador vaya de 0 a 99, tenemos dos digitos que son los que quieres mostrar en BCD.
Así que tienes que hacer un switch-case para cada digito. ¿Cómo? división entera y resto.

Por ejemplo el valor 32.

Si haces una división entera entre 10 (32/10) tendrás que el resultado es 3, que es el digito que está en las decenas.

Para obtener el resto debes utilizar la operación "resto de división entera" o módulo de C++. Esta se representa por %. Asi cuando haces 32%10 te da 2, que es el digito de las unidades.

// Encendemos los leds de las decenas.
switch (contador/10) {
  case 0: ...; break;
  case 9: ...; break;
}
// Encendemos los leds de las unidades.
switch ( contador%10) {
  case 0: ...; break;
  case 1: ...; break;
}

Para digitos de mayor longitud (contador mayor de 99) se hace con las mismas operaciones, pero es un poco mas complicado.

Te dejo el siguiente código e imagen para que veas el proceso de dividir y resto lo que hace, a ver si se entiende mejor:

/*
 *  Obtención de los digitos de un número.
 */

int numero = 23473; // Número a destripar.
int x;              // Variable auxoliar.

void setup() {
  Serial.begin(9600);
  // Asignamos a x el valor del número a destripar, para no cargarnos
  // el valor de número.
  x = numero;

  // Mientras el numero sea mayor de 9 significa que es divisible por 10.
  // Obtenemos las unidades primero, luego las decenas, centenas, etc.
  while ( x>9 ) {
    // Obtenemos el resto de dividir por 10.
    Serial.println(x%10);
    // Obtenemos la división por 10.
    x = x/10;
  }
  // Al final en x tenemos el último digito.
  Serial.print(x);
}

void loop() {
  
}

division.png

division.png

Muchas gracias. Muy clara la explicación. He probado a hacerlo en el programa y funciona a la perfección. Mañana el profesor nos enseñará a hacerlo solo con 10 variables. Nos a adelantado algo hoy, debe de ser con un for.