Pestañas

lunes, 21 de enero de 2019

Bloque 2: Dado con dispaly7segmentos

Simulación del lanzamiento de un dado con un display 7 segmentos.

Cuando pulsamos el botón, simulamos lanzar el dado, va rodando hasta que para en una cara.




Código:
//array con los pines donde van conectados los segmentos
int ledPins[] = {2, 3, 4, 5, 10, 9, 8, 7}; //los pines se pueden cambiar según
                                           //sea la conexión mas adecuada en la placa
int pulsador=6; //conectaremos el pulsadoral pin 6

int die[6][8]={
/* array con las combinaciones de encendido/apagado para cada núnero
      pin 2
   **********
 8 *        *3
   *   9    *
   **********
 7 *        *4
   *        *
   **********  * 5
       10
*/
  //1
  {0,1,1,1,0,0,0,0},
  //2
  {1,1,0,1,1,1,0,1},
  //3
  {1,1,1,1,1,0,0,1},
  //4
  {0,1,1,1,0,0,1,1},
  //5
  {1,0,1,1,1,0,1,1},
  //6
  {0,0,1,1,1,1,1,1},
};

/*
  usamos waitTime para simular un tiempo en el que el
  dado está rodando indicando las diferentes caras
*/
float waitTime=1;

void setup(){
  //Configura cada pin como salida
  for(int i=0;i<8;i++){
    pinMode(ledPins[i],OUTPUT);
  }
  pinMode(pulsador,INPUT); //Configura el pulsador como entrada

  /*Genera una semilla en la función random. Usamos el valor de
  A0, cuando no está conectado a nada, Nos aporta una señal
  electrica debido al ruido. Ésta será aleatoria y no va bien
  para nuestro caso
  */
  randomSeed(analogRead(A0));
}
void loop(){
  //reinicia el tiempo de espera
  waitTime=2;

  /*
    Imaginamos que el dado cuando se tira va rodando
    mostrando las distintas caras. El giro cada vez
    es mas lento, hasta que se detiene
  */
  while(waitTime<1000){
    /*
      Genera valores aleatorios.
      The die value can be 1 to 6, in the array it's
      die[0] to die[5]. random(0,6) generate a value
      between 0 to 6, that would be 0 to 5 in effect.
    */
    int value;
    value=random(0,6);
 
    //Muestra el valor del dado
    displayDie(value);
 
    /*
      See why waitTime have to be float? If it's an integer,
      multiply it by 1.3 will make it lose everything behind
      the decimal mark. We use 2 as the starting value,
      2*1.3 should be 2.6, losing the fractional parts means
      it'll be 2 in the end, so 2*1.3=2! It'll
    */
    waitTime=waitTime*1.3; 
    delay(waitTime);
  }

  /*
    Now the die is stable, wait untill the tilt switch is
    activated again. ts.pressed() stops the whole program
    until it's activated.
  */
  while (digitalRead (pulsador)==0){
    delay(10);
 }
}

void displayDie(int num){
  //Show the die value by turning on/off the right leds
  for(int i=0;i<8;i++){
    digitalWrite(ledPins[i],die[num][i]);
  }
}

No hay comentarios:

Publicar un comentario