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:
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:
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.
É 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:
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),
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.
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.
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.
Qual o erro que está dando?
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
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.
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.
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.
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
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.