Imagem-BANNER-DESTAQUE-BLOG relógio binário arduino

Aprenda a construir um Relógio Binário com Arduino 9

Neste post vamos ver como usar um Arduino para construir um relógio binário. Para manter a data e hora atuais, mesmo com o Arduino desligado, vamos usar um módulo RTC com bateria baseado no circuito integrado DS3231. A apresentação da data e hora será feita em binário, usando um módulo matriz 8×8 de LEDs.

Relógio Binário

Material Necessário

Conhecendo o RTC DS3231

Um RTC (Real Time Clock – Relógio de Tempo Real) é um integrado dedicado à contagem de tempo no formato de dia, mês, ano, hora, minutos e segundos. O DS3231 apresenta uma alta precisão nesta tarefa, graças a um oscilador a cristal interno, com compensação para variações de temperatura.

A interface do DS3231 ao Arduino é feita através de uma interface I2C. O I2C é um padrão que utiliza dois sinais para comunicação (dado e clock), com um sistema de endereçamento (o endereço do DS3231 é 0x68) que permite ligar vários dispositivos aos mesmos dois sinais (em um topologia de “varal”):

O controle do DS3231 é feito através de registradores. Toda operação de leitura ou escrita no RTC é precedida da escrita do número do registrador inicial da transferência, nas transferências de múltiplos bytes o número do registrador é automaticamente incrementado pelo DS3231. Os registradores disponíveis são:

Registradores do relógio binário

No nosso caso vamos usar apenas os registradores de data e hora. Melhor ainda, vamos usar uma das várias bibliotecas disponíveis no Gerenciador de Bibliotecas da IDE do Arduino:

Biblioteca RTC

Na minha montagem eu usei o módulo RTC para o Raspberry Pi, aproveitando que eu tinha um em mãos. Você pode usar o outro módulo RTC DS3231, tomando o cuidado de usar os pinos corretos:

Conhecendo o Módulo Matriz de LED 8×8 com MAX7219

Este módulo possui 64 LEDs, organizados em 8 linhas e 8 colunas. Como controlar tantos LEDs? São LEDs demais para ligar um pino do Arduino a cada LED!

Parte da solução está em interligar os LEDs em linhas e colunas e usar multiplexação. Os LEDs de linhas distintas nunca serão acesos simultaneamente, será feito o controle de uma linha de cada vez, mas tão rapidamente que a nossa vista enxergará como se eles estivessem acesos ao mesmo tempo. Usando esta técnica diretamente, usaríamos 16 pinos do Arduino (um para cada linha e um para cada coluna) e o nosso programa precisaria alterar continuamente estes 16 pinos.

Matriz para o relógio binário

É aí que entra o MAX7219. Ele cuida de todo o processo de ficar ativando uma linha de cada vez e colocar o valor correto em cada coluna. Para isto ele tem 8 registradores, um para cada linha. Cada bit dos registradores corresponde a um LED. Com o MAX7219 basta o nosso programa escrever nos 8 registradores como deve estar cada LED. O MAX7219 tem até o recurso de controlar a intensidade dos LEDs através dos tempos em que os LEDs ficam acesas ou apagados (isto é feito tão rápido que a nossa vista faz uma “média” e tem a impressão que os LEDs estão sempre acesos porém mais fortes ou mais fracos).

Novamente vamos aproveitar uma biblioteca já existente:

Biblioteca matriz de LEDs

Circuito do Relógio Binário com Arduino

A figura abaixo mostra a montagem. Como não são necessários componentes discretos é mais fácil ligar diretamente os módulos sem usar uma protoboard:

Código do Relógio Binário com Arduino

Para usar o código abaixo é preciso instalar as duas bibliotecas mencionadas (o que você pode fazer direto na IDE do Arduino, basta selecionar a biblioteca e clicar no botão “Instalar”).

#include <Wire.h>
#include "DS3231.h"
#include "LedControl.h"

// Matrix de LEDs
const int pinDIN = 5;
const int pinCLK = 7;
const int pinCS = 6;
const int disp = 0;  // Temos só um display
LedControl ml = LedControl(pinDIN, pinCLK, pinCS);

// Relogio
RTClib rtc;
byte bufHora[12]; // ddmmaahhmmss
int iBuf = -1;

// Iniciação
void setup() {
  // Matriz de LEDs
  ml.shutdown (disp,false);  // Liga o display
  ml.setIntensity (disp, 8); // Ajuste a intensidade conforme o seu gosto
  ml.clearDisplay (disp);

  // Relogio
  Wire.begin();

  // Serial
  Serial.begin (115200);
}

// Laço principal
void loop() {
  // O acerto do relógio é feito pela serial
  if (Serial.available()) {
    trataAcerto();
  }
  // Pega a data e hora atual e mostra no display
  DateTime agora = rtc.now();
  ml.setRow (disp, 7, agora.day());
  ml.setRow (disp, 6, agora.month());
  ml.setRow (disp, 5, agora.year() % 100);
  ml.setRow (disp, 3, agora.hour());
  ml.setRow (disp, 2, agora.minute());
  ml.setRow (disp, 1, agora.second());
}

// Tratamento do acerto do relógio
void trataAcerto() {
  int c = Serial.read();

  if (c == '<') {
    // inicio do acerto
    iBuf = 0;
  } else if (c == '>') {
    if (iBuf < 12) {
      // erro
      Serial.print("?");
    } else {
      // recebeu tudo, acertar a hora
      DS3231 Clock;
      Clock.setClockMode(false);  // formato 24h
      Clock.setDate(bufHora[0]*10+bufHora[1]);
      Clock.setMonth(bufHora[2]*10+bufHora[3]);
      Clock.setYear(bufHora[4]*10+bufHora[5]);
      Clock.setHour(bufHora[6]*10+bufHora[7]);
      Clock.setMinute(bufHora[8]*10+bufHora[9]);
      Clock.setSecond(bufHora[10]*10+bufHora[11]);
      Serial.println("Hora acertada!");
    }
    iBuf = -1;
  } else if ((iBuf >= 0) && (iBuf < 12) && (c >= '0') && (c <= '9')) {
    bufHora[iBuf++] = (byte) (c - '0');
  }
}

Resultado do Relógio Binário com Arduino

O programa mostra a data e a hora em binário no display, como indicado abaixo. A conversão de binário para decimal é feita somando os valores dos LEDs acesos (por exemplo, o minuto na figura é 16+4+2 = 22),

Resultado relógio Binário

Para acerta a hora, conecte o Arduino ao computador, abra o Monitor Serial da IDE, selecione a velocidade 115200 bps e digite a data e hora no formato <ddmmaahhmmss>:

Clique no botão enviar para acertar o relógio. Atenção que não é feita nenhuma conferência dos valores informados.

Conclusão e Sugestões

Neste artigo você aprendeu um pouco sobre o uso do relógio de tempo real DS3231 e do uso do MAX7219 controlando uma matriz de 8×8 LEDs montando um relógio “diferentão” com eles. Você pode encontrar mais informações sobre os componentes lendo os respectivos datasheets (links nas páginas dos produtos no site da MakerHero).

Você pode aproveitar estes conhecimentos para criar os seus próprios projetos. Algumas ideias:

  • Usar outras representações para a data ou hora nos LEDs.
  • Acrescentar botões à montagem para acertar a data e hora sem precisar de um PC.
  • Trocar a matriz de LEDs por anéis de LED RGB endereçável.

Gostou deste post sobre como montar um relógio binário com o DS3231 e uma matriz de LEDs? Deixe seu comentário logo abaixo.

Faça seu comentário

Acesse sua conta e participe

9 Comentários

  1. Olá Sr Daniel tudo bem? Enfim consegui fazer funcionar o projeto. Fico muito grato pela sua atenção e prestatividade. Bem, o que fiz foi reinstalar a IDE em um outro diretório e colocar somente as bibliotecas do projeto. Mais uma muito obrigado. Um abç
    Obs. Ficou show.

  2. Olá boa tarde. Estou com dificuldades, o sketch está dando erro. Só gostaria de saber se está tudo ok, sou bem leigo em programação. Obrigado pela atenção.

    1. Qual o erro que está dando?

      1. bom dia. ele está dando a seguinte mensagem:

        In file included from relogio_binario.ino:2:
        D:\Meus documentos\Arduino\libraries\DS3231/DS3231.h:92: error: ‘time_t’ has not been declared

        1. Estranho este erro, pois o time_t está definido em time.h, que é incluído no início do DS3231.h e faz parte dos includes básicos do compilador. Você selecionou a placa “Arduino Uno”? Conferi mais uma vez e aqui compila sem problemas com a IDE 1.8.19 e a versão 1.8.4 do “Arduino AVR Boards” (que são as mais recentes no momento). A única sugestão que tenho é você reinstalar a IDE e as bibliotecas.

          1. Olá boa noite. Haveria possibilidade de me enviar o atmega já com o programa nele aí eu só faria a montagem do circuito? Por favor.

          2. Bom dia Sr Daniel. Esqueça o que eu comentei anteriormente, achei que o Sr fazia parte da empresa que vende os componentes depois que fui observar. Obrigado.

          3. Olá bom dia. desculpe ser chato. o que eu fiz agora foi reinstalar a ide 1.8.19 e depois só acrescentei a biblioteca ds 3231 e led control, e ao compilar esta dando a seguinte mensagem.

            In file included from D:\AlarmClock Example\rel_gio_bin_rio\rel_gio_bin_rio.ino:5:0:
            C:\Users\odilo\Downloads\arduino-1.8.19-windows\arduino-1.8.19\libraries\LedControl/LedControl.h:24:10: fatal error: WConstants.h: No such file or directory
            #include
            ^~~~~~~~~~~~~~
            compilation terminated.
            exit status 1
            Erro compilando para a placa Arduino Uno

          4. Odilon, tenho a impressão que tem alguma coisa bagunçada na sua instalação da IDE, ou na forma como você a está executando. WConstants.h é um include usado nas versões antigas da IDE (anteriores à 1.00) e não deveria ser incluído neste caso. Se você não estiver fazendo isso, experimente clicar diretamente no arduino.exe em C:\Users\odilo\Downloads\arduino-1.8.19-windows\arduino-1.8.19 para iniciar a IDE. Se você já estiver fazendo isso, ou isso não resolver, você pode experimentar ligar nas preferências a opção de mostrar mensagens de saída durante a compilação e ver se tem algo suspeito na saída.