Framework Arduino II: Aula 25 RTC

Imagem meramente ilustrativa


Introdução

    RTC vem da sigla em inglês para Real-Time Clock ou Relógio de Tempo Real. Trata-se de um módulo contendo um circuito do tipo contador capaz que trabalhar como um relógio, recurso muito útil em projetos que trabalham com datas e horas. Esse é o nosso assunto de hoje

Módulo RTC DS3231 com suporte para bateria (vazio)
Módulo RTC DS3231 com suporte para bateria (vazio)


O que é o CI Contador?

    Um circuito integrado contador é um componente eletrônico que realiza contagens e/ou divisão de frequência através da entrada de pulsos de clock. Quando esse clock trabalha com frequências compatíveis, a contagem coincide com os intervalos de tempo reais.

    Por exemplo, a frequência da energia elétrica de nossas casas no Brasil trabalha em 60 Hz, isto é, 60 ciclos por segundo. Se usarmos um divisor de frequência de forma a transformar essa frequência em 1 Hz, cada pulso corresponderia a passagem de tempo de 1 segundo.

    Com a devida combinação de flip flops e portas de lógicas, podemos criar contadores que podem contar, por exemplo, de 0 até 59 e se trabalharmos com pulsos de 1Hz, teríamos essa contagem coincidindo com a passagem de tempo dos minutos.

    Não pretendo explicar aqui em poucas frases aquilo que o estudantes de embarcados passam alguns semestres para aprender. Quis apenas dar uma ideia da relação entre CIs contadores e a questão da contagem de tempo.

    No caso dos RTC temos CIs contadores mais especializados que permitem a contagem de segundos, minutos, horas, dias, datas, meses e anos, com a capacidade de tratar dos diferentes números de dias dos meses e os anos bissextos.

    Entre os principais CIs usados em módulos RTCs temos o DS1302, DS1307 e o DS3231. Todos da Dallas Semiconductor. 

CI DS1307 usado em módulos RTC
CI DS1307 usado em módulos RTC

Os módulos RTC

    Além do CI um módulo RTC precisa de um oscilador para gerar os pulsos para a contagem. Possui também uma pequena memória volátil, isto é, que depende de energia para manter dados armazenados, por razão, possui suporte para uma bateria como a CR2032 de 3V para manter os dados quando o sistema é desligado. 

    É comum encontrarmos pela Web projetos utilizando CIs independentes sem o módulo. Neste caso é necessário utilizar um cristal de quartzo como o de 32,768 KHz para a questão dos pulsos e um suporte de alimentação com bateria independente. Por isso acaba saindo mais barato a aquisição do módulo pronto.

    Os módulos a base de CIs 1307 e 3231 utilizam dois pinos para comunicação com o Arduino utilizando o protocolo I²C. Já os com 1302 utilizam três pinos com comunicação serial. 

Bibliotecas

    Para usar um RTC Geralmente utilizamos a biblioteca RTClib da Adafruit, já otimizada para I2C, por isso podemos dispensar a biblioteca Wire que já conhecemos de outras aulas, quando vimos o protocolo I2C. Essa RTClib é um fork da antiga RTClib da JeeLab's.

    Porém também temos a biblioteca RTC de Manjunath CV que permite a leitura e ajuste do relógio, trabalha com 12 ou 24 horas e para alguns chips permite também ajustes de alarme e timer (temporizador). 

    Seu repositório é o https://github.com/cvmanjoo/RTC e nele o estudante encontrará informação como o endereço de memória utilizada pelo I2C de acordo com o chip. Por exemplo, para o DS1307 o endereço é o 0x68.

Montagem

    Para essa montagem utilizaremos o Wokwi que oferece um simulador para o DS1307 para o qual utilizaremos a biblioteca RTClid da Adafruit. O módulo DS1307 geralmente possui cinco terminais:

  • GND para o Terra do Arduino
  • VCC para os 5v do Arduino
  • SDA para a linha de dados I2C, pino A4 do Arduino
  • SCL para a linha de clock I2C, pino A5 do Arduino
  • SQW para a saída de onda quadrada, mas que não está disponível na simulação.

    Vou disponibilizar no link abaixo uma montagem pronta baseada no exemplo do Wokwi para ganharmos tempo:

Simulação no Wokwi para o DS1307
Simulação no Wokwi para o DS1307


Link: https://wokwi.com/projects/416102418055818241

