Como construir um relógio com Arduino 79

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.

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!

Posts Relacionados

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

79 Comentários

  1. Poxa que legal, consigo fazer meu próprio relógio gastando menos de R$30 🙂

    1. Parabéns pelo blog, tem me ajudado muito.

      Tem como pegar a hora através do shiel ethernet através do javascript e passar para uma variável no arduino.

      Obrigado.

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

  3. Só eu que vomito quando olho pra displays multiplexados assim? 😀

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

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

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

    C:Program Files (x86)Arduinohardwaretoolsavr/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)Arduinohardwarearduinoavrcoresarduino -IC:Program Files (x86)Arduinohardwarearduinoavrvariantsstandard -IC:Program Files (x86)ArduinohardwarearduinoavrlibrariesWire C:UsersWAppDataLocalTempbuild412406762290641630.tmpcronometro.cpp -o C:UsersWAppDataLocalTempbuild412406762290641630.tmpcronometro.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!

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

    1. Bom dia Sérgio,

      Você vai precisar de algum tipo de sensor de temperatura, como o DHT11, DHT22 ou o DS18B20, por exemplo. Na programação, você pode criar uma subrotina para mostrar a temperatura, e acionar essa subrotina em intervalos específicos (2, 3, 5, 10 segundos, etc).

      Abraço

      Adilson – Equipe FILIPEFLOP

      1. Boa noite,
        como vocês fazem para que os números sejam diferentes em cada dígito do display?
        Por exemplo, se eu quisesse o número 1 no primeiro dígito, acenderia os segmentos B e C, e o número 8 no segundo dígito, acenderia todos os segmentos, entao, no primeiro dígito também apareceria 8, e não 1, já que estou setando os pinos de todos os segmentos para HIGH, além dos pinos dos dígitos 1 e 2…

        Obrigado

        1. Boa tarde Alexandre,

          Sim, o que fazemos é usar multiplexação, selecionando um dígito de cada vez e acendendo os segmentos correspondentes. Quem faz esse trabalho é a biblioteca SevSeg.

          Abraço.

          Adilson – Equipe FILIPEFLOP

      2. Ola luiz, parabens pelo seu projeto, teria como me passar detalhes da montagem, e o sketch ?
        Grato, Mario.

        1. Olá, Mário, boa tarde,

          Obrigado por ter gostado do meu projeto!
          Todos os detalhes que tenho eu disponibilizei no site do Instructables onde há o diagrama de montagem na Protoboard, lista de peças, datasheets, programa do Arduino, enfim, tudo que precisa para replicar este projeto.

          Att.,
          Luís Antonio Silva

      3. Ola Luis Antonio G. Silva nao vie o código no instructables, como faço para em vez de usar o display usa leds?

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

    1. conseguio fazer?

  9. Excelente. Obrigado.

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

    1. Bom dia Luiz,

      Provavelmente algum erro ou particularidade do Proteus, já que esse circuito foi testado na protoboard.

      Abraço.

      Adilson – Equipe FILIPEFLOP

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

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

    int displayType = COMMON_ANODE;

    1. Boa tarde Jorge,

      Que erro ele apresenta ?

      Abraço

      Adilson – Equipe FILIPEFLOP

      1. Ola
        Quando vo copilar o codigo ele para nesse erro
        int displayType = COMMON_ANODE;
        Grato

        1. Ola
          Resolvido, a minha biblioteca do seg estava diferente.
          Porem agora como posso acertar a hora ?

          1. Ola
            Nossa pena que não posso apagar meu post, fui ver o código e vi como acertar a hora.
            Grato.

          2. Bom dia Jorge,

            Sem problemas. 🙂

            Abraço!

            Adilson – Equipe FILIPEFLOP

          3. Rapaz, aqui tá dando o mesmo erro… qual biblioteca que deu certo?

          4. Como você acertou a hora?
            Obrigado.

          5. Bom dia Alexandre,

            Retire o comentário da linha 20, e coloque as informações de data e hora na rotina SelecionaDataeHora() (linha 66). Carregue o programa no Arduino.

            Quando a hora estiver correta, volte a comentar a linha 20 e carregue o programa novamente. Isso manterá o relógio atualizado.

            Abraço!

            Adilson – Equipe FILIPEFLOP

          6. Obrigado, deu certo.

          7. Boa noite Jorge, pode me ajudar acertar a hora? Tem como explicar o que você fez?
            Porque eu já revisei varias vezes e não entendi como acertar esse relógio.
            Agradeço.

  13. tem como aumentar a quantidade de displays, parabens pelo projeto

    Paulo Roberto de Souza
  14. 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

  15. Posso usar o ci ds1305?

    1. Boa tarde Jean,

      Você pode montar com o DS1305, mas a biblioteca é diferente e a pinagem também, mas é uma outra opção de RTC.

      Abraço.

      Adilson – Equipe FILIPEFLOP

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

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

    1. Bom dia Samuel,

      Qual placa Arduino você está usando ?

      Abraço.

      Adilson – Equipe FILIPEFLOP

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

  18. 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?

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

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

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

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

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

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

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

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

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

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

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

    obrigado.

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

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

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

    1. Boa tarde Murilo,

      O seu display é do mesmo modelo usado no post ?

      Abraço.

      Adilson – Equipe FILIPEFLOP

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

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

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

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

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

    Kalan Felipe Trentin
    1. Bom dia Kalan,

      Você pode usar o mesmo barramento I2C para ligar o RTC (se ele for I2C). Veja um exemplo de ligação neste post: http://www.arduinoecia.com.br/2015/04/arduino-lcd-16×2-modulo-i2c-rtc-ds1307.html

      Abraço!

      Adilson – Equipe FILIPEFLOP

  27. se eu usar um 1302 como fica?

  28. Boa tarde

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

    1. Olá, Jailton.

      Tenho um projeto de um cronômetro bem fácil para montar que inclui um marcador de tempo de volta.
      Utilizei um display de LED de 7 Segmentos duplo.
      Pode ser um ponto de partida ao seu projeto..
      Dê uma olhada aqui para ter todos os detalhes:
      http://www.instructables.com/id/Stopwatch-Lap-Time-With-Arduino-Nano-and-Maxi-7219/
      Veja também o video mostrando seu funcionamento:
      https://www.youtube.com/watch?v=XyMO8Rvyss0

  29. Qual o pino para acionar os dois pontos??

    THULIO MARCUS MARCENES DE SOUZA
  30. 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?

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

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

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

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

    1. Olá bom dia. mude a linha 23 para common cathode ok. comigo deu certo abç

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

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

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

  38. Ola bom dia estou com um projeto em andamento esta faltando o controle eletrônico, peço se alguém montar o sistema, além de pagar eu agradeço muito, preciso de um relógio arduino ou outro qualquer que acione um rele nas horas cheias, mas com a seguinte configuração além de acionar nas horas acionar a quantidade de horas.
    Ex: 1 hora acionar uma vez, 12 horas acionar 12 vezes, não é necessário 24 horas

Trackbacks and Pingbacks

  1. […] 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 […]