Guia para Módulo de Relógio em Tempo Real (RTC) com Arduino (DS1307 e DS3231)
Esta postagem é sobre como usar o módulo DS1307 Real Time Clock (RTC) com o Arduino. Você também pode seguir este guia para outros módulos semelhantes, como o DS3231 RTC.
Conteudo
Apresentando o módulo Relógio em tempo real
O módulo de relógio em tempo real é o da figura abaixo (vista frontal e traseira).
Ao usar este módulo pela primeira vez, você precisa soldar alguns pinos de cabeçalho.
Como você pode ver na imagem acima, o módulo possui uma bateria reserva instalada. Isso permite que o módulo retenha o tempo, mesmo quando não está sendo ligado pelo Arduino. Dessa forma, toda vez que você liga e desliga seu módulo, o tempo não zera.
Este módulo usa comunicação I2C. Isso significa que ele se comunica com o Arduino usando apenas 2 pinos.
Onde comprar?
O Real Time Clock é um módulo acessível. Você pode verificar o módulo DS1307 Real Time Clock no MercadoLivre e encontrar o melhor preço.
Ligação de pinos
A ligação do módulo RTC é bastante simples!
Pino | Ligação para o Arduino Uno |
SCL | A5 |
SDA | A4 |
VCC | 5V |
GND | GND |
Se você estiver usando outra placa Arduino em vez da uno, verifique quais são seus pinos SCL e SDA.
- Nano: SDA (A4) e SCL(A5)
- MEGA: SDA (20) e SCL(21)
- Leonardo: SDA (20) e SCL(21)
Exemplo: Exibindo data e hora no monitor serial
Este exemplo exibe a data e a hora no monitor serial.
Peças necessárias
Para este exemplo, você precisa das seguintes peças:
- Arduino UNO ou compativel
- Modulo DS1307 RTC
- Fios para Ligação
Todos encontrados no MercadoLivre.
Esquemas
Código
Trabalhar com o RTC requer duas etapas importantes:
- definir a hora atual, para que o RTC saiba que horas são
- retendo a hora, para que o RTC sempre dê a hora correta, mesmo quando está desligado
Defina a hora atual no relógio de tempo real
Para definir a hora atual, você precisa alterar o código fornecido.
- definir sua hora atual no conjunto de funções setDS3231time()
Os parâmetros da função são destacados em vermelho: segundos, minutos, horas, dia da semana, data, mês e ano (nesta ordem). Domingo é o dia 1 da semana e sábado é 7. Não se esqueça de descomentar essa linha de código.
Depois de definir a hora atual, você pode fazer upload do código fornecido com as modificações necessárias.
O código fornecido foi escrito por John Boxall da tronixstuff. Você pode ler seu tutorial aqui.
// Escrito por John Boxall de http://tronixstuff.com // Traduzido para entendimento. #include "Wire.h" #define DS3231_I2C_ADDRESS 0x68 // Converter números decimais normais em decimais codificados em binário byte decToBcd(byte val){ return( (val/10*16) + (val%10) ); } // Converte decimais codificados em binários em números decimais normais byte bcdToDec(byte val){ return( (val/16*10) + (val%16) ); } void setup(){ Wire.begin(); Serial.begin(9600); // defina a hora inicial aqui: // DS3231 segundos, minutos, horas, dia, data, mês, ano setDS3231time(30,42,16,5,13,10,16); } void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year){ // define os dados de hora e data para DS3231 Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); // define a próxima entrada para começar no registro de segundos Wire.write(decToBcd(second)); // definir segundos Wire.write(decToBcd(minute)); // definir minutos Wire.write(decToBcd(hour)); // definir horas Wire.write(decToBcd(dayOfWeek)); // definir dia da semana (1 = domingo, 7 = sábado) Wire.write(decToBcd(dayOfMonth)); // definir data (1 a 31) Wire.write(decToBcd(month)); // definir o mês Wire.write(decToBcd(year)); // definir ano (0 a 99) Wire.endTransmission(); } void readDS3231time(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year){ Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); // definir o ponteiro de registro DS3231 para 00h Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 7); // solicita sete bytes de dados do DS3231 a partir do registro 00h *second = bcdToDec(Wire.read() & 0x7f); *minute = bcdToDec(Wire.read()); *hour = bcdToDec(Wire.read() & 0x3f); *dayOfWeek = bcdToDec(Wire.read()); *dayOfMonth = bcdToDec(Wire.read()); *month = bcdToDec(Wire.read()); *year = bcdToDec(Wire.read()); } void displayTime(){ byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; // recuperar dados do DS3231 readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); // envie para o monitor serial Serial.print(hour, DEC); // converte a variável de byte em um número decimal quando exibida Serial.print(":"); if (minute<10){ Serial.print("0"); } Serial.print(minute, DEC); Serial.print(":"); if (second<10){ Serial.print("0"); } Serial.print(second, DEC); Serial.print(" "); Serial.print(dayOfMonth, DEC); Serial.print("/"); Serial.print(month, DEC); Serial.print("/"); Serial.print(year, DEC); Serial.print(" Dia da semana: "); switch(dayOfWeek){ case 1: Serial.println("Domingo"); break; case 2: Serial.println("Segunda"); break; case 3: Serial.println("Terça"); break; case 4: Serial.println("Quarta"); break; case 5: Serial.println("Quinta"); break; case 6: Serial.println("Sexta"); break; case 7: Serial.println("Sabado"); break; } } void loop(){ displayTime(); //exibe os dados do relógio em tempo real no Monitor Serial, delay(1000); //todo segundo }
Reter a hora no relógio em tempo real
Se você não quiser zerar a hora toda vez que o RTC for desligado, você deve fazer o seguinte:
- Após configurar a hora, você deve comentar a função que define a hora e fazer o upload do código novamente.
Esta é uma etapa muito importante para configurar a hora em seu RTC. Se você não fizer isso, sempre que seu RTC for redefinido, ele exibirá a hora que você configurou anteriormente e não a hora atual.
Demonstração
Abra o monitor serial a uma taxa de transmissão de 9600 e você verá os resultados.
Aqui está o Monitor Serial exibindo a data e hora atuais.
Conclusão
Neste guia, mostrei como usar um RTC DS1307 e ou DS3231 com o Arduino. Espero que você tenha achado útil e informativo. Se sim, compartilhe com um amigo que também gosta de eletrônica e de fazer coisas!
O módulo RTC é muito útil e você pode usá-lo como relógio, cronômetro, etc.
Eu adoraria saber quais projetos você planeja construir (ou já construiu) com esse RTC. Se você tiver alguma dúvida, sugestão ou se achar que falta algo neste tutorial, por favor, deixe um comentário abaixo.