- Objetivo
- Componentes Utilizados
- Montagem do Circuito
- Código
- Bibliotecas Utilizadas
- Datasheets
- Resultado Final
- Ideias e sugestões
Após 4 meses de quarentena, eu fui olhar para os componentes eletrônicos que eu tinha sobrando no meu armário e decidi fazer algo de útil com eles. Com isso, me veio a ideia de fazer algo que fosse simples e que tivesse alguma utilidade no meu dia-a-dia, e foi daí que surgiu a idéia de fazer um relógio de parede. Porém, seria simples demais usar apenas um display LCD ou OLED para fazer isso, não seria nenhum desafio e o projeto estaria pronto em 15 minutos, portanto eu decidi utilizar displays de 7-segmentos, pois além serem esteticamente agradáveis e funcionarem de uma maneira bem simples, trabalhar com eles exige mais esforço e trabalho do que os métodos citados anteriormente.
Conhecido como a versão menor do famoso Arduino UNO, o Nano utiliza o mesmo microcontrolador (ATMega328) e possui o formato ideal para ser utilzado em protoboards. Real Time Clock (Relógio de Tempo Real) DS3231 é o coração do projeto. Esse é o componente que é capaz de guardar a hora mesmo sem estar energizado e enviar as informações para o Arduino via I²C. Podem ser usados outros RTCs como o DS1307, porém a minha experiência pessoal com o DS3231 foi bem satisfatória. Esse foi o método escolhido para mostrar o horário. Ele nada mais é do que 8 leds (contando o .) organizados de uma forma propícia para mostrar números e letras. É um decodificador capaz de receber um número de 4-bits e enviar o seu equivalente para o display de 7-Segmentos. Ele apenas funciona para números, ou seja, não é recomendado para mostrar valores em hexadecimal. É um multiplexador de 8 canais utilizado para ativar os transistores e selecionar o display que será ativado. Serve como uma espécie de botão que pode ser ativado eletrônicamente ao invés de fisicamente (como por exemplo um push-button). Resistores servem como limitadores de corrente para que os componentes não queimem, como por exemplo os leds do display de 7-Segmentos. Um protobord serve como uma placa de prototipagem. Eles são usados normalmente apenas como uma plataforma temporária de testes e desenvolvimento, mas nesse caso eu decidi deixar o projeto na protoborad permanentemente, principalmente por causa da estética que eu estava planejando. Porém, caso você queira deixar o projeto com uma cara mais "profissional", o circuito pode ser projetado para ser impresso em uma placa de fenolite e os componentes seriam soldados ao invés de apenas encaixados, o que reduziria interferências e ruídos.No primeiro passo, coloque o Arduino Nano na protoboard no canto esquerdo, apenas para uma noção de espaçamento, pois como veremos, não temos muito espaço extra para trabalhar. Logo após o Arduino, coloque o CD4511 com o entalhe para esquerda e faça as seguintes conexões:
- Pino 3 (LT) -> 5V
- Pino 4 (BL) -> 5V
- Pino 5 (LE) -> GND
- Pino 8 (VSS) -> GND
- Pino 16 (VDD) -> 5V
Para um maior conhecimento do funcionamento do CD4511, leia este exelente artigo, onde é explicado em detalhes a função de cada um dos pinos.

Agora, ligue as saídas do CD4511 ao display. O display deve ficar a 3 espaços de distância para dar espaço ao transistor que será colocado futuramente

Coloque outro display diretamente ao lado do antigo e faça as mesmas conexões feitas no passo anterior

Pule mais três espaços e faça exatamente a mesma coisa, agora todos os displays devem estar interligados entre si. Para garantir que todas as conexões foram feitas corretametne, teste elas com um multímetro.

Agora ligue o GND e o 5V do Arduino nas trilhas corretas do protoboard, são essas conexões que irão energizar o resto do circuito. Depois, conecte os seguintes pinos:
- D2 -> A(7)
- D3 -> B(1)
- D4 -> C(2)
- D5 -> D(6)
Esse é um dos passos mais cruciais para o funcionamento do projeto, pois serão conectados os transistores que servirão de chave 'liga e desliga' dos displays. Siga com cuidado as conexões, elas farão com que a corrente siga o caminho Ânodo > Cátodo > Resistor > Coletor > Emissor > GND e isso ligará o display assim que for aplicada uma corrente na base do transistor correspodente, portanto, cada display terá seu próprio transistor. O resistor utilizado foi de 330 Ohms.
Nos próximos passos o controle dos transistores será projetado.
Conecte o Mux CD4051 diretamente ao lado do display e faça as conexões básicas para que ele funcione corretamente. Para um entendimento mais completo desse CI acesse este site

