Como construir um relógio com Arduino

Como construir um relógio com Arduino

Hoje vamos ver alguns conceitos sobre displays LCD 7 segmentos e mostrar como construir um relógio com Arduino utilizando o display LED 7 segmentos 4 dígitos:

Display 7 segmentos 4 dígitos

Esse display possui leds na cor vermelha e dígitos com 1,4cm de altura. Por meio dos 12 pinos na base podemos controlar individualmente os leds, gerando número e letras no display.

Como funciona um display 7 segmentos

O display de 7 segmentos contém 7 leds (ou segmentos), que acionados em conjunto podem formar os caracteres que precisamos. Basicamente os números e algumas letras. No lado esquerdo da imagem temos a disposição dos segmentos, que são nomeados com as letras de A a G. Para formar o número dois, por exemplo, precisamos acionar os segmentos A, B, D, E e G (lado direito da imagem):

Display - Segmentos

Além disso esse tipo de display pode ser catodo comum (o catodo de todos os leds conectados ao GND), ou anodo comum (o anodo de todos os leds conectados ao Vcc), o que vai influenciar no tipo de ligação que vamos ter com o microcontrolador.

Display 7 segmentos - Catodo comum e Anodo comum

Imagens : electronics-tutorials.ws

Em um display de 4 dígitos  como este que vamos utilizar no artigo, temos também os pinos Digito 1, Digito 2, Digito 3 e Digito 4 (D1, D2, D3 e D3), que correspondem ao anodo de cada dígito, e que são acionados de forma sequencial.

Display 7 segmentos 4 digitos - Pinos

Para mostrar um número no display, acionamos o pino dígito 1 (Dig1), e também os leds correspondentes para formar o número. Em seguida, é feita a mesma coisa com o segundo dígito : desliga-se o dígito anterior (Dig1), liga-se o Dig2 e acende os leds, e assim sucessivamente até o 4° dígito, quando o processo se repete. Usando técnicas de multiplexação, esse processo de acionamento de cada dígito é feito de maneira muito rápida, de forma que não percebemos que o display na verdade está “piscando”.

Circuito display 7 segmentos 4 dígitos

Como exemplo vamos utilizar o display 7 segmentos 4 dígitos e montar um relógio com Arduino usando também o módulo Real Time Clock RTC DS1307, que se comunica com o Arduino pela interface I2C. Do DS1307 vamos obter o valor das horas e minutos, e mostrar essa informação no display.

Os resistores utilizados no circuito são de 1 K, sendo um para cada segmento e um também para acionar o separador (dois pontos) na parte central do display:

Circuito Arduino Uno Display 7 segmentos

A biblioteca responsável por fazer o trabalho de multiplexação é a SevSeg, disponível para download neste link. Descompacte o arquivo e coloque a pasta SevSeg dentro da pasta Libraries da IDE do Arduino.

No início do programa definimos quais serão os pinos dos dígitos (usaremos os pinos de 10 à 13 para os dígitos de 1 à 4), e quais serão os pinos dos segmentos (usaremos os pinos de 2 à 9), sendo que o pino 9 é o responsável por acender o separador (dois pontos). A linha SelecionaDataeHora() é utilizada para acertar a hora do relógio, e deve ser comentada depois de utilizada.

//Programa : Relogio com Arduino, DS1307 e Display 7 Seg
//Autor : FILIPEFLOP

#include "Wire.h"
#include "SevSeg.h"

#define DS1307_ADDRESS 0x68

//Create an instance of the object.
SevSeg display7seg;

int valor = 0;

byte zero = 0x00; 
unsigned long timer;
void setup()
{
  Wire.begin();
  //A linha abaixo pode ser retirada apos setar a data e hora
  // SelecionaDataeHora(); 
 
  //Selecao tipo de display anodo comum
  int displayType = COMMON_ANODE; 
    
  //Definicao dos pinos dos digitos
  int digit1 = 10; //Pino Digito1 do display
  int digit2 = 11; //Pino Digito2 do display
  int digit3 = 12; //Pino Digito3 do display
  int digit4 = 13; //Pino Digito4 do display

  //Pinos ligados aos segmentos A - H
  int segA = 2; //Pino segmento A  
  int segB = 3; //Pino segmento B
  int segC = 4; //Pino segmento C
  int segD = 5; //Pino segmento D
  int segE = 6; //Pino segmento E
  int segF = 7; //Pino segmento F
  int segG = 8; //Pino segmento G
  int segDP= 9; //Pino segmento H
  
  //Define o numero de digitos do display
  int numberOfDigits = 4;

  //Inicializa o display
  display7seg.Begin(displayType, numberOfDigits, digit1, digit2, digit3, digit4, segA, segB, segC, segD, segE, segF, segG, segDP);
  
  //Nivel de brilho do display
  display7seg.SetBrightness(50);
  timer = millis();
}

