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 pela primeira fileira de leds, no meio exibe os minutos, e a última os segundos.

Temos dois push-buttons no circuito para o ajuste de horas e minutos.

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
    Respostas
    1. Olá! Boa tarde!
      Não fiz para matriz.
      Abraços!

      Excluir
  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