Nessa parte será projetado o controle dos transistores. Como estão sendo utilizados apenas 4 displays, serão utilizadas apenas 4 saídas do mux CD4051, por consequência, apenas duas de suas entradas. Com isso temos as seguintes conexões:
- D6 -> A(11)
- D7 -> B(10)
- GND -> C(9)
Nesse exemplo pode ser visto como os displays receberão as mesmas entradas, porém só são ligados um de cada vez, mostrando apenas aquilo que é desejado. Se isso for feito em uma velocidade rápida o suficiente essa alternação não será notada, dando uma ilusão de que cada display está sendo controlado individualmente.
Por fim, deve ser conectado o coração do projeto, o RTC. Infelizmente o software utilizado para fazer os circuitos não possui nenhum RTC, portanto foi conectado um dip-switch de 4 chaves, onde cada chave represenda um pino do RTC utilizado:
- 1 -> SDA -> A4
- 2 -> SDL -> A5
- 3 -> VCC -> 5V
- 4 -> VSS -> GND
Baixe e adicione a biblioteca RTCLib.h e já declare o objeto rtc
#include "RTClib.h"
RTC_DS3231 rtc;Defina o intervalo entre a multiplexação dos displays (em ms), pode ser ajustado caso você sinta que o display está 'piscando'
#define DELAY 5Defina as saída do Arduino que serão utilizadas para controlar o CD4511
#define IN_A 2
#define IN_B 3
#define IN_C 4
#define IN_D 5Faça a mesma coisa com o controle do mux CD4051
#define CTL_A 6
#define CTL_B 7Declare dois vetores com os valores definidos acima, isso facilitará o controle dos dos CIs no futuro
int in4511[] = {IN_A, IN_B, IN_C, IN_D};
int ctl[] = {CTL_A, CTL_B};As duas funções a seguir utilizam operações de bits para ligar e desligar as portas certas baseado em valores inteiros, isso pode ser otimizado utilizando diretamente os registradores do microcontrolador <br Como exemplo, será explicada a função writeNumber:
- Digamos que queremos mostrar o número 5 no display
- 5 em binário corresponde à 0101, portando queremos botar os seguintes valores nas entradas do CD4511
- 1 -> A - Entrada menos significativa
- 0 -> B
- 1 -> C
- 0 -> D - Entrada mais significativa
- A entrada A está no in4511[0]
- O valor que queremos botar no A pode ser obtido com a seguite operação
(0101 >> 0) & 0001
0101 & 0001
1
- Isso deslocará o valor 0101 0 vezes para a direita, resultando nele mesmo, e o &0001 extrairá o dígito menos significativo e ignorará os outros
- Repita isso com o próximo valor para botar na entrada B
(0101 >> 1) & 0001
0010 & 0001
0
E assim por diante até extrair o valor de todas as entradas. A mesma lógica se aplica para selecionar o display que deve ser ligado
void
selDisplay(int n)
{
for (int i = 0; i < 2; i++)
digitalWrite(ctl[i], (n >> i) & 1);
}
void
writeNumber(int n)
{
for (int i = 0; i < 4; i++)
digitalWrite(in4511[i], (n >> i) & 1);
}A função abaixo primeiramente separa os valores de hora e minuto em um vetor, por exemplo, 15h24 ficará guardado como
hour[0] = 1
hour[1] = 5
hour[2] = 2
hour[3] = 4Depois disso, são utilzadas as funções explicadas anteriormente
void
writeHour(DateTime now)
{
int horario[4];
horario[0] = now.hour() / 10;
horario[1] = now.hour() % 10;
horario[2] = now.minute() / 10;
horario[3] = now.minute() % 10;
for (int i = 0; i < 4; i++)
{
selDisplay(i);
writeNumber(horario[i]);
delay(DELAY);
}
}Na função setup, é necessário iniciar o rtc declarado inicialmente e declaras as portas utilizadas como saídas
void
setup()
{
/* Inicia o RTC */
rtc.begin();
/* Configura os pinos utilizados como saída */
for (int i = 0; i < 4; i++)
pinMode(in4511[i], OUTPUT);
for (int i = 0; i < 3; i++)
pinMode(ctl[i], OUTPUT);
}Na primeira vez que o programa for rodado, é necessário incluir a linha abaixo na setup para configurar o horário do rtc baseado no horário de compilação do sketch, nas outras vezes que o programa rodar essa linha deverá ser comentada
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));Por fim, na função loop apenas obtemos o horário atual e ele é escrito nos displays
void
loop()
{
/* Obtém o horário atual */
DateTime now = rtc.now();
/* Escreve o horário nos displays de 7-segmentos */
writeHour(now);
}Esse programa ocupa aproximadamente 11% da memória de programa e 11% da memória dinâmica do Arduino, por isso micro-otimizações não foram implementadas, faça as modificações que você desejar para deixar o programa mais compacto e eficiente 😄
| Componente | Preço Individual | Quantidade | Preço Final |
|---|---|---|---|
| Arduino Nano | 44,90 | 1 | 44,90 |
| RTC DS3231 | 17,90 | 1 | 17,90 |
| CD4511 | 4,40 | 1 | 4,40 |
| CD4051 | 3,00 | 1 | 3,00 |
| Transistor BC546 | 0,30 | 4 | 1,20 |
| Display 7-Segmentos Cátodo Comum | 1,50 | 4 | 6,00 |
| Protoboard | 17,90 | 1 | 17,90 |
| 95,30 |
Como resultado final temos um relógio compacto e bonito e de relativamente baixo custo para um projeto DIY, se compararmos com os relógios que utilizam displays OLED ou LCD. O uso de apenas um CD4511 em conjunto com o CD4051 para multiplexar os displays foi uma decisão de projeto que leva à alguns desafios, mas no final apresenta um design compacto inteligente, com capacidade de inserir mais displays com facilidade e pouquíssimas alterações.
- Adicionar um Shift-Register para fazer um design amigável para baterias
- Otimizar o código utilizando diretamente os registradores do ATMega328P
- Trocar o Arduino Nano por um Arduino Mini
- Leds piscando todo segundo como um relógio tradicional
- Adicionar alarmes
- Adicionar outro protoboard e mostrar a data também
- Mostrar o dia da semana com outro display ou com uma barra de Leds
- Utilizar os pinos de BL e LE do CD4511 para implementar o circuito de uma maneira mais eficiente
- Mudar para um Arduino Mini ou Micro para ter mais espaço na protoboard para adicionais mas funcionalidades.




















