Relógio com o módulo RTC DS1307 e LCD 20×4 74

Aqui no blog já trabalhamos anteriormente com o módulo RTC DS1307, mostrando como ligar o módulo ao Arduino e exibir as informações de data e hora no serial monitor. Agora nesse post, vamos utilizar como base esse mesmo artigo (Relógio com o módulo RTC DS1307) e exibir essas informações em um Display LCD 20×4, deixando o nosso relógio muito mais profissional.

Conectando DS1307 e Display ao Arduino

O Display LCD 20×4 possui a mesma pinagem dos displays LCD 16×2 que usamos anteriormente em outros artigos, portanto a ligação será a mesma. Observe atentamente a pinagem do módulo DS1307 para não inverter nenhum fio. Na dúvida, consulte o artigo anterior:

 

Circuito Arduino - DS1307 - LCD 20x4

Programando Relógio Arduino com DS1307

O programa usa a biblioteca Wire, já presente na IDE do Arduino. Para setar a data e a hora, altere o valor das variáveis segundos, minutos, horas, diadasemana, diadomes, mes e ano, entre as linhas 32 e 38. Definido o horário, retire o comentário (barras duplas) da linha 21 abaixo:

// SelecionaDataeHora(); 

Carregue o programa no Arduino e volte a comentar a linha acima, para que os dados do relógio se mantenham atualizados.

Uma sugestão de utilização é alterar o programa para que ele mostre na tela, alternadamente, as informações de data e hora, ou até mesmo informações sobre as outras portas do Arduino.

Gostou ? Ajude-nos a melhorar o blog atribuindo uma nota aos posts (estrelas no início ou no final do artigo) e visite nossa loja FILIPEFLOP !

Posts Relacionados