Sketch

    Nesse código simples estamos incluindo no início a biblioteca RTClib e declarando as variáveis inteiras minutos e segundos. A razão dessas variáveis ficará mais claro logo adiante. Depois estamos instanciando o objeto rtc com base na classe RTC_DS1307 da biblioteca incluída.

    Logo abaixo temos a criação de duas matrizes do tipo String para armazenar os dias da semana e e os meses do ano. A função setup apenas inicializa o monitor serial depois testa se o objeto rtc pode ser iniciado com begin(). 

    Se não iniciou envia ao monitor uma mensagem de erro, espera a transmissão de dados seriais terminar com o método flush() depois aborta o programa. A função loop só roda se o rtc for iniciado.

    Na linha 23 estamos criando um objeto DateTime chamado agora que recebe o valor do método now() para o objeto rtc. No Wokwi o DS1307 é inicializado automaticamente com a hora atual do sistema.

    Nas linhas seguintes vemos o objeto rtc usando os principais métodos da biblioteca que permite ver dia do objeto agora, seu mês, seu ano, sua hora, seus minutos e seus segundos, através respectivamente dos métodos day(), month(), year(), hour(), minute() e second().

    O método dayOfTheWeek() está sendo usado para buscar na matriz diadasemana, a string correspondente ao dia da semana de hoje. Esse método começa a contar de zero, como domingo, 1 como segunda e assim por diante.

    Já no caso do método month() estamos sendo obrigados a tirar -1 de seu valor para poder buscar uma correspondência na matriz de meses do ano.

    No caso de minutos e segundos, como eles são impressos no meio depois do ":", ficaria feio aparecer apenas um dígito no caso dos valores entre 0 e 9. Assim, incluímos um zero através de um teste das variáveis. Por isso aparece 01, 02, 03, etc, ao invés de 1, 2, 3...

  1. #include "RTClib.h"
  2. int  minutos;
  3. int segundos;
  4. RTC_DS1307 rtc;

  5. String diasdasemana[7]= {"Domingo", "Segunda-feira","Terça-feira", 
  6. "Quarta-feira", "Quinta-feira", "Sexta-feira", "Sábado"};
  7. String meses[12]  = {"janeiro", "fevereiro", "março", "abril", 
  8. "maio","junho", "julho", "agosto", "setembro", "outubro",
  9. "novembro", "dezembro"};

  10. void setup () {
  11.   Serial.begin(9600);

  12.   if (! rtc.begin()) {
  13.     Serial.println("Não foi possível inicial o RTC!");
  14.     Serial.flush();
  15.     abort();
  16.   }
  17. }

  18. void loop () {
  19.   DateTime agora = rtc.now();
  20.   Serial.print("Hoje é ");
  21.   Serial.print(diasdasemana[agora.dayOfTheWeek()]);
  22.   Serial.print(", ");
  23.   Serial.print(agora.day(), DEC);
  24.   Serial.print(" de ");
  25.   Serial.print(meses[agora.month()-1]);
  26.   Serial.print(" de ");
  27.   Serial.println(agora.year(), DEC);
  28.   Serial.print("Agora são ");
  29.   Serial.print(agora.hour(), DEC);
  30.   Serial.print(':');
  31.   minutos=agora.minute();
  32.   if (minutos<10){
  33.     Serial.print("0");
  34.     Serial.print(minutos, DEC);
  35.   }
  36.   else{
  37.     Serial.print(minutos, DEC);
  38.   }
  39.   Serial.print(':');
  40.   segundos=agora.second();
  41.   if (segundos<10){
  42.     Serial.print("0");
  43.     Serial.print(segundos, DEC);
  44.   }
  45.   else{
  46.     Serial.print(segundos, DEC);
  47.   }
  48.   Serial.println();
  49.   delay(5000);
  50. }

    Acho que mostramos o básico de como utilizar um RTC. Cabe agora ao estudante buscar mais conhecimento. Minha sugestão é que você dê uma olhada nesse exemplo do Wokwi para fazer um despertador e tente melhorá-lo:

    Link para um exemplo de alarme do Wokwi: https://wokwi.com/projects/297787059514376717

    

Próxima Aula                                                                                                                        Aula Anterior

Referências

ARDUINO E CIA Use o RTC DS1307 com Arduino. Disponível em <https://www.arduinoecia.com.br/real-time-clock-rtc-ds1307-arduino/> Acesso em 01 dez 2024.

BLOG ELETROGATE. Conhecendo a Fundo o RTC. Disponível em <https://blog.eletrogate.com/serial-clock-serial-date-e-i%c2%b2c-conhecendo-a-fundo-o-rtc/> Acesso em 01 dez 2024.

BLOG ELETROGATE. RTC – Real Time Clock DS1302, 1307 e 3231. Disponível em <https://blog.eletrogate.com/rtc-real-time-clock-ds1302-1307-e-3231/> Acesso em 01 dez 2024.

MAKER HERO. Relógio Arduino com DS1307: 3 modos diferentes. Disponível em <https://www.makerhero.com/blog/relogio-rtc-ds1307-arduino/> Acesso em 01 dez 2024.

WOKWI. Referência do wokwi-ds1307. Disponível em <https://docs.wokwi.com/pt-BR/parts/wokwi-ds1307> Acesso em 01 dez 2024.