O DS1307 e um circuito integrado com um relogio (RTC) que fornece uma solucao simples para circuitos que precisem marcar a passagem de tempo ou mostrar as horas. De baixissimo consumo, permite manter a contagem do tempo mesmo com o circuito principal desligado atraves de uma bateria de backup. A comunicacao com o circuito e feita atraves de I2C.O unico componente externo necessario e um cristal de 32.768kHz para o oscilador. Caso nao consiga encontra-lo a venda, ele existe em praticamente qualquer circuito que tenha um relogio, desde relogios de pulso baratos ate placas-mae de computadores. Nao e dificil encontra-los em sucata. O cristal deve ser soldado o mais proximo possivel do circuito integrado, com o involucro metalico eletricamente ligado ao terra.O DS1307 tambem tem um pino de saida que fornece um sinal de onda quadrada ajustavel para varias frequencias. Pode ser util no caso de um relogio, por exemplo, quando desejamos piscar um led a cada segundo.#include <Wire.h>// endereco I2C do DS1307#define DS1307_I2C_ADDRESS 0x68// cria as variaveis para armazenar os valores// SS[0-60], MM[0-60], HH[0-24], D[1-7], DD[1-31], MM[1-12], YY[00-99]byte second, minute, hour, dayweek, day, month, year; char buffer[50]; // buffer para armazenar entrada serial void setup() { Wire.begin(); // inicializa interface I2C Serial.begin(9600); // inicializa serial }void loop() { if (Serial.available()) { fillBuffer(); setDateDS1307(); } getDateDS1307(); // pega a hora atual e armazena writeSerial(); // envia a hora pela serial delay(500);} // converte binario para BCDbyte dec2bcd(byte val){ return ((val/0xA*0x10)+(val%0xA));}// converte BCD para binariobyte bcd2dec(byte val){ return ((val/0x10*0xA)+(val%0x10));}// converte dois digitos ASCII da entrada em um unico bytebyte digitToByte(int x,int y){ return (byte) ((buffer[x]&0x0F)*10+(buffer[y]&0x0F));}// converte caracteres ASCII da entrada em um byte com o dia da semanabyte dayToByte(int x,int y, int z){ int temp = buffer[x]+buffer[y]+buffer[z]; switch(temp){ case 0x12A: return (byte) 1; break; // Mon case 0x12E: return (byte) 2; break; // Tue case 0x120: return (byte) 3; break; // Wed case 0x131: return (byte) 4; break; // Thu case 0x121: return (byte) 5; break; // Fri case 0x128: return (byte) 6; break; // Sat case 0x136: return (byte) 7; break; // Sun default: return (byte) 0; }}// converte caracteres ASCII da entrada em um byte com o mesbyte monthToByte(int x,int y, int z){ int temp = buffer[x]+buffer[y]+buffer[z]; switch(temp){ case 0x119: return (byte) 1; break; // Jan case 0x10D: return (byte) 2; break; // Feb case 0x120: return (byte) 3; break; // Mar case 0x123: return (byte) 4; break; // Apr case 0x127: return (byte) 5; break; // May case 0x12D: return (byte) 6; break; // Jun case 0x12B: return (byte) 7; break; // Jul case 0x11D: return (byte) 8; break; // Aug case 0x128: return (byte) 9; break; // Sep case 0x126: return (byte) 10; break; // Oct case 0x133: return (byte) 11; break; // Nov case 0x10C: return (byte) 12; break; // Dec default: return (byte) 0; }}// le dados da serial para o buffer de entradavoid fillBuffer(){ delay(500); int ptr =0; buffer[ptr++]=Serial.read(); while(Serial.available() > 0) { buffer[ptr++]=Serial.read(); if(buffer[ptr]=='/n'){ break; } }} // acerta a hora do DS1307 usando como entrada um pipe do comando date.// Sat Dec 11 12:04:12