segunda-feira, 27 de outubro de 2014

Teste com RTC DS1302 Relógio de Tempo Real usando LCD como saída

Para aqueles projetos que precisam de calendário ou de um relógio preciso, o RTC (Real-Time clock) DS1302 é uma ótima opção. O módulo DS1302 já vem em uma placa com 5 pinos de saída, cristal oscilador de 32.768kHz e um suporte para bateria 3V CR2032.

Algumas Características


  • Conta segundos, minutos, horas, dia do mês, mês, dia da semana, e ano com compensação para ano bissexto até 2100;
  • 31 endereços de Memória RAM de 8 bits;
  • I/O serial;
  • Alimentação de 2.0V a 5.5V;
  • Consumo de menos que 300nA à 2.0V;
  • Comunicação serial a 3 fios;
  • Relógio funciona nos modos 24-horas ou 12-horas com indicador AM/PM;
  • Controle de alimentação que permite carregar baterias recarregáveis quando conectado à uma fonte secundária de energia. 
Este módulo é bastante versátil e pode ser lido ou escrito através das vias de comunicação. São três pinos, a saber, um de I/O que é onde os dados são enviados e recebidos através de um shift register, outro pino que é uma via de Clock que controla o fluxo de dados e um último pino CE ou /RST que habilita ou não a transmissão e recepção. Os outros 2 pinos são de alimentação.

Datasheet do DS1302.












Biblioteca


A biblioteca DS1302 fornece recursos para trabalhar com as principais funções do RTC. Aqui um manual das funções presentes na biblioteca.

Antes de iniciar o uso da biblioteca, podemos alterar o arquivo DS1302.cpp a partir da linha 264 e trocar os nomes dos dias da semana por nomes em português. Fazer os mesmo a partir da linha 299 e traduzir para o português os nomes dos meses.
No arquivo DS1302.h, podemos alterar os nomes dos dias da semana a partir da linha 45. Recomendo, para este segundo arquivo, usar apenas o primeiro nome antes do hífen (sem 'feira') e com letras maiúscula, por exemplo, MONDAY fica SEGUNDA, TUESDAY fica TERCA e assim por diante.

Feitas as alterações, podemos agora testar os comandos no Arduino e usar o módulo LCD para vermos os resultados.

Algoritmo de teste




// Assumindo que o DS1302 está conectado como se segue.
// DS1302:  CE pin    -> Arduino MEGA pino Digital 22
//          I/O pin   -> Arduino MEGA pino Digital 23
//          SCLK pin  -> Arduino MEGA pino Digital 24

#include <DS1302.h>                   // Chama biblioteca do DS1302
#include <LiquidCrystal.h>            // Chama biblioteca do LCD
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);  // Configura Módulo LCD
int contador=0;

// Init the DS1302
DS1302 rtc(22, 23, 24);      // Inicia o RTC com o numeros dos pinos que
                             // foram conectados, respectivamente, RST, I/O e SCK
void setup()
{
  lcd.begin(16, 2);     // Inicia módulo LCD
  lcd.setCursor(0,0);   // 
  lcd.clear();          // Limpa LCD
  
  rtc.halt(false);          // Liga módulo
  rtc.writeProtect(false);  // Desabilita proteção da escrita
  
  // Estas três linha seguintes configuram a data e hora do RTC
  // Se você já executou este algoritmo uma vez, estes dados já
  // estarão salvos no RTC. Então estas linhas podem ser comentadas
  // numa segunda gravação para usar data/hora previamente gravadas no RTC DS1302
  
  rtc.setDOW(SEXTA);           // Seta dia da semana como Sexta-Feira
  rtc.setTime(23, 59, 50);     // Seta hora para 23:59:50 (formato 24hr)
  rtc.setDate(17, 10, 2014);   // Seta a data para 17 de outubro de 2014
}

void loop()
{
  // Imprime data no LCD na posicao coluna 0, linha 0
  lcd.setCursor(0,0);          
  lcd.print (rtc.getDateStr());

  // Imprime hora no LCD na posicao coluna 0, linha 1
  lcd.setCursor(0,1);
  lcd.print ("                ");       // 'Limpa' linha
  lcd.setCursor(0,1);          
  lcd.print (rtc.getTimeStr());         // Imprime a hora
  
  if (contador == 10){              // A cada 10 segundos
     lcd.setCursor(0,1);                // apaga a hora e escreve 
     lcd.print ("                ");    // o dia da semana na   
     lcd.setCursor(0,1);                // segunda linha
     lcd.print (rtc.getDOWStr()); 
     contador = 0;
  }
  
  // Aguarda um tempo antes de atualizar os dados do LCD
  delay (1000);
  contador++;
}



Saídas




Utilizando as funções da biblioteca, em pouco tempo já temos um relógio/calendário implementado. O limite é a imaginação. Adquira o módulo RTC e comece agora seu projeto.

Confira outros módulos shield para Arduino na nossa loja.

Até o próximo artigo!

12 comentários:

  1. Boa noite. Não consegui acessar os arquivos. A mensagem é que foram movidos ou excluídos. Desde já obrigado pela ajuda.

    ResponderExcluir
    Respostas
    1. Problema corrigido. Os links estão on-line agora.
      Obrigado pelo feed-back!
      Aproveite nossas postagens e visite a nossa loja em www.eletrodex.com.br

      Excluir
  2. Respostas
    1. Problema corrigido. Os links estão on-line agora.
      Obrigado pelo feedback!
      Aproveite nossas postagens e visite a nossa loja em www.eletrodex.com.br

      Excluir
  3. Boa tarde, em determinado momento os segundos pares não são exibidos e a data e hora ficam no formato abaixo:

    00.00.2000
    00:00:00

    Como corrigir esse bug.

    ResponderExcluir
    Respostas
    1. O meu tambem estava assim. Tinha trocado os pinos. coloquei no lugar devido e deu certo!!!

      Excluir
  4. Qual arduino esta utilizando? A placa utilizada é igual a que esta acima? Existe mais código além do exemplo acima em seu programa, ou somente esta testando o exemplo?

    ResponderExcluir
  5. Olá, estou tendo dificuldades em criar uma condição usando o RTC, estou querendo que a cada 2 horas seja ativado um relay.

    Alguém poderia me ajudar.

    ResponderExcluir
    Respostas
    1. Olá!
      Para isso, basta utilizar o código fornecido na postagem "Utilizando o módulo Display 7 Segmentos para Relógio" (http://eletrodex.blogspot.com.br/2015/06/utilizando-o-modulo-display-7-segmentos.html), e copiar a condição de acionamento do relé, descrita abaixo:
      void despertador()
      {
      if (hour==17 && minute==19)
      {
      digitalWrite(12, LOW);
      }
      else
      {
      digitalWrite(12, HIGH);
      }
      }

      Basta copiar essa parte do código e ajustar para os horários desejados.
      Lembrando que nesse caso, o relé utilizado está ligado ao pino 12 do Arduino e é do tipo "Ativo Baixo", em que é acionado caso o nível lógico no pino vá para"0".
      Esperamos ter ajudado
      Obrigado pelo feedback!
      Aproveite nossas postagens e visite a nossa loja em www.eletrodex.com.br

      Excluir
  6. Bom dia, como eu poderia acender um led, relé, lâmpada em hora específica? tipo ligar 18:00, desligar 02:00?

    alguém poderia ajudar?

    ResponderExcluir
  7. Fui procurar a biblioteca e ela sumui !!!!

    ResponderExcluir
  8. if (hora >= "18:00:00" && hora <= "02:00:00")
    {
    Liga relé...
    }
    else
    {
    Desliga relé
    }

    ResponderExcluir