74 Comentários

  1. Eu, gostaria de saber se dá para colocar um no relógio.

    claudio olímpio da silva
    1. Bom dia Claudio,

      Qual tipo de relógio ?

      Grato.

      Adilson – Equipe FILIPEFLOP

  2. Ótimo post. Eu gostaria de saber aonde eu posso encontrar o sensor de temperatura.

    1. Boa noite Eric,

      Ainda não temos esse componente disponível na loja FILIPEFLOP. Já vi alguns desses sensores DS18B20 no Mercado Livre.

      Abraços.

      Adilson – Equipe FILIPEFLOP

  3. Caro Filipe, preciso acionar um rele com horário marcado, mas no código acima não sei qual variável ou função me dariam essa possibilidade. Gostaria de uma ajudinha se possível.
    Att. João

    João Airton Bitencourt
    1. Boa noite João,

      Essa biblioteca não tem a função de alarme. Nossa sugestão é montar algum tipo de comparador com o valor de rtc.getTimeStr(), por exemplo, que é a hora atual.

      Adilson – Equipe FILIPEFLOP

    2. Olá joão tudo bem ? tambem estou tentando fazer isso a um bom tempo mas ainda não consegui , se voce teve sucesso e puder me ajudar com o codigo agradeço.
      OBRIGADO

  4. OLÁ . O meu arduíno é o Mega. No código vc descreve as portas para o UNO, que são A4 eA5. No mega, com esse código, ele não exibe as horas nem data, apenas zeros no lugar. Sei que no mega as portas SDA e SCL são 20 e 21. Como seria o código para o mega?

    Acho que seria só mudar essa linha: DS1307 rtc(A4, A5);

    Detalhe: Outros códigos exibem a hora e data, sendo assim as ligações físicas parecem estar ok.
    Desde já muito grato a todos!
    Um abraço!

    1. Boa noite Luis,

      Eu fiz um teste com o Arduino Mega e funcionou sem problemas nas portas 20 e 21.

      Usei o mesmo programa, só mudando o comando para

      DS1307 rtc(20, 21);

      Talvez seja algum problema de conexão, não sei dizer ao certo.

      Abraço !

      Adilson – Equipe FILIPEFLOP

    2. Estou com o mesmo problema!! ja tentei tudo, inclusive usar outras bibliotecas mas nada parece funcionar!!

  5. É possível modificar a maneira de exibir as horas, exemplo, ao invés de 22:39:12, 22h39, além da data, só exibir o dia e o mês separados por “/’?

    1. Boa tarde Douglas,

      Sim, você pode fazer isso mexendo na programação, tratando a string que contém a data e inserir (ou retirar) as barras.

      Abraço.

      Adilson – Equipe FILIPEFLOP

  6. Ola, tudo bem?

    Gostaria de saber se você tem o código para PIC?

    obrigado

    Eduardo

  7. Eu fiz exatamente como no tutorial, mas no lcd a hora fica 27:85:85 e a data 85.85.2165, qual seria o problema?

    1. Estou com o mesmo problema…

    2. Vocês devem inicializar o RTC, a maneira de inicializar é colocar no programa uma vez as seguintes linhas
      rtc.setDOW(MONDAY);
      rtc.setTime(16, 30, 47);
      rtc.setDate(5, 6, 2014);

      Porém com a data, hora e dia da semana que desejar.

      Após carregar o programa uma vez vocês podem comentar essas tres linhas, caso contrário esta data será sempre redefinida no RTC.

  8. Ola amigo e muito complicado fazer as seguintes alteracoes…
    Display 16×2 e modulo Relógio de tempo real DS1302?

    1. Boa noite Claudinei,

      Não é não, o DS1302 trabalha com a interface SPI, e o DS1307 trabalha com I2C. Existem algumas outras diferenças de funcionamento, mas sugiro que você dê uma olhada no datasheet de cada um :

      DS1307 : https://www.sparkfun.com/datasheets/Components/DS1307.pdf

      DS1302 : http://datasheets.maximintegrated.com/en/ds/DS1302.pdf

      Abraço.

      Adilson – Equipe FILIPEFLOP

  9. Olá então estou copiando essa programação mas sempre aparece um erro no rtc e outras programações tbm o que eu faço eu estou rodando no windows 8 e baixai o programa direto do site do Arduíno me de uma luz.

    Obrigado valeu!!!!

    1. Boa tarde Gileno,

      Pode nos passar o erro que está apresentando ?

      Grato.

      Adilson – Equipe FILIPEFLOP

  10. Gostaria de saber se com este Módulo (Relógio e Display) posso deixar que o próprio usuário possa programar os dias da semana e horários que um Motor de Passo irá funcionar?

    1. Boa tarde Uline,

      Sim, você pode fazer isso no próprio programa, testando a data e a hora e verificando se ela está de acordo com o que o usuário programou.

      Abraço.

      Adilson – Equipe FILIPEFLOP

  11. Filipe, estou montando um projeto onde uso o DS1307 e um display lcd 20×4 em I2C tambem, poren não estou conseguindoque apareça nada no display, estou utilizando os resistors terminadores na rede mas mesmo assin não funciona, tem algum exemplo que eu possa me basear, acho que esta tendo conflito entre os dois componentes.
    Desde já agradeço sua ajuda!

    1. Boa tarde Delmir,

      Se você ligar o display normalmente, sem usar o I2C, os dados aparecem ?

      Grato

      Adilson – Equipe FILIPEFLOP

      1. Ola,

        Estou usando um display 1602 com interface I2C.
        Pelo que endendi, o clock tambem usa a mesma interface I2C.
        Como faço para usar esses dois componentes I2C no MESMO projeto? Ligo os dois nos mesmos pinos?

  12. Amigo, estou tentando comparar a data e hora atual trazida pelo DS1307 com uma inserida manualmente pelo usuário via botôes para o acionamento de um relé para ligar uma válvula, mas não consigo fazer uma comparação, pode me ajudar?

    if (rtc.getTimeStr() == 22) {
    digitalWrite(rele, HIGH);

    mas como é um ponteiro não tem dado certo

  13. Pessoal , pra quem não estava conseguindo visualizar as horas e datas corretas no display , e pra quem não conseguiu manipular as variáveis , está aqui o código nesse site: http://www.arduinoecia.com.br/2013/04/real-time-clock-rtc-ds1307.html

    Abracos

  14. Boa noite, poderia me dizer como ligo o DS1307 com o shield display que já vem com os botões (LCD keypad shield)?
    Obrigado!

    1. Boa noite Filipe!
      Na mensagem anterior fiz uma pergunta de como ligar este módulo seu:
      LCD Shield com Teclado para Arduino
      R$ 34,90
      no circuito acima, já que ele é o modelo sem botões.
      Obrigado!

    2. Boa noite Luciano,

      Você pode soldar uma barra de pinos ao shield e utilizar as portas digitais 0,1,2,3,11,12 e 13, e também as portas analógicas A1, A2, A3, A4 e A5.

      Abraço.

      Adilson – Equipe FILIPEFLOP

      1. Bom dia Filipe, trabalho a mais de 25 anos com eletrônica (bancada), mas no Arduino a alguns meses… Ainda preciso do esquema elétrico ou físico.
        Muito obrigado pela pronta resposta!

  15. Pra quem não está conseguindo setar a data e a hora certa, observe o modulo que está usando. O meu RTC é o 12c e o esquema de ligacao é diferente do dsi1307. Pessoal , pra quem não estava conseguindo visualizar as horas e datas corretas no display , e pra quem não conseguiu manipular as variáveis , observar que no modulo RTC 12C você deve ligar o GND no terra, o VCC no 5 volts, o SDA no A4 e o SCL no A5.

  16. Bom Dia !
    Gostaria de saber como deixo os dias da semana em portugues no display, pois no meu aparece os dias em inglês e não estou conseguindo mudar, estou usando a biblioteca DS1307.h

    1. Boa noite,

      Tente alterar a biblioteca, procurando os nomes dos dias da semana e substituindo pela versão em português.

      Grato.

      Adilson – Equipe FILIPEFLOP

  17. Sempre acompanho seus tutoriais
    Adquiri um LCD QC2004A Azul com letras brancas, mas de forma alguma consigo colocar ele para funcionar.
    Tem alguma dica que possa me ajudar.
    Obrigado
    Moises Lima

  18. Bom dia Filipe,
    Montei o circuito como indicado, porem o display lcd 16×2 só mostra a data, não mostra a hora e nem o dia da semana.

    1. Bom dia Sérgio,

      Você alterou o programa para a utilização com o display 16×2 ? Se não foi feito, as coordenadas (lcd.setCursor()) podem fazer com que o texto fique “fora” do display.

      No setup, altere a linha lcd.begin(20, 4) para lcd.begin(16, 2), e nos comandos lcd.setCursor(), lembre-se de que você pode ter no máximo o valor 1 para a linha.

      Para posicionar um texto na primeira linha, 3a. coluna: lcd.setCursor(3,0)
      Para posicionar um texto na segunda linha, 4a. coluna: lcd.setCursor(4,1)

      Abraço.

      Adilson – Equipe FILIPEFLOP

  19. Bom dia, você poderia me informa se através desse código eu posso colocar um alarme com o próprio Rtc ds1307, agradeço desde já.

    1. Oi Alexsandro,

      Você pode usar o mesmo código como base, mas vai ter que alterar a programação para incluir a função de alarme.

      Abraço.

      Adilson – Equipe FILIPEFLOP

  20. Excelente tutorial. Principalmente a interface com o RTC, porque usualmente faz-se uso de uma biblioteca à parte ( e há várias, todas confusas!) e aqui usou-se somente a Wire, nativa do Arduino. Aprendi MUITO. Obrigado.

  21. Boa tarde,gostaria de saber como faço para que a cada hora seja ativado um servo motor,(a cada hora o servo iria movimentar 7°)

    1. Bom dia Alexsandro,

      Acho que uma maneira bem simples de fazer isso é vc testar o valor da variável “minutos”, assim, toda vez que ela chegar no valor que você colocou, ele aciona o motor. Vamos supor que vc queira que ele acione o motor em hora “cheia”, tipo 2:00, 3:00, 13:00, etc. Fica mais ou menos assim:

      if (minutos == 0)
      {
      //Comando para acionar o motor 7°
      }

      Abraço!

      Adilson – Equipe FILIPEFLOP

      1. nao entendi como adiciono

  22. Bom dia senhores, peguei como base uma programação de uma dosadora de liquidos, onde ela EM HORA MARCADA liga, dosa a quantidade de ml programada no tempo e desliga, esta programação aciona 3 bombas em tempos diferentes. porém agora vai:
    TENTEI APLICAR ESTA PROGRAMAÇÃO EM UM PWM PARA ACIONAR LUZES EM HORÁRIOS DIFERENTES DE UMA LUMINÁRIA DE AQUÁRIO, TIPO: 10h aciona os leds em 30% de sua portência, 15h todos os leds ficam 100% de sua potência, a partir das 21h ele inicia seu desligamento até meia noite apagar totalmente e acionar uma outra porta com 2 leds chamados de MOON LIGHT pra não ficar no breu total! queria sincronizar isso com o RTC para fazer, alguem sabe me indicar alguma programação?!

  23. olá! gostaria de saber se tem como mostrar nesse relógio o nº de dias corrente ( ex : 115 dias) ; 7/9/15. Não sou bom em programação.

    1. Bom dia Jaime,

      Por favor dê uma olhada neste link, tem o que você precisa: http://forum.arduino.cc/index.php?topic=44476.0

      Abraço

      Adilson – Equipe FILIPEFLOP

  24. Eu ja consegui meter o lcd a dar e o rtc a dar ( este apenas so aceita a sexta feira e sempre que carregue o codigo tenho que mudar a hora para começar a funcionar) mas nao estou a conseguir juntar estes dois

  25. tem como usar o rtc para ligar dispositivos em hora especifica? tipo: ligar relé 18:00 até 06:00

    1. O Fabio, tem sim, estou trabalhando em um projeto assim, apesar de encontrar alguns obstáculos, estou bem avançado. Existe vários esquemas na internet mas se quiser posso tentar te ajudar.

    2. Eu queria mostrar a data e hora no Serial Monitor e também acionar algumas coisas em determinados horários. Tentei fazer algumas modificações nesse programa, porem não deu certo. No serial monitor a data e hora aparecem da seguinte forma:

      Data: 165/165/165 Hora: 45/165/165

      Estou usando o Arduíno mega, não sei se pode ser por isso que não esta dando certo.

      Sei que não tem nada com defeito porque o programa do link abaixo funcionou direitinho:
      http://blog.filipeflop.com/modulos/relogio-rtc-ds1307-arduino.html#comment-114969

  26. Olá,

    Fiz algumas alterações neste código apenas para imprimir no Serial Monitor ao invés de imprimir em um display e obtive o mesmo problema que estou tendo usando outros códigos (alguns de minha própria autoria). Anteriormente estava tentando usar a biblioteca da Adafruit “RTClib.h” mas como nao estava obtendo êxito fiz mais algumas pesquisas e achei esse tutorial de como fazer somente pela “Wire.h”. O meu problema é o seguinte: a hora mostrada simplesmente não atualiza de segundo em segundo, passam-se 12 segundos e só depois ele contabiliza 1 segundo. Por exemplo, agora meu RTC está marcando 10:13:10. Ele imprimi essa hora aproximadamente 12 vezes (algumas vezes mais, outras menos) e depois imprimi 10:13:11. Se alguém puder me ajudar, será de muuita ajuda.

  27. Boa noite amigos!
    Estou aqui mais uma vezes para agradecer primeiramente, muito bom mesmo o blog, vários programinhas já realizados por aqui!
    Estou como um problema que me deparei ao tentar realizar dois projeto daqui, aonde executei corretamente um e outro separadamente e agora estou com um pouco de dificuldade em juntar os dois programas.
    Gostaria de saber se algum de vocês poderia me ajudar?
    Desde já agradeço pela forca.

    Então realizei primeiro a programação do RFid com o Lcd e Depois o do RTC DS1307 com Lcd
    mais quando vou juntar os dois dá erro!
    dependendo de como carrega trava um e não deixa ler o outro
    se alguem poder dar uma luz agradece…

  28. Bom dia, tem algum projeto usando RTC para Raspberry?

    1. Boa tarde Paulo,

      Ainda não temos nenhum post específico, mas já estamos testando alguns módulos com Raspberry Pi.

      Abraço

      Adilson – Equipe FILIPEFLOP

  29. Primeiramente, obrigado pelo tutorial;
    Talvez eu esteja fazendo errado mas, eu não entendi isso: “retire o comentário (aspas duplas) da linha 21”; sendo essa linha um comentário, o próprio IDE do Arduino o ignora como código pois, é iniciada com barras duplas.
    Outrossim, altero o valor das variáveis, nas linhas 32 a 38 e nada acontece (não altera no LCD);
    Obs.: estou usando o RTC3231
    Obrigado

    1. Boa tarde Daniel,

      Você retira as barras duplas da linhas 21, seta a data e a hora entre as linhas 32 a 38 e carrega o programa. Isso vai setar no RTC a data e a hora que você configurou.

      Feito isso, volte a comentar a linha 21 e carregue o programa novamente.

      (realmente não são aspas, são barras. texto corrigido. Obrigado)

      Abraço!

      Adilson – Equipe FILIPEFLOP

      1. Obrigado Adilson! Agora deu certo – bom trabalho seu!
        Uma sugestão, é fazer esse projeto (somente horas) em 3 ou 4 matrizes de led vermelha 8×8;
        Mais uma vez, obrigado

        1. Bom dia Daniel,

          Que bom que deu certo. 🙂 Sugestão anotada.

          Abraço e obrigado!

          Adilson – Equipe FILIPEFLOP

  30. Gostaria de saber por que o ds1307 foi endereçado em 0x68?

    1. Bom dia Tiago,

      É o endereço I2C que vem pré-definido de fábrica. Você pode usar o I2C Scanner para verificar o endereço dos módulos ligados à interface I2C: http://playground.arduino.cc/Main/I2cScanner

      Abraço!

      Adilson – Equipe FILIPEFLOP

  31. Boa noite !
    Estou fazendo a ligação do meu LCD 20 x 4, mas somente colocando a enerigia. Ele ainda não está comunicando com o meu PIC. Minha dúvida é: Quando eu energizo ele, somente sa linhas 2 e 4 ficam mais destacadas, ou seja mais definidos os dígitos (mais iluminados e definidos). As linhas 1 e 3 ficam mais apagadas, parecendo que não está habilitando ou meio apagado. Isto é normal ?
    Fico no aguardo de sua resposta e obrigado !

    att. Marcelo

  32. eu fiz um relógio desses para minha máquina de lavar roupas. com arduino uno, rtc 1307 e lcd 16×2. Encontrei um problema na hora da mudança do dia da semana de Sábado para Domingo. sempre que passava das 23:59:59 a string Domingo, não aparecia. aquele byte do dia da semana vai de 0 à 6 ou de 1 à 7? pergunto por que só apareceu no lcd a string “Domingo” quando mudei no switch(diadasemana) o case 0: Domingo, para case 7: Domingo, removendo o case 0. me dá uma dica sou leigo no assunto

  33. Sensacional ! ! !
    Liguei o RTC com um I2C… um shiel de relógio e um display 20×4 ocupando somente duas portas do Arduíno mais duas em comum de alimentação ! !

    1. Muito interessante. Só me esclarece uma coisa quanto as saidas SDA e SCL posso ligar varios dispositivos a essas duas sem problemas que vão funcionar?
      por exemplo varios modulos i2c ?

  34. Estou começando com alguns projetos, e me interessei nesse, queria saber quais sao os resistores utilizados nesse projeto. Aguardo e grande abraço

  35. Primeiramente gostaria de estar agradecendo há todos do site, sempre boas e novas ideias e dicas de como solucionar quaisquer duvida e dificuldade que tive em meu trabalho de TCC, que por sinal utilizei esse post do modulo RTC com LCD aonde mondei um Shield para usar com o LCD usando apenas 3 porta do Arduino, que ao meu ponte de vista foi bem mais vantajoso já que o custo de montar o shield foi bem baixo.
    Adicionei vários outros programa na mesma programação e tudo funcionou completamente como eu queria.
    Obrigado galera do FILIPEFLOP.

  36. Olá! Estou com dificuldade em implementar este relógio utilizando arduino Mega. Poderiam auxiliar nas alterações necessárias? Obrigado!

  37. Vi este projeto, e gostaria de saber se é possível criar uma nova void para o controle de um motor, ciclando a partir de um horário e em dias definidos da semana.
    Ou se não vai ser possível acionar duas void ao mesmo tempo.
    obrigado.

  38. Boa noite!

    Estou com um RTC1307 em um outro projeto, consegui verificar as informações no Serial Monitor e tudo mais.
    Como faço para ligar uma lampada das 06:00 às 22:00? Já tenho todo o esquema dos reles montados e funcionais, mas não estou conseguindo extrair a hora/minuto para manipular no algorítimo e ligar/desligar o relê. Algum exemplo? Printar já esta fácil, só quero acionar um relê dentro de um determinado período.

    Adilson, pode me auxiliar nessa questão? Valeuzão!

    Carrie Pascoal Kopczinski
  39. Boa tarde amigo.
    Hoje eu pensei em fazer um relogio onde, quando se aperta um botão, ele deixa registrado a hora. Caso seja apertado novamente, ele substitui aquele registro pelo atual
    Temos um problema com a hora que foi dada ração para os cães, ninguem nunca sabe se ja foi dado ou não.
    Com isso, penso em que quando alguem der a ração, aperta-se o botão e fica marcado a hora, ai quando outro vier com essa dúvida, ele apenas olha a hora da ultima vez que foi dada a ração.
    Se puder me ajudar, eu agradeço desde já.
    Obrigado.
    abraço.

  40. Como obter o valor de hora e minuto separados… ?
    hora = rtc.getTimeStr();
    h = hora.substring(0,2);
    m = hora.substring(3,5);
    s = hora.substring(6,8);

    tentei dessa forma mas da erro.. ‘hora’ does not name a type

  41. Tem algum comando pra apagar apenas uma linha do display sem apagar tudo que ta escrito?

  42. Olá Adilson!
    Estou usando o código e o circuito exatamente como você disponibilizou mas, no meu display, está mostrando dessa forma:
    1ª linha: FILIPEFLOP
    3ª linha: 45:165:165
    4ª linha: Data : 165.165.165 (exatamente assim)

    Obs.: estou usando esse mesmo LCD 20×4
    Coisa estranha! Não sei a causa!

    Peço-lhe ajuda, Obrigado

Deixe uma resposta

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