void loop()
{
  char tempString[10]; //Used for sprintf
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero);
  Wire.endTransmission();
  Wire.requestFrom(DS1307_ADDRESS, 7);
  int segundos = ConverteparaDecimal(Wire.read());
  int minutos = ConverteparaDecimal(Wire.read());
  int horas = ConverteparaDecimal(Wire.read() & 0b111111); 
  sprintf(tempString, "%02d%02d", horas, minutos);
  display7seg.DisplayString(tempString, 3);
}

void SelecionaDataeHora()   //Seta a data e a hora do DS1307
{
  byte segundos = 10; //Valores de 0 a 59
  byte minutos = 32; //Valores de 0 a 59
  byte horas = 19; //Valores de 0 a 23
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero); //Stop no CI para que o mesmo possa receber os dados

  //As linhas abaixo escrevem no CI os valores de 
  //data e hora que foram colocados nas variaveis acima
  Wire.write(ConverteParaBCD(segundos));
  Wire.write(ConverteParaBCD(minutos));
  Wire.write(ConverteParaBCD(horas));
  Wire.write(zero);
  Wire.endTransmission(); 
}

byte ConverteParaBCD(byte val)
{ 
  //Converte o número de decimal para BCD
  return ( (val/10*16) + (val%10) );
}

byte ConverteparaDecimal(byte val)  
{ 
  //Converte de BCD para decimal
  return ( (val/16*10) + (val%16) );
}

Na imagem abaixo temos o circuito em funcionamento.

Tutorial Relógio com Arduino

Gostou? Ajude-nos a melhorar o blog atribuindo uma nota a este tutorial (estrelas no final do artigo) e visite nossa loja FILIPEFLOP!

7
Como construir um relógio com Arduino
115 votos, 4.76 classificação média (95% pontuação)

Formado em Ciência da Computação pela Universidade de Mogi das Cruzes, atualmente responsável pelo departamento técnico da FILIPEFLOP.

Compartilhe este Post

