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:


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

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

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

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

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

8 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