25 de agosto de 2013

Relógio Binário

Vamos exercitar a cachola e visualizar as horas no relógio binário!


Como já está mostrando no vídeo, as horas são exibidas na primeira linha de leds, os minutos na linha do centro e os segundos na linha de baixo.
Temos dois push-buttons no circuito para o ajuste de horas e minutos. Como o controle de horas está sendo feito somente pelo microcontrolador sem um circuito RTC, sempre que desligarmos a alimentação será necessário o ajuste do relógio.

Segue o esquema elétrico e o código fonte:
  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
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
/*---------------------------------------------------------
  Programa : RELÓGIO BINÁRIO
  Autor    : Fellipe Couto [ http://www.efeitonerd.com.br ]
  Data     : 11/05/2013
  ---------------------------------------------------------*/

/*----- VARIAVEIS -----*/
long previousMillis = 0;
long interval = 1000;
int hour = 0;
int minute = 0;
int second = 0;
int ledHour[5] = {1, 2, 3, 4, 5}; //Leds das horas
int ledMinute[6] = {6, 7, 8, 9, 10, 11}; //Leds dos minutos
int ledSecond[6] = {12, 13, 14, 15, 16, 17}; //leds dos segundos

/*----- SETUP -----*/
void setup() {
  for (int i = 0; i < 5; i++) {
    pinMode(ledHour[i], OUTPUT);
  }
  for (int i = 0; i < 6; i++) {
    pinMode(ledMinute[i], OUTPUT);
    pinMode(ledSecond[i], OUTPUT);
  }
}

/*----- LOOP PRINCIPAL -----*/
void loop() {
  unsigned long currentMillis = millis();

  //Intervalo de 1 segundo
  if (currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;

    if (analogRead(4) == 1023) { //Ajuste de horas
      hour++;
      second = 0;
    }

    if (analogRead(5) == 1023) { //Ajuste de minutos
      minute++;
      second = 0;
    }

    clockDec(); //Relógio decimal
    clockBin(); //Relogio binario
  }
}

/*----- RELOGIO DECIMAL -----*/
void clockDec() {
  second++;
  if (second == 60) {
    second = 0;
    minute++;
  }
  if (minute == 60) {
    minute = 0;
    hour++;
  }
  if (hour == 24) {
    hour = 0;
  }
}

/*----- RELOGIO BINARIO -----*/
void clockBin() {
  //Segundos
  for (int j = 0; j < 6; j++) {
    if (decToBin(second, 6).substring(j, j + 1) == "0") {
      digitalWrite(ledSecond[j], LOW);
    }
    else {
      digitalWrite(ledSecond[j], HIGH);
    }
  }
  //Minutos
  for (int j = 0; j < 6; j++) {
    if (decToBin(minute, 6).substring(j, j + 1) == "0") {
      digitalWrite(ledMinute[j], LOW);
    }
    else {
      digitalWrite(ledMinute[j], HIGH);
    }
  }
  //Horas
  for (int j = 0; j < 5; j++) {
    if (decToBin(hour, 5).substring(j, j + 1) == "0") {
      digitalWrite(ledHour[j], LOW);
    }
    else {
      digitalWrite(ledHour[j], HIGH);
    }
  }
}

/*----- CONVERTE DECIMAL PARA BINARIO -----*/
String decToBin(int num, int qtd) {
  //Retorna uma string de 'qtd' posições.
  int zeros = qtd - String(num, BIN).length();
  String str;
  for (int i = 0; i < zeros; i++) {
    str = str + "0";
  }
  return str = str + String(num, BIN);
}

Nova postagem:
Relógio Binário de Mesa

10 comentários:

  1. Oi Fellipe, gostaria de saber se você teria uma opção de relogio binario para uma matriz de 5x7

    ResponderExcluir
  2. Boa noite Felipe, gostaria saber se o relógio funcionou corretamente. Poderias dizer a lista de materiais usados, me pareceu muito interessante.
    Fico aguardando a tua resposta, meu email é choyosc@gmail.com
    Um grande abraço
    Christian

    ResponderExcluir
    Respostas
    1. Oi Christian! Bom dia!
      O relógio funciona sim! Como está no vídeo.
      Como não fiz o circuito com RTC, se desligar terá que fazer o ajuste das horas novamente.
      Os componentes utilizados são os descritos na imagem do esquema elétrico. Leds, resistores de 220 ohms e 10Kohms, dois botões para ajustes de hora/minuto, e um arduino. Arduino pode ser montado stand-alone (recomendo assim).
      Abraços!

      Excluir
  3. Este comentário foi removido pelo autor.

    ResponderExcluir
  4. om dia amigo,

    Estou iniciando agora no "mundo" do Arduino e estou com uma dúvida; Você citou que está usando um Arduino montado stand-alone, por acaso o modelo seria Atmega328 Bootloader Gravado?

    Posso substituir nesse caso, por Arduino Uno R3 Rev3 Atmega32?

    Muito obrigado.

    ResponderExcluir
    Respostas
    1. Bom dia!
      Isso mesmo. Stand alone é o arduino funcionando montado fora da placa Arduino.
      Poderia montar utilizando o Arduino Uno, ou qualquer modelo de Arduino baseado no ATmega.
      Abraços!

      Excluir
  5. Boa Tarde amigo,

    Gostaria de tirar mais uma dúvida;

    Estou utilizando o AutoDesk Circuits (https://circuits.io), para simular o Relógio Binário, e estou com um problema; Ao Executar a Simulação do circuito (Start Simulation), o AutoDesk executa a aplicação utilizando milionésimos de segundos, o que além de demorar para ascender os LED's (por exemplo, para executar 1 segundo a aplicação demora em torno de 23 segundos), alguns LED's simplesmente não acendem devido a conversão binária dos milionésimos de segundos.

    Sabe me dizer no Arduino essa execução de milionésimos de segundos é padrão, ou é somente no AutoDesk Circuits?

    Observei que em alguns fontes de Relógio Binário, os programadores utilizam o comando delay.

    Obrigado desde já.

    ResponderExcluir
  6. Olá Fellipe, tenho um cubo de led 4x4x4 funcionando, gostaria de saber se é possível fazer esta programação do relógio binário para rodar no cubo, sendo que as quatro fileiras ligariam simultaneamente, olhando a face superior do cubo poderiamos ver as hora em binário. O que acha? Aguardo resposta, obrigado.

    ResponderExcluir
    Respostas
    1. Bom dia!
      É possível. Algumas mudanças, pois nesse somente os leds do circuito são ativados e para o cubo seria necessário utilizar o valor de clockBin() para jogar na matriz de leds.

      Excluir