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 ao projeto 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.



/*---------------------------------------------------------
  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);
  }
}

Nenhum comentário:

Postar um comentário