78 Comentários

  1. diones - 27 de maio de 2017

    por que o meu não acende os pontos decimais, como faço para acender os dois pontos, o display e anodo comum.

  2. Concorra a um Kit completo de Sensores | Blog FILIPEFLOP - 21 de março de 2017

    […] precisa ser regada? Ou um alarme de incêndio para sua casa? Você também pode desenvolver um relógio e até um bafômetro . Curtiu? Então participe da promoção e leve o seu kit na […]

  3. Alexis - 20 de janeiro de 2017

    Boas, o meu display fica mostrando 0.0.0 0 alguém pode ajudar? sff

  4. Daniel Fernandes - 5 de dezembro de 2016

    Uma sugestão, seria usar GPS, só não sei como fazer isso no código mas, fica aí a sugestão!

  5. thiago - 5 de novembro de 2016

    Ola amigo, como eu faria usando um display catodo comum? é da mesma forma? obrigado

  6. Daniel Fernandes - 21 de outubro de 2016

    Olá amigo Adilson e os demais leitores!
    Eu entendo que nem vc e nem os demais leitores não tem a mínima obrigação de estar respondendo comentários/perguntas mas, se vc(s) puder(em) me ajudar, eu repetirei a minha questão: “O meu Display (Anodo Comum de 12 pinos) funcionou tudo, menos os 2 pontos (DP), que não acendem; o que mudei foi somente o módulo DS3231 que usei no lugar do DS1307; Alguma orientação?
    Obrigado

  7. Daniel Fernandes - 6 de outubro de 2016

    Olá Adilson!
    O meu Display funcionou tudo, menos os 2 pontos (DP) que não acendem;
    Somente usei o módulo DS3231 no lugar do DS1307; Alguma orientação?
    Obrigado

  8. odilon - 14 de setembro de 2016

    Olá bom dia. daria pra implementar botões de ajuste nesse relógio. e se sim de que forma. eu sou leigo em programação. obrigado pela atenção.

  9. JAIRO - 23 de agosto de 2016

    Galera uma duvida, alguém poderia me informa como incluir no código e na placa do Arduíno ja que todas as saídas ja estão sendo usada um sensor de temperatura LM35?

  10. THULIO MARCUS MARCENES DE SOUZA - 25 de julho de 2016

    Qual o pino para acionar os dois pontos??

  11. Jailton Soares - 24 de julho de 2016

    Boa tarde

    Parabéns pelo blog, Estou necessitando de um cronometro com display de 7 segmentos.
    Você tem algum projeto?
    abrs

  12. paulo - 8 de julho de 2016

    se eu usar um 1302 como fica?

  13. Kalan Felipe Trentin - 15 de junho de 2016

    Olá!

    Estou com um problema, preciso ligar o relógio em outras entradas analógicas pois a A4 e A5 já estou utilizando para outro sensor, como eu faço isso?

    Att.

  14. murilo marconato - 10 de junho de 2016

    Olá Gostaria de saber como fazer os pontos piscarem e como fazer mostrar mostrar a temperatura lm35 se puder ajudar ficaria grato.

    • Julio Guarará - 16 de outubro de 2016

      Para fazer os pontos piscarem:

      byte savesegundos; //Julio Guarará

      //display7seg.DisplayString(tempString, 3); //Julio Guarará
      display7seg.DisplayString(tempString, 0); //Julio Guarará

      if (segundos != savesegundos) { // Julio Guarará – Inicio
      display7seg.DisplayString(tempString, 3);
      savesegundos = segundos;
      } // Julio Guarará – Fim

      • Daniel Fernandes - 29 de outubro de 2016

        Oi Julio! Onde no código eu posso adicionar esses comandos q vc mencionou?
        Eu coloquei logo após esses comandos, assim:
        / / As linhas abaixo escrevem no CI os valores de
        / /data e hora que foram colocados nas variáveis acima
        Wire.write(ConverteParaBCD(segundos));
        Wire.write(ConverteParaBCD(minutos));
        Wire.write(ConverteParaBCD(horas));
        Wire.write(zero);
        Wire.endTransmission();
        }

        / /Para fazer os pontos piscarem:

        byte savesegundos; //Julio Guarará

        / /display7seg.DisplayString(tempString, 3); //Julio Guarará
        display7seg.DisplayString(tempString, 0); //Julio Guarará

        if (segundos != savesegundos) { // Julio Guarará – Inicio
        display7seg.DisplayString(tempString, 3);
        savesegundos = segundos;
        } / / Julio Guarará – Fim

        … e apresentou o seguinte erro: clock_arduino:91: error: ‘display7seg’ does not name a type
        clock_arduino:93: error: expected unqualified-id before ‘if’
        ‘display7seg’ does not name a type

        O que fiz de errado, por favor? Obrigado

  15. murilo marconato - 6 de junho de 2016

    ola amigos montei conforme esquema mas o meu fica tudo aceso ate os pontos sera que tem algo errado me ajudem

    • Adilson Thomsen - 7 de junho de 2016

      Boa tarde Murilo,

      O seu display é do mesmo modelo usado no post ?

      Abraço.

      Adilson – Equipe FILIPEFLOP

      • murilo - 7 de junho de 2016

        Boa tarde então eu acabei de descobrir mudando a linha de anodo pra catodo ele funcionou porem surgiu outra duvida os pontos ficam acesos tem como eles piscarem você pode me passar como faço pra colocar o valor do sensor de temperatura tbem obrigado pela atenção.

  16. FAGNER LEITE - 17 de abril de 2016

    Olá, algum colega sabe como faço para usar este display para mostrar a temperatura controlado por um sensor de temperatura

  17. jefferson - 31 de março de 2016

    posso fazer sem o modulo RTC DS1307 como seria sem este modulo ?

  18. tonio - 30 de março de 2016

    fiz o relogio e funcionou perfeitamente, o que eu queria era colocar ele maior tipo fita de led.
    será que tem jeito.

    obrigado.

  19. odilon - 21 de março de 2016

    olá pessoal. eu tenho uma dúvida de como acertar o relógio e pelo que andei pesquisando muita gente encontra dificuldade nisso. no programa diz que pode retirar a linha depois que acertar o relógio. mas em que linha, de que forma e como se acerta esse relógio. alguem poderia me passar detalhadamente por favor
    ficarei muito agradecido.

    • Luis Antonio - 23 de março de 2016

      Odilon,

      A linha 20 do programa está como comentário dentro da rotina void setup(), por isto possui duas barras / / :

      // SelecionaDataeHora();

      Aqui há alguns conceitos de programação do Arduino:

      1) A rotina void setup() é executa apenas uma vez ao se ligar o Arduino ou após resetá-lo.
      2) Após isto apenas é repetido indefinidamente a rotina void loop().
      3) As dua barras indicam que tudo que estiver a sua frente, será entendido como comentário não sendo executada sua compilação como comando de execução de alguma tarefa e por isto você tem que retirá-las para execução do ajuste das horas.

      Deste modo, para acertar o relógio, retire as duas barras, ficando assim:
      SelecionaDataeHora();

      Esta linha chama a subrotina que ajusta o relógio:
      void SelecionaDataeHora()

      Nesta subrotina, ajuste as varíaveis a seguir com a hora, minuto e segundo de sua hora local.

      Por exemplo, se agora for 21:13 horas, ajuste para:

      byte segundos = 00; //Valores de 0 a 59
      byte minutos = 13; //Valores de 0 a 59
      byte horas = 21; //Valores de 0 a 23

      Agora compile e carregue o programa para o Arduinio.

      Assim que ele executar o programa a primeira vez, a hora ajustada será gravada no RTC DS1307 e este modulo tem a capacidade de manter a hora correta mesmo sem energia do Arduinio uma vez que o mesmo possui uma bateria e, portanto, não será mais necessário realizar seu ajuste toda vez que religar o Arduino.

      Por isto é importante que após o primeiro carregamento deste programa, você volte a comentar a linha 20 para não mais ser executado a rotina de ajuste de horas:

      // SelecionaDataeHora();

      Recompile e recarregue o programa.

      Pronto !

      Parece um pouco complicado, mas na verdade é muito simples de ser feito.

      Se algum dia precisar reajustar o RTC, repita este procedimento.

      Esperto ter ajudado.

      Luís Antonio

      • odilon - 24 de março de 2016

        Bom dia Luis. agora sim entendi a explicação. fiz e deu certo. estava difícil pra entrar na minha cabeça. vlw . muito obrigado mesmo.

      • odilon - 24 de março de 2016

        Olá novamente Luis. me diga uma coisa. como é que eu faço apagar o ponto decimal. é que o meu display é aquele que tem um ponto decimal após cada dígito. assim eu gostaria de apagar o ponto decimal que está aceso após o primeiro dígito.

        • Luis Antonio - 24 de março de 2016

          Odilon,

          Se você estiver utilizando o display (anodo comum) indicado para este programa, desconecte o pino 9 do Arduino que está conectado ao pino 3 do display.

          Caso esteja utilizando outro display, é necessário verificar o seu Datasheet / Diagrama.

          Att.,
          Luís Antonio

          • odilon - 28 de março de 2016

            Olá bom dia.
            Só que se eu desligar o pino 9 todos os pontos decimais apagarão porque são multiplexados. eu quero desligar só um deles ok.

  20. odilon - 11 de março de 2016

    olá pessoal. fiquei na dúvida quanto ao display de anodo comum ou katodo comum. esse do projeto é qual deles?

  21. Wesley Ribeiro - 11 de fevereiro de 2016

    Montei o circuito seguindo os passos acima, porém meu display só apresenta a hora 45:16, e não muda.
    Estou usando o arduino Mega 2560.
    O que pode ser?

    • Jefferson Pereira - 12 de março de 2016

      Você esta utilizando o Real Time Clock RTC DS1307 ou descomentou a linha 20?

      • odilon - 22 de março de 2016

        olá jefferson. me diga uma coisa. em que linha eu acerto o relogio, como faço, de que forma,
        qauais são todos os procedimentos. e essa linha pra descomentar tem que apagá-la é isso. se puder me passar detalhado eu agradeço.

    • Renato - 22 de março de 2016

      Olá amigo, estou com o mesmo problema, o display mostra 45:16, mais quando conecto o timer rtc, o display forma 0000. Encalhei aqui e não consigo sair do lugar he,he!. Infelizmente as respostas do Felipeflop não me ajudaram em nada. Você conseguiu resolver o problema? Se puder me ajudar eu agradeço.

  22. Samuel Rios Carvalho - 11 de fevereiro de 2016

    Equipe da filipeflop, da uma ajuda.

    preciso utilizar 2 portas analógicas no lugar de digitais. quando coloco A6 e A7 não funciona.
    como poderia fazer pra que portas analógica funcione?

    valeu

    • FILIPEFLOP - 11 de fevereiro de 2016

      Bom dia Samuel,

      Qual placa Arduino você está usando ?

      Abraço.

      Adilson – Equipe FILIPEFLOP

      • Samuel Rios Carvalho - 11 de fevereiro de 2016

        Opa Edilson,

        estou usando um Mini Pro. Li na documentação que as portas A6 e A7 do Mini Pro são somente Analogicas, não é possivel dar uma digitalWrite nelas.
        Eu tinha a opção de alterar a biblioteca do sevseg ou então alterar para as porta A4 e A5. Alterei as portas para A4 e A5.

        obrigado.

  23. jairo - 25 de janeiro de 2016

    boa tarde, porque vocês respondem algumas duvidas e outras nao?

  24. jairo - 17 de janeiro de 2016

    tenho a mesma duvida do amigo, gostaria de usar fita led com tip 120 ou unl2003 porem gostaria de saber o codigo pois cada segmento tera que ser controlado por uma saída do arduino ou usando um 74hc545

  25. Paulo Roberto de Souza - 11 de novembro de 2015

    tem como aumentar a quantidade de displays, parabens pelo projeto

  26. Jorge - 10 de agosto de 2015

    Ola boa tarde.
    O meu stkech esta dando erro nesta comando

    int displayType = COMMON_ANODE;

  27. ricardo - 9 de agosto de 2015

    Olá, gostaria de ajuda para ligar seis displays de 7 segmentos ao arduino, e que seja possivel, controlar cada um individualmente.
    Agradeço a ajuda.

  28. LUIZ - 25 de junho de 2015

    Boa noite. Fiz uma simulação no Proteus, somente para ver como ele apareceria, porém não funcionou, nem ao menos os displays ligaram. Refiz o circuito todo 2 vezes e ambos ficaram iguais. Isso poderia ser apenas um erro do programa(Proteus)?

  29. Sérgio Eli Vieira - 16 de junho de 2015

    Excelente. Obrigado.

  30. Sérgio Eli Vieira - 4 de junho de 2015

    Boa noite pessoal. Tenho uma dúvida que, se solucionada, vai ser útil a muitos leitores.
    Meu relógio com o display está funcionando perfeitamente. Adotando o mesmo principio gostaria de construir um relógio maior, seguindo o esquema do display, substituindo cada led de cada segmento por uma fita de led. Sei que o arduino não vai suportar a carga, pensei então em usar um TIP120, mas não sei como fazer as ligações. Como meus conhecimentos em eletrônica são limitados, gostaria de saber se alguém pode me ajudar. Obrigado.

  31. Sérgio Eli Vieira - 27 de maio de 2015

    Pessoal, sou leigo e estou começando o estudo sobre Arduino. Gostaria de saber como poderia intercalar a visualização da hora e temperatura no display? Abraço.

  32. Wellington Felix - 25 de maio de 2015

    Boa tarde, gostaria de uma ajuda não sou especialista em programação
    mais quando efetuei o programa existente no site ai e mandei compilar, ele ocorreu um erro
    o erro é este abaixo:

    Arduino: 1.6.4 (Windows 7), Placa:”Arduino Uno”

    Opções de compilação alteradas, recompilando tudo

    Usando biblioteca Wire na pasta: C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire

    C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10604 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR -IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino -IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard -IC:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire C:\Users\W\AppData\Local\Temp\build412406762290641630.tmp\cronometro.cpp -o C:\Users\W\AppData\Local\Temp\build412406762290641630.tmp\cronometro.cpp.o

    cronometro.ino:5:20: fatal error: SevSeg.h: No such file or directory
    compilation terminated.
    Erro compilando.

    Se alguem puder me ajudar corrigir este erro

    Obrigado!

  33. Marcos Trindade - 10 de maio de 2015

    Olá amigos, como posso sincronizar as horas e data deste relógio pelo shield GPS? Desta forma não precisaria de ajustes.

  34. Cassio - 22 de abril de 2015

    Pessoal, estou buscando ajuda para entender o problema dos 5V do DS1307, quando conectado aos Raspberry PI, que usam 3,3 no SDA e no SCL (segundo o que tenho lido). Há 5V no Raspberry PI também, no entanto, há alguns sites na Internet alertando para a retirada de dois resistores que ficam no DS1307 (R2 e R3), a fim de não haver danos elétricos ao RPI. Então, a ajuda que procuro é: alguém já vivenciou o uso do DS1307 em Raspberry PI, principalmente em relação aos resistores. A propósito, quando digo DS1307 me refiro ao TinyRTC que comprei aqui no site. Obrigado.

  35. Rômulo - 14 de abril de 2015

    Só eu que vomito quando olho pra displays multiplexados assim? :D

  36. WILSON - 13 de abril de 2015

    MUITO BOM O TRABALHO MUITO EXPLICATIVO FÁCIL DE ENTENDER
    MEUS PARABÉNS

  37. Carlos Alexandre - 13 de abril de 2015

    Poxa que legal, consigo fazer meu próprio relógio gastando menos de R$30 :)

Deixe uma resposta