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.
Desafío
IntermedioEl 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 conshowDigit() - 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;
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Pantallas y sensores
1Displays de siete segmentos
Display de siete segmentosPatrones de dígitos en bytesCuenta en el displayCuenta regresiva hasta ceroLanzador de dadosPractica por tu cuenta: Playground de Arduino