No artigo de hoje vamos falar sobre os relógios de tempo real, ou como são conhecidos, os RTCs – Real Time Clocks. Vamos explicar os três principais modelos utilizados em aplicações com Arduino: RTC DS1302, RTC DS1307 e RTC3231. Um projeto será implementado, no qual iremos usar o RTC DS1307 para enviar informações de data e hora para um LCD, ou seja, vamos fazer um relógio digital.
Os RTCs são pequenos dispositivos eletrônicos usados para incorporar dados de data e hora a dispositivos eletrônicos. Os RTCs utilizam crisais de quartzo e circuitos auxiliados integrados em um chip para medir o tempo. Praticamente todos os dispositivos que necessitam de controle preciso do tempo possuem algum tipo de RTC.
Três modelos bastante usados com Arduino são:
Todos possuem preços que não ultrapassam os 20 reais e podem ser facilmente incorporados em projetos eletrônicos. Todos os três modelos são fabricados pela Maxim Integrated. Vamos ver um pouco de cada um e suas principais diferenças.
O DS3231 é um RTC de alta precisão e baixo consumo de energia. O módulo possui um sensor de temperatura de fábrica e também um oscilador para melhorar ainda mais a sua exatidão.
Funciona tanto no formato 12 horas como 24 horas, e as informações de meses com menos de 30/31 dias e anos bissextos são corrigidos automaticamente pelo módulo.
Uma bateria acompanha o módulo para evitar a perda de dados em caso de desenergização do circuito. Um aspecto importante e que diferencia dos outros modelos é o protocolo de comunicação utilizado. No caso do DS3231 o protocolo I2C é usado. Assim, são dois canais(pinos) de comunicação: SCL(Clock) e SDA(dados).
Módulo RTC DS3231.
As especificações são:
É recomendado a leitura do datasheet.
O RTC 1302 é o mais simples dos três. Se comunica via protocolo serial, com um pino chamado CE e outro SCL. É capaz de fornecer informações de segundo, minutos, dia, data, mês e ano. Meses com menos de 31 dias e anos bissextos são tratados automaticamente pelo módulo. Opera nos formato 12 e 24 horas.
Módulo RTC DS1302.
As principais especificações são:
O datasheet, direto do site do fabricante, pode ser acessado aqui.
Este Real Time Clock (RTC) é um relógio de tempo real com calendário completo e mais de 56 bytes de SRAM de memória não-volátil. Tal como os outros RTCs, fornece informações de segundo, minutos, dia, data, mês e ano. Em sua placa há um circuito que detecta falhas de energia e aciona a bateria embutida com objetivo de evitar perda de dados.
Utiliza protocolo I2C e trata automaticamente os casos de meses com menos de 31 dias e anos bissextos.
Módulo RTC DS1307.
Especificações:
O datasheet do DS1307 pode ser acessado aqui.
As principais diferenças entre os módulos dizem respeito ao protocolo utilizado, tamanho e tipo da memória interna, dimensões e consumo de energia. Os módulos DS1307 e DS3231 utilizam protocolo I2C, enquanto o DS1302 utiliza um protocolo serial. O procolo I2C utiliza 2 pinos: o SDA(dados) e o SCL(clock de sincronismo). Já o DS1302 utiliza três pinos: SCLk(Clock de sincronismo), CE(Chip Enable – para habilitar a transmissão de dados) e I/O(dados).
A grande diferença é que o I2C sinaliza o início e fim da transmissão de dados por meio de mudanças no estado lógico nos pinos SCL e SDA. Basicamente, se SCL estiver em nível alto e houver uma transição de alto para baixo no SDA, o DS1307/3231 reconhece como INICIO de comunicação. Agora, se SCL estiver em nível alto e houver uma transição de baixo para alto no SDA, o DS1307/3231 reconhece como FIM de comunicação.
No DS1302, o papel feito por essas combinações lógicas é desempenhado pelo pino CE. Se ele estiver em nível alto, a comunicação tem início, se for para nível baixo, a transferência de dados termina. Ou seja, sempre que um procedimento de leitura ou escrita for executado com o DS1302, o pino CE deve ser colocado em nível alto.
Aqui cabe uma informação importante. No próprio datasheet do DS1302, a Maxim informa que nos datasheets antigos, o pino CE era erroneamente chamado de Reset(RST). Mas a funcionalidade era a mesma, ou seja, era um erro técnico na redação do datasheet.
As tensões de alimentação também são diferenças importantes,com o DS1302 operando com um mínimo de 2V, enquanto o DS1307 opera com no mínimo 4,5V.
Materiais necessários para o projeto com Arduino e RTC DS1307
Para ilustrar como usar o RTC nos seus projetos, vamos fazer a seguinte montagem:
Repare que o RTC DS1307 foi ligado diretamente ao arduino. Isso possível pois ambos trabalham com os mesmos níveis de tensão. Além do RTC, conectamos também um LCD para mostrarmos os dados de data e hora. Caso você tenha alguma dúvida em relação ao LCD, leia este post e saiba mais detalhes.
RTC pino SDA = pino A4 Arduino
RTC pino SCL = pino A5 Arduino
Do ponto de vista de hardware, a montagem é simples. Caso os outros RTCs fossem usados, a montagem seria basicamente a mesma.
Do ponto de vista de software, vamos utilizar a biblioteca RTClib.h, que pode ser encontrada no GitHub.
#include <Wire.h> #include "RTClib.h" #include <LiquidCrystal.h> #define InterfaceLCD 1 RTC_DS1307 rtc; char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; LiquidCrystal lcd(9, 8, 4, 5, 6, 7);//RS E D4 D5 D6 D7 void setup () { Serial.begin(57600); if (! rtc.begin()) { Serial.println("Couldn't find RTC"); while (1); } if (! rtc.isrunning()) { Serial.println("RTC is NOT running!"); // ajusta para data e hora de compilacao rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Ajusta para uma data definida por voce //rtc.adjust(DateTime(2017, 12, 27, 11, 14, 0)); } lcd.begin(16, 2); delay(2000); } void loop () { if (InterfaceLCD == 1) showLCD(); else showSerial(); Serial.println(); delay(3000); } void showLCD() { DateTime now = rtc.now(); // ano = now.year(); lcd.clear(); //mostra a data lcd.print(now.year()); lcd.write('/'); lcd.print(now.month()); lcd.write('/'); lcd.print(now.day()); //Mostra as horas lcd.setCursor(1, 2); lcd.print(now.hour()); lcd.write('/'); lcd.print(now.minute()); lcd.write('/'); lcd.print(now.second()); } void showSerial() { DateTime now = rtc.now(); Serial.print(now.year(), DEC); Serial.print('/'); Serial.print(now.month(), DEC); Serial.print('/'); Serial.print(now.day(), DEC); Serial.print(" ("); Serial.print(daysOfTheWeek[now.dayOfTheWeek()]); Serial.print(") "); Serial.print(now.hour(), DEC); Serial.print(':'); Serial.print(now.minute(), DEC); Serial.print(':'); Serial.print(now.second(), DEC); Serial.println(); }
Veja que no software usamos duas funções para mostrar os dados de data e hora. A função showLCD mostra os dados no LCD, e a função showSerial mostra na interface serial. Para selecionar qual usar basta alterar a flag InterfaceLCD.
Os pontos importantes a serem entendidos no programa são:
Carregue o software na sua montagem e faça o teste. Usando a interface serial, você terá algo como na imagem abaixo na sua saída:
A primeira vez que o software rodar, a mensagem RTC is not running! será exibida. Depois disso, a função rtc.adjust() será chamada e o RTC começará a contar o tempo normalmente.
Com tudo ajustado, você deve receber mensagens como as mostradas na tela acima. Detalhe: Para alterar a forma de exibição, como mudar de “Wednesday” para “Quarta-feira” ou mostrar a hora primeiro, basta ajustar a ordem das funções Serial.println e lcd.print dentro das funções showSerial e ShowLCD. Esse ajuste fica de dever de casa para que você possa treinar.
Para usar o LCD, basta fazer a montagem conforme mostramos na sessão “Aspectos de Hardware”. Se tiver alguma dúvida sobre o LCD ou quiser saber mais informações sobre ele, leia este post específico sobre esse componente. Lembre-se de ajustar o contraste pelo potenciômetro até que as letras possam ser vistas de forma clara.
No mais, agora você já pode incorporar as informações de data e hora nos seus projetos.
Tenha a Metodologia Eletrogate na sua Escola! Conheça nosso Programa de Robótica Educacional.
Se tiver alguma dúvida, deixe nos comentários para que possamos esclarecer. A mesma biblioteca usada nesse projeto também possui suporte para o RTC DS3231. Para o RTC DS1302, boas opções de bibliotecas e exemplos podem ser encontrados nas seguintes referências:
|
A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.
Tenha a Metodologia Eletrogate dentro da sua Escola! Conheça nosso Programa de Robótica nas Escolas!