Menu
CoddyTech

Lanzador de dados

Parte de la sección Pantallas y sensores del Journey de Arduino de Coddy. Lección 5 de 24.

random(1, 7) elige un número entero del 1 al 6. El primer número es el menor que puedes obtener; el segundo es uno más que el mayor.

El tablero no tiene ninguna posibilidad real en su interior. random() calcula cada número a partir del anterior, empezando por un número llamado semilla. Con la misma semilla, da los mismos números en cada ejecución: tus dados sacarían 2, 2, 6, 3 cada vez que los enciendes.

randomSeed() establece la semilla. Dale algo que cambie de una ejecución a otra, como el momento de la primera pulsación del botón. micros() cuenta en millonésimas de segundo, y nadie pulsa en el mismo microsegundo dos veces:

if (!seeded) {
  randomSeed(micros());
  seeded = true;
}
int roll = random(1, 7);

Establecer la semilla en setup() no sirve de nada: setup() se ejecuta en el mismo microsegundo después de cada encendido.

challenge icon

Desafío

Intermedio

El botón está en el pin 10 y el código inicial ya detecta el momento en que se presiona. Crea un dado:

  • en cada pulsación, elige random(1, 7) y muéstralo con showDigit()
  • solo en la primera pulsación, llama a randomSeed(micros()) para que los resultados varíen de una ejecución a otra

Pulsa Run y pulsa el botón unas cuantas veces; después, Check.

Pruébalo tú mismo

const int segmentPins[7] = {2, 3, 4, 5, 6, 7, 8};  // a, b, c, d, e, f, g

// Un patrón por dígito, leído desde la derecha: el último bit corresponde al segmento a.
//                     gfedcba
const byte digits[10] = {
  0b0111111,  // 0
  0b0000110,  // 1
  0b1011011,  // 2
  0b1001111,  // 3
  0b1100110,  // 4
  0b1101101,  // 5
  0b1111101,  // 6
  0b0000111,  // 7
  0b1111111,  // 8
  0b1101111   // 9
};

void showDigit(int n) {
  for (int i = 0; i < 7; i++) {
    if (bitRead(digits[n], i) == 1) {
      digitalWrite(segmentPins[i], LOW);   // encendido
    } else {
      digitalWrite(segmentPins[i], HIGH);  // apagado
    }
  }
}

const int buttonPin = 10;
bool wasPressed = false;
bool seeded = false;

void setup() {
  for (int i = 0; i < 7; i++) {
    pinMode(segmentPins[i], OUTPUT);
  }
  pinMode(buttonPin, INPUT_PULLUP);
  showDigit(0);
}

void loop() {
  bool pressed = digitalRead(buttonPin) == LOW;
  if (pressed != wasPressed) {
    if (pressed) {
      // se acaba de pulsar el botón: genera un número del 1 al 6 y muéstralo
    }
    delay(50);  // deja que el botón se estabilice
  }
  wasPressed = pressed;
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Pantallas y sensores

Practica por tu cuenta: Playground de Arduino