Menu
CoddyTech

Simulador de Dados

Parte da seção Displays e sensores do Journey de Arduino da Coddy. Lição 5 de 24.

random(1, 7) escolhe um número inteiro de 1 a 6. O primeiro número é o menor que você pode obter; o segundo é um a mais que o maior.

O circuito não tem uma chance real em seu interior. random() calcula cada número a partir do anterior, começando por um número chamado semente. Com a mesma semente, ele gera os mesmos números a cada execução: seus dados mostrariam 2, 2, 6, 3 sempre que você os ligasse.

randomSeed() define a semente. Passe a ela algo que mude a cada execução, como o horário do primeiro pressionamento do botão. micros() conta em milionésimos de segundo, e ninguém pressiona o botão no mesmo microssegundo duas vezes:

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

Definir a semente em setup() não ajuda: setup() é executada no mesmo microssegundo após cada inicialização.

challenge icon

Desafio

Médio

O botão está no pino 10, e o código inicial já detecta o momento em que ele é pressionado. Faça um dado:

  • a cada pressão, escolha random(1, 7) e mostre o resultado com showDigit()
  • somente na primeira pressão, chame randomSeed(micros()) para que os resultados sejam diferentes a cada execução

Pressione Run e aperte o botão algumas vezes; depois, clique em Check.

Experimente você mesmo

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

// Um padrão por dígito, lido da direita para a esquerda: o último bit corresponde ao 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);   // aceso
    } 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) {
      // o botão acabou de ser pressionado: sorteie um número de 1 a 6 e mostre-o
    }
    delay(50);  // aguarde o botão estabilizar
  }
  wasPressed = pressed;
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Displays e sensores

Pratique por conta própria: Playground de Arduino