Hello hello rapaziada
!
Pois é, estou de volta com mais um tutorial onde vos vou explicar como usar ou fazer interagir um RTC, mais propriamente o
DS1307 da Maxim-Dallas com o Arduino! Agora já podem adicionar um relógio e dar horas no vosso projecto!
Antes de mais o que é um RTC ou Real Time Clock? Um RTC é um dispositivo que dá horas, é verdade, conta o tempo! Todos nós os temos em casa, quer seja nos relógios digitais, na motherboard dos nossos computadores, nos telemoveis, etc..
O RTC que vou introduzir hoje é, como já disse, o
DS1307. Este RTC comunica por i2c e tem bastantes características interessantes:
- Interface i2c;
- Conta segundos, minutos, horas, dias de semana, dias do mes, mes, ano e considera anos bissextos;
- Tem uma RAM de 56 bytes com capacidade para escritas infinitas;
- Gera sinais quadrados programaveis;
- Comuta automaticamente para a bateria se detectar falha de energia;
- Consome menos de 500 nA (nano Amperes).
A questão da alimentação da bateria é interessante, de certeza que todos sabem que nas motherboards dos nossos computadores temos la uma pilha, e "ah pois é" essa pilha é a que alimenta o RTC do nosso computador! Este integrado pode ser alimentado por uma fonte de energia normal como qualquer outro integrado mas pode ainda estar a ser alimentado por uma bateria, normalmente uma pilha de 3V como as que os nossos computadores têm na motherboard (CR2032 por exemplo)! Este integrado se detectar que a fonte de alimentação não está presente comuta automaticamente para a bateria e passa a funcionar com a energia da bateria. Com uma destas pilhas totalmente carregada, o integrado matém-se a contar o tempo durante pelo menos 9 anos, "cool" não é?
Ah, mas atenção, a bateria é obrigatória! O funcionamento do RTC, muito sucitamente, é o seguinte:
- Ligar;
- Alimentar com bateria;
- Definir data de arranque;
- Iniciar;
- Ler data!
Eehe até parece simples... E é! Claro que se começarmos a ler o
Datasheet do DS1307 até nos assustamos com tanta informação e realmente interpretar aquilo é chato e massador! Por um lado é bom pois qualquer dúvida ou informação que queiramos saber está lá explicada, por outro lado é chato pois podiam fazer um guia mais simples do funcionamento do integrado em vez de colocarem a informação toda no mesmo documento.
Entrando em mais promenores mas sem aprofundar muito (Ai não, queriam a papinha toda não era?! Seus malandros) como este dispositivo tem interface
I²C não nos podemos esquecer das resistências de Pull-Up do canal! Se ainda não tiverem nenhum dispositivo i²c na vossa breadboard tem de colocar duas resistências na vossa montagem, caso contrário já têm as resistências colocadas (se não nem sei como funciona o vosso dispositivo) e então é so encaixarem lá o vosso novo integrado, o RTC!
Para o cristal... pois é, é aqui que a "porca torce o rabo", o cristal que se usa com este RTC e com todos os outros RTC's (sim na motherboard está lá um mas nem pensem em tirá-lo para o bem da vossa "mobo"!) é um cristal com a frequência de 32.768KHz. É dificil de encontrar à venda nas lojas, pelo menos aqui em Lisboa, mas online encontra-se bastante facilmente e em casa também.... "O QUÊ EM CASA?" Ah pois é "bébés" em encontrei o meu num brinde do chinês, daqueles que fazem o que é suposto, não funcionar, mas que supostamente davam horas! Sim abri aquilo e tirei de lá o belo cristal de 32.768KHz ehehe mas também o podem encontrar em relógios digitais, alarmes etc., la dentro há sempre um destes cristais!
Assim, com a introdução feita, vamos ver como são as ligações:
Mais uma vez, A bateria é obrigatória e portanto o RTC não funciona sem a ter ligada! Eu aproveito o pino de 3V do Arduino!
Em anexo deixo um código que vai enviar a data "actual" por Serial, o código está bastante comentado e se seguirem os comentário fica fácil de entender. Vai também um ficheiro "ds1307.pde" com as rotinas que fiz para comunicar com o RTC. Basiei-me em código que vi em sites da internet mas que alterei de forma a respeitar o
Datasheet do DS1307 e que também optimizei. Creio que é bastante fácil de entender e se tiverem dúvidas do porquê "disto e daquilo", se não estiver em comentário deixo-vos o desafio de irem consultar o datasheet
!
Tenham atenção à função
"ds1307setup();", esta função só é necessária na primeira vez que ligam o RTC, se o alimentarem com uma pilha de 3v ou bateria nunca mais precisam desta função! Isto porque a função o que faz é preparar o RTC, definir a data de arranque e mandar o RTC contar o tempo, uma vez que ele nunca mais vai perder energia (pois tem uma bateria ligada) nunca vai parar de contar. Se por acaso lhe tirarem a alimentação, precisam de executar a função da próxima vez que o ligarem.
Agora para o fim digo-vos que a
Sparkfun vende um KIT com este RTC já com as resistências de i2c, com o cristal e pilha de 3V, tudo bonitinho sendo so preciso ligar dois fios de alimentação e os dois fios para comunicar:
É claro que comprar isto, além de ser caro, não mete piada nenhuma porque já vem tudo feito! Mas para quem não gosta de se divertir a ligar coisas e tem dinheiro para gastar...
Eu mandeir vir samples deste RTC do site da Maxim e aqui está o link de
Samples de DS1307. Mandem vir o DS1307+, este é PDIP 8, ou seja tem 8 pinos e dá para encaixar na breadboard. O '+' significa que é
RoHS Lead Free e daí dar para vir para a Europa (Se não for RoHs não podem enviar para cá, regras da U.E. e acho bem)!
Bom... código em anexo leiam com atenção e ainda se podem rir
Exemplo de output do programa:
Sao: 23:15:15 Quinta-feira dia 12 de Marco de 2009
Sao: 23:15:16 Quinta-feira dia 12 de Marco de 2009
Sao: 23:15:17 Quinta-feira dia 12 de Marco de 2009
Cumprimentos!
Contribuição do metRo_
RTC + PCD8544