Skip to content

Clock made with an arduino nano and 7-segment displays (and 4511 & 4051)

Notifications You must be signed in to change notification settings

jbcznsk/7-segment-clock

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

33 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

7-segment-clock

Relógio feito com Arduino Nano e Displays de 7 Segmentos.

Sumário

Objetivo

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.

Componentes utilizados

Arduino Nano

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.

RTC DS3231

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.

Display 7-Segmentos Cátodo Comum

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.

CD4511

É 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.

CD4051

É um multiplexador de 8 canais utilizado para ativar os transistores e selecionar o display que será ativado.

Transistor NPN

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

Resistor

Resistores servem como limitadores de corrente para que os componentes não queimem, como por exemplo os leds do display de 7-Segmentos.

Protoboard

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.

Montagem do Circuito

1º Passo

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.

2º Passo

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

3º Passo

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

4º Passo

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.

5º Passo

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)

6º Passo

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.

7º Passo

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

8º Passo

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)

Depois disso as saídas do mux devem ser ligadas as bases dos transistores na ordem correta de ativação. Para isso, confira o a imagem abaixo ou o datasheet do CD4051, que pode ser encontrado no final da página. Nessa imagem os transistores foram retirados apenas para uma maior clareza, o circuito final pode ser encontrado no final desse passo.

- Exemplo MUX
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.

9º Passo

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

Com tudo isso pronto, agora só falta programar o Arduino Nano para que ele controle corretamente as entradas dos ICs e portanto o projeto seja finalizado.

Código

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 5

Defina 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 5

Faça a mesma coisa com o controle do mux CD4051

#define CTL_A 6
#define CTL_B 7

Declare 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] = 4

Depois 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 😄

Bibliotecas Utilizadas

Datasheets

Preço

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

Resultado Final

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.

Ideias e sugestõ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.

About

Clock made with an arduino nano and 7-segment displays (and 4511 & 4051)

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages