Você está na página 1de 9

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

Deixe um comentário
filipeflop.com/blog/aprenda-a-construir-um-relogio-binario-com-arduino/

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.

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:

1/9
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:

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:

2/9
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.

3/9
É 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:

4/9
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”).

5/9
#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

6/9
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),

7/9
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>:

8/9
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.


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.

9/9

Você também pode gostar