4 de novembro de 2018

Sorteio Digital

Projeto para sortear números aleatórios entre 0 e 9.


Ao pressionar o botão um número é sorteado e exibido em um display de leds.

É possível com pequenas alterações utilizar um display de mais dígitos para exibição de valores maiores.
Pode-se também alterar apenas o código fonte para exibição de valores entre 1 e 6, como alternativa aos projetos Dado Eletrônico com Attiny85 e Dado Eletrônico.

Utilizei um Arduino Nano, um display de 7 segmentos com catodo comum, um botão tipo push-button, e 7 resistores de 220 ohms.

Segue o esquema elétrico do display, do circuito, e o código fonte com comentários para entendimento.



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/*---------------------------------------------------------
  Programa : SORTEIO DIGITAL
  Autor    : Fellipe Couto [ http://www.efeitonerd.com.br ]
  Data     : 04/11/2018
  ---------------------------------------------------------*/

#define BUTTON 9
int displayLed[7] = {2, 3, 4, 5, 6, 7, 8}; //Portas dos segmentos do display (A, B, C, D, E, F, G)

void setup() {
  //Configura as portas utilizadas no display como saída
  for (int i = 0; i < 7; i++) {
    pinMode(displayLed[i], OUTPUT);
  }
  //Configura as portas utilizada no botão como entrada com pull-up
  pinMode(BUTTON, INPUT_PULLUP);
  //Configura a inicilização do random através de valores aleatórios para não repetir sequencias
  randomSeed(analogRead(0));
  //Inicia somente com o segmento 'g'
  digitalWrite(displayLed[6], HIGH);
}

void loop() {
  //Botão foi pressionado
  if (digitalRead(BUTTON) == LOW) {
    DisplayOff();
    //Enquanto o botão estiver pressionado, mantém o display exibindo as voltas
    while (digitalRead(BUTTON) == LOW) {
      DisplayTurns(50);
    }
    //Acelera as voltas no display
    for (int i = 50; i >= 20; i -= 2) {
      DisplayTurns(i);
    }
    //Seleciona um número aleatório e exibe no display
    int n = random(10); //Números de 0 a 9
    DisplayNumber(n);
    delay(500);
    for (int i = 0; i < 6; i++) {
      DisplayOff();
      delay(100);
      DisplayNumber(n);
      delay(200);
    }
  }
}

void DisplayNumber(int num) {
  int number[10][7] = { //Catodo comum
    {1, 1, 1, 1, 1, 1, 0}, //ZERO
    {0, 1, 1, 0, 0, 0, 0}, //UM
    {1, 1, 0, 1, 1, 0, 1}, //DOIS
    {1, 1, 1, 1, 0, 0, 1}, //TRES
    {0, 1, 1, 0, 0, 1, 1}, //QUATRO
    {1, 0, 1, 1, 0, 1, 1}, //CINCO
    {0, 0, 1, 1, 1, 1, 1}, //SEIS
    {1, 1, 1, 0, 0, 0, 0}, //SETE
    {1, 1, 1, 1, 1, 1, 1}, //OITO
    {1, 1, 1, 0, 0, 1, 1}  //NOVE
  };
  if (num > 9) num = 0;
  for (int i = 0; i < 7; i++) { //Apaga todos os segmentos
    digitalWrite(displayLed[i], LOW);
  }
  for (int i = 0; i < 7; i++) { //Acende os segmentos do display referente ao digito
    digitalWrite(displayLed[i], number[num][i]);
  }
}

void DisplayTurns(int delaySpeed) {
  digitalWrite(displayLed[6], LOW);
  for (int i = 0; i < 6; i++) {
    digitalWrite(displayLed[i], HIGH);
    delay(delaySpeed);
    digitalWrite(displayLed[i], LOW);
  }
}

void DisplayOff() {
  for (int i = 0; i < 7; i++) { //Apaga todos os segmentos
    digitalWrite(displayLed[i], LOW);
  }
}

2 comentários:

  1. Tem como fazer números combinados para fazer apostas,, marcar os números para sair mais vezes

    ResponderExcluir
    Respostas
    1. Boa tarde! Sim, mas deixaria de ser aleatório...
      Como nessas máquinas de ganhar celular ou pegar bichinhos de pelúcia que tem nos shoppings, o sistema é preparado para só deixar ganhar após contabilizar "x" vezes o valor dos produtos... Não é sorte e habilidade que faz parecer ser.
      É possível programar para, por exemplo, após 10 números aleatórios, exibir alguma sequencia de números "supostamente sorteado".
      Lembrando que utilizar isso para ludibriar gerando enriquecimento pode ser considerado crime.

      Excluir