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.
Desafio
MédioO 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 comshowDigit() - 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;
}
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
1Displays de Sete Segmentos
Display de Sete SegmentosPadrões de Dígitos em BytesContagem no DisplayContagem Regressiva até ZeroSimulador de DadosPratique por conta própria: Playground de Arduino