relógio binário arduino

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

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 FilipeFlop).

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 (seja criativo e depois coloque uma foto no nosso fórum).
  • 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. Em caso de dúvidas, caso queira trocar uma ideia, ou até mesmo dividir seu projeto, acesse nosso Fórum!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *