Dificuldade com RTC DS3231

Prezados,

Tenho um módulo hardware RTC modelo DS3231 e estou tentando fazer um teste simples com ele mas estou tendo dificuldade. Vejam se conseguem me ajudar. Sou iniciante.

Baixei a biblioteca referente ao DS3231 no site: www.rinkydinkelectronics.com . Descompactei-a e salvei na pasta Libraries.

Estou usando uma placa de Arduino Uno, na qual conectei o módulo DS3231.

Estou usando o código presente no exemplo DS3231_Serial_Easy fornecido pela biblioteca que foi baixada. Este código deveria permitir que a data e hora fossem setadas e exibidas no Serial Print. Segue abaixo o código do referido exemplo:

// DS3231_Serial_Easy
// Copyright (C)2015 Rinky-Dink Electronics, Henning Karlsen. All right reserved
// web: http://www.RinkyDinkElectronics.com/
//
// A quick demo of how to use my DS3231-library to 
// quickly send time and date information over a serial link
//
// To use the hardware I2C (TWI) interface of the Arduino you must connect
// the pins as follows:
//
// Arduino Uno/2009:
// ----------------------
// DS3231:  SDA pin   -> Arduino Analog 4 or the dedicated SDA pin
//          SCL pin   -> Arduino Analog 5 or the dedicated SCL pin
//

//
// The internal pull-up resistors will be activated when using the 
// hardware I2C interfaces.
//


#include <DS3231.h>

// Init the DS3231 using the hardware interface
DS3231  rtc(SDA, SCL);

void setup()
{
  // Setup Serial connection
  Serial.begin(115200);
  // Uncomment the next line if you are using an Arduino Leonardo
  //while (!Serial) {}
  
  // Initialize the rtc object
  rtc.begin();
  
  // The following lines can be uncommented to set the date and time
  //rtc.setDOW(WEDNESDAY);     // Set Day-of-Week to SUNDAY
  //rtc.setTime(12, 0, 0);     // Set the time to 12:00:00 (24hr format)
  //rtc.setDate(1, 1, 2014);   // Set the date to January 1st, 2014
}

void loop()
{
  // Send Day-of-Week
  Serial.print(rtc.getDOWStr());
  Serial.print(" ");
  
  // Send date
  Serial.print(rtc.getDateStr());
  Serial.print(" -- ");

  // Send time
  Serial.println(rtc.getTimeStr());
  
  // Wait one second before repeating :)
  delay (1000);
}

Até aqui tudo certo, mas na hora de verificar o código, está aparecendo as seguintes mensagens de erros:

C:\Users\PARNA-02\Desktop\arduino-nightly-windows\arduino-nightly\libraries\DS3231\DS3231.cpp: In member function 'char* DS3231::getDOWStr(uint8_t)':

C:\Users\PARNA-02\Desktop\arduino-nightly-windows\arduino-nightly\libraries\DS3231\DS3231.cpp:275:17: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

  char *output = "xxxxxxxxxx";

                 ^

C:\Users\PARNA-02\Desktop\arduino-nightly-windows\arduino-nightly\libraries\DS3231\DS3231.cpp:276:99: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

  char *daysLong[]  = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};

                                                                                                   ^

C:\Users\PARNA-02\Desktop\arduino-nightly-windows\arduino-nightly\libraries\DS3231\DS3231.cpp:276:99: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]



  char *daysShort[] = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};

                                                                      ^

C:\Users\PARNA-02\Desktop\arduino-nightly-windows\arduino-nightly\libraries\DS3231\DS3231.cpp:277:70: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]



  char *output= "xxxxxxxxx";

                ^

C:\Users\PARNA-02\Desktop\arduino-nightly-windows\arduino-nightly\libraries\DS3231\DS3231.cpp:290:144: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

  char *monthLong[]  = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};

                                                                                                                                                ^

C:\Users\PARNA-02\Desktop\arduino-nightly-windows\arduino-nightly\libraries\DS3231\DS3231.cpp:290:144: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]



  char *monthShort[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};

                                                                                                          ^



C:\Users\PARNA-02\Desktop\arduino-nightly-windows\arduino-nightly\libraries\DS3231\DS3231.cpp:291:106: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

Depois que aparecem esses erros, o software termina a verificação exibindo a seguinte mensagem:

O sketch usa 3710 bytes (11%) de espaço de armazenamento para programas. O máximo são 32256 bytes.
Variáveis globais usam 292 bytes (14%) de memória dinâmica, deixando 1756 bytes para variáveis locais. O máximo são 2048 bytes.

Mesmo aparecendo esses erros, eu carreguei o código no Arduino, pois aparentemente a verificação tinha finalizado corretamente. Porém após carregar o código no Arduino (conectado ao módulo DS3231) o Monitor serial não exibe as informações da Data e Hora como deveria.

Caso alguém possa me ajudar, ficarei muito agradecido em poder contar com essa comunidade e poder avançar em meus conhecimentos com o Arduino.

Uma pergunta bem simples, qual o baudrate que está configurado o monitor serial?Ele tem que está com 115200.
Se estiver correto, qual o erro que aparece no monitor serial?

Olá tecdiego,

Obrigado pela atenção.

Sim, eu estou usando a velocidade de 115200.

No monitor serial não aparece nenhuma mensagem (permanece em branco). Inclusive o led do Tx da placa do arduino não fica piscando como se estivesse enviando dados para o software.

Pessoal,

Talvez para ajudar na análise do que está acontecendo com meu projeto de teste de um módulo RTC DS3231, sugiro que baixem a biblioteca do DS3231 que está disponível em: www.rinkydinkelectronics.com

Depois disso, vocês podem abrir o exemplo, da biblioteca baixada, denominado DS3231_Serial_Easy e rodar a verificação para ver se os erros que aparecem aqui para mim também aparecerá para vocês.

Isso dá para ser feito sem o hardware DS3231, somente rodando a verificação do código do exemplo disponível na biblioteca.

Caso vocês tenham alguma sugestão de outra biblioteca disponível para download, que possua algum exemplo simples de uso do módulo DS3231, podem me indicar também que eu faço o teste por aqui.

Abraços,

Não são erros, são “avisos”. Os que apresentou podem ser ignorados seguramente.
Seu programa rodará normalmente.

Para se aprofundar, pesquise o “aviso” no Google:

warning: deprecated conversion from string constant to 'char*'

o Monitor serial não exibe as informações da Data e Hora como deveria.

O que está exibindo e o que deveria estar exibindo?

Olá giova014,

Obrigado pelo esclarecimento sobre os avisos, que não são erros.

O Monitor Serial deveria apresentar as informações do Dia da Semana, Data e Hora. Atualizando a cada 1 segundo. Mas não aparece nada no Monitor Serial. Nem o led do Tx da placa Arduíno fica piscando. Já tentei testar em outra placa Arduíno e continua a mesma coisa, nada aparece no Monitor Serial.

Abraços,

Faça testes:

  • Adicione um print() logo após o Serial.begin() em seu setup():
Serial.begin(115200);
Serial.println("---Programa iniciado---");

Por exemplo, mas poderia ser qualquer texto indicativo.
Rode o programa e veja se no Monitor Serial aparece o print.

  • Comente a linha no seu setup():
rtc.begin();

para ver se ela está travando seu setup() e impedindo ir para o loop()

Oi giova014,

Mais uma vez obrigado.

Resultado do Teste 1:

"Adicione um print() logo após o Serial.begin() em seu setup():
Code: [Select]
Serial.begin(115200);
Serial.println("---Programa iniciado---");
Por exemplo, mas poderia ser qualquer texto indicativo.
Rode o programa e veja se no Monitor Serial aparece o print."

Sim, o texto adicionado aparece na primeira linha do Monitor Serial

Resultado do Teste 2:

" Comente a linha no seu setup():
Code: [Select]
rtc.begin();
para ver se ela está travando seu setup() e impedindo ir para o loop()"

Como você sugeriu eu comentei a linha como mostrado abaixo:

 // rtc.begin();

Porém após carregar o programa novamente no Arduino o mesmo problema persiste. Isto é, o Monitor Serial não exibe os dados da data e hora. Agora somente o texto que programamos no teste anterior aparece na primeira linha do Monitor Serial.

Se tiver mais algum teste para eu fazer me avise que vou tentando por aqui.

Abraços,

A estratégia é colocar print() em pontos do seu código e ver se a execução os alcança.
Teste o código abaixo e veja o que aparece no Monitor Serial:

// DS3231_Serial_Easy
// Copyright (C)2015 Rinky-Dink Electronics, Henning Karlsen. All right reserved
// web: http://www.RinkyDinkElectronics.com/
//
// A quick demo of how to use my DS3231-library to 
// quickly send time and date information over a serial link
//
// To use the hardware I2C (TWI) interface of the Arduino you must connect
// the pins as follows:
//
// Arduino Uno/2009:
// ----------------------
// DS3231:  SDA pin   -> Arduino Analog 4 or the dedicated SDA pin
//          SCL pin   -> Arduino Analog 5 or the dedicated SCL pin
//

//
// The internal pull-up resistors will be activated when using the 
// hardware I2C interfaces.
//


#include <DS3231.h>

// Init the DS3231 using the hardware interface
DS3231  rtc(SDA, SCL);

void setup()
{
  // Setup Serial connection
  Serial.begin(115200);
  Serial.println("--- Programa iniciado ---");
  // Uncomment the next line if you are using an Arduino Leonardo
  //while (!Serial) {}
  
  // Initialize the rtc object
  rtc.begin();
  
  
  // The following lines can be uncommented to set the date and time
  //rtc.setDOW(WEDNESDAY);     // Set Day-of-Week to SUNDAY
  //rtc.setTime(12, 0, 0);     // Set the time to 12:00:00 (24hr format)
  //rtc.setDate(1, 1, 2014);   // Set the date to January 1st, 2014
  Serial.println("--- Fim do setup ---");
}

void loop()
{
  Serial.println("--- Loop ---");

  // Send Day-of-Week
  Serial.print(" Dia da Semana: ");
  Serial.print(rtc.getDOWStr());
  
  Serial.print(" | ");
  
  // Send date
  Serial.print(" Data: ")
  Serial.print(rtc.getDateStr());
  
  Serial.print(" | ");

  // Send time
  Serial.print(" Hora: ")
  Serial.print(rtc.getTimeStr());
  
  Serial.println();
  
  Serial.println("--- Fim do Loop ---");
  // Wait one second before repeating :)
  delay (1000);
}

Tem certeza que a conexão do RTC no Arduino está OK? Como estão ligados? Talvez um desenho ou foto.

Pode ser algo da biblioteca, tente procurar outras.

Giova014,

Muito interessante e prática sua ideia de colocar print() em diferentes pontos do código.

Veja só, testei o código que você enviou. Após a verificação do código, inseri alguns ponto-e-virgula que faltavam e carreguei no Arduino.

O Monitor Serial exibe os seguintes print ():

--- Programa iniciado ---
--- Fim do setup ---
--- Loop ---
 Dia da Semana:

Veja a tela do Monitor Serial em anexo. Veja em anexo também uma foto da montagem do hardware.

Parece que o problema está nos comandos que deveriam retornar os valores do dia da semana, data e hora, do módulo DS3231:

Serial.print(rtc.getDOWStr());
Serial.print(rtc.getDateStr());
Serial.print(rtc.getTimeStr());

Estes comandos parecem que não estão retornando os valores que deveriam e também não estão deixando executar o loop.

Eu testei retirar esses comandos e o loop rodou, porém como já era de se esperar, sem os dados de data e hora. Depois disso o Monitor Serial mostrou:

--- Programa iniciado ---
--- Fim do setup ---
--- Loop ---
 Dia da Semana:  |  Data:  |  Hora: 
--- Fim do Loop ---
--- Loop ---
 Dia da Semana:  |  Data:  |  Hora: 
--- Fim do Loop ---
--- Loop ---
 Dia da Semana:  |  Data:  |  Hora: 
--- Fim do Loop ---
--- Loop ---
 Dia da Semana:  |  Data:  |  Hora: 
--- Fim do Loop ---
--- Loop ---

Teste colocando dois resistores de pull-up (10kR), um no SCL e outro no SDA do Arduino Uno (A5 e A4).

Pull-up é entre o pino e o Vcc (+5V).

Oi giova014,

Boa tarde.

Coloquei os dois resistores de pull-up como você sugeriu e continua a mesma coisa, não roda o loop().

Veja a foto da montagem em anexo.

Mais algum teste ?

Giova014,

Remontei o hardware, agora em uma protoboard para evitar conexões mal feitas. Inclusive com os resistores de pull-up como sugerido. Veja foto em anexo.

Porém o mesmo problema persiste. Não roda o loop(). Parece que os comandos do código, citados abaixo, responsáveis por retornar os valores de dia-da-semana, data e hora no Monitor Serial estão impedindo que o loop() seja executado. Isso porque ao comentar essas linhas, o loop() roda normalmente.

Serial.print(rtc.getDOWStr());
Serial.print(rtc.getDateStr());
Serial.print(rtc.getTimeStr());

Será que vou ter que baixar outra biblioteca? Eu tinha gostado dessa biblioteca porque ela tem um exemplo fácil e simples para usar o módulo DS3231, ao contrário de outras que verifiquei as quais só apresentam exemplos complexos. Depois de conhecer esses recursos básicos do DS3231 eu iria inserí-lo em um outro projeto um pouco mais complexo.

Aos demais companheiros do Forum, quem quiser conferir baixem a biblioteca do DS3231 em www.RinkyDinkElectronics.com . Essa biblioteca tem um exemplo fácil para utilização do módulo DS3231. Porém essa biblioteca apresenta problemas que impedem o Arduino de realizar o loop().

Giova014, se tiver mais algum teste que eu possa fazer me diga, por gentileza.

Se alguém tiver conhecimento de alguma biblioteca para o modulo RTC DS3231, que tenha algum exemplo simples que faça o DS3231 exibir no Monitor Serial os dados de data e hora, por favor me indique.

Abraços,

Mantendo a mesma biblioteca, testaria com outro módulo se não tivesse que comprar, porém é mais fácil tentar outra biblioteca primeiro.

Tente esta biblioteca, que parece simples:

Veja o exemplo "TimeRTC.ino"

Vou tentar na hora do almoço e depois te dou um retorno.

Abraços,

Olá Giova014,

Desculpe a demora em te dar um retorno. Estive meio sem tempo pro Arduino…

Bem, vamos lá:

Antes de tentar usar a biblioteca que você sugeriu, decidi testar o módulo RTC DS3231 com a mesma biblioteca que eu já vinha usando, mas em uma placa Arduino Mega. Só para ver se o problema era alguma incompatibilidade com o Arduino Uno. Como resultado deste teste, o mesmo problema persistiu, isso é, o código ainda bloqueia o Loop(), assim os dados de data e hora não apareceram no Monitor Serial.

Sendo assim, parti para testar a biblioteca que você me sugeriu ( GitHub - JChristensen/DS3232RTC: Arduino Library for Maxim Integrated DS3232 and DS3231 Real-Time Clocks ).

Essa biblioteca possui dois exemplos mais básicos. Um para ajustar os dados de data e hora do RTC (exemplo SetSerial) e outro exemplo para exibir os dados do RTC (exemplo TimeRTC).

A princípio executei a verificação do exemplo SetSerial. Não apresentou erros. Então carreguei no Arduino. O exemplo SetSerial faz o ajuste dos dados de data e hora no RTC quando enviamos os dados que queremos via Monitor Serial. O ajuste funcionou corretamente. Como pode ser visto na foto do Monitor Serial em anexo dessa mensagem.

Até então tudo certo.

Porém veja só… Pensei que ao reiniciar o Monitor Serial, ou depois de desconectar o Arduino do USB do computador e religá-lo novamente, o módulo RTC deveria ter armazenado os dados de data e hora que eu havia configurado por meio do exemplo SetRTC. Porém quando reinicio o Arduino ou o Serial Monitor, os dados mostrados no Monitor Serial são reajustados para os dados anteriores.

Bem, você saberia o quê eu posso fazer para que os dados de data e hora, quando forem ajustados no módulo RTC, sejam exibidos no Monitor Serial quando eu desplugo e replugo o Arduino no computador, ou quando eu reiniciar o Monitor Serial.

Deu pra entender ?

Para eu entender melhor o funcionamento do RTC e da biblioteca, elaborei o código abaixo. Dê uma olhada se está ok. Tentei fazer o mais simples possível para ajustar os dados de data e hora e exibir no Monitor Serial. Esse código funciona bem, mas o mesmo problema continua, isto é, quando o Monitor Serial é reiniciado, os dados de data e hora exibidos no Monitor Serial são zerados para 1970.

#include <DS3232RTC.h> // Inclui a biblioteca do RTC DS3232 ou DS3231
#include <Time.h> // Inclui a biblioteca Time
#include <TimeLib.h>

void setup() {

Serial.begin (9600); // Inicia o Monitor Serial e define a frequencia dos dados em 9600 Hz

//Depois de ajustado os dados do RTC as duas linhas abaixos devem ser comentadas
setTime(23, 31, 30, 13, 2, 2009);   //Ajusta os dados de data e hora do sistema para 23h31m30s on 13Feb2009
RTC.set(now());                     // Ajusta o RTC para a hora e data do sistema

}

void loop() {

// Exibe os dados de data e hora no Monitor Serial
Serial.print(hour()); 
Serial.print(":");
Serial.print(minute());
Serial.print(":");
Serial.print(second());
Serial.print(' ');
Serial.print(day());
Serial.print(' ');
Serial.print(month());
Serial.print(' ');
Serial.print(year()); 
Serial.println(); 

// Reexibe os dados de data e hora no Monitor Serial a cada 1000 mS
delay (1000);

}

Mais uma vez obrigado e agradeço se eu puder continuar contando com sua ajuda.

Olá,

Que bom ver que você testou várias coisas, assim facilita encontrar o problema mais rapidamente.

Primeiro, rode o código apenas para definir o horário:

#include <DS3232RTC.h>
#include <Time.h>

void setup() {

setTime(23, 31, 30, 13, 2, 2009);   //Ajusta os dados de data e hora do sistema para 23h31m30s on 13Feb2009
RTC.set(now());                     // Ajusta o RTC para a hora e data do sistema

}

void loop(){

}

Depois, rode o código abaixo, que é uma praticamente o exemplo “TimeRTC”:

#include <DS3232RTC.h>
#include <Time.h>

void setup() {

	Serial.begin (9600); // Inicia o Monitor Serial e define a frequencia dos dados em 9600 Hz

	setSyncProvider(RTC.get); // the function to get the time from the RTC
	if(timeStatus() != timeSet) 
		Serial.println("Nao foi possivel sincronizar com o RTC");
	else
		Serial.println("O RTC definiu o horario do sistema"); 

}

void loop() {

	// Exibe os dados de data e hora no Monitor Serial
	Serial.print(hour());
	Serial.print(":");
	Serial.print(minute());
	Serial.print(":");
	Serial.print(second());
	Serial.print(' ');
	Serial.print(day());
	Serial.print(' ');
	Serial.print(month());
	Serial.print(' ');
	Serial.print(year());
	Serial.println();

	// Reexibe os dados de data e hora no Monitor Serial a cada 1000 mS
	delay (1000);

}

Quais os resultados?

Oi giova014,

Testei da maneira que você sugeriu. Primeiro carreguei o Arduíno ( + módulo DS3231) com o codigo para definir a data e hora. Depois carreguei com o código para exibir a data e hora no Monitor Serial.

Porém o resultado foi que os dados definidos de data e hora que foram inicialmente definidos não ficaram armazenados no módulo. Veja em anexo o Monitor Serial com o resultado do teste.

Testei a bateria do módulo com o voltímetro e a bateria está ok ( 3 v).

Será que vou ter que comprar outro módulo? Já estou achando que o problema pode ser com o hardware.

Abraços,

Olá,

No seu post:

Para eu entender melhor o funcionamento do RTC e da biblioteca, elaborei o código abaixo.

Você não utiliza o RTC no código, por isso consegue definir o horário usando só a biblioteca "Time.h".

Será que vou ter que comprar outro módulo?

Com os resultados até agora, o problema indica ser o hardware.
Portanto o próximo passo será testar com outro módulo, que no seu caso você terá que comprar.

Caso seja bom em análise de circuito, pode verificar o datasheet do DS3231 e medir cada pino dele (pelo menos os de alimentação e endereço) para verificar se os níveis de tensão estão corretos. Porém ainda há o risco do problema ser interno ao CI.

Oi giova014,

Você não utiliza o RTC no código, por isso consegue definir o horário usando só a biblioteca "Time.h".

É verdade, você tem razão. Legal saber que só com a biblioteca Time.h eu consigo fazer isso.

Mas ainda vou precisar usar um módulo RTC para manter as informações de data e hora. Como havia te falado anteriormente, eu estou testando esse módulo DS3231 para utilizá-lo em um outro projeto. Esse outro projeto se trata de uma pequena estação de coleta de dados climáticos. Por meio de sensores, vou coletar dados como de temperatura, umidade, chuva, etc e salvar esses dados em um cartão SD (*.txt) usando um módulo para cartão SD. Vou precisar atrelar aos dados coletados pelos sensores, a informação de data e hora em que os dados dos sensores foram coletados. Por isso é que vou precisar do módulo RTC. Todos os outros componentes da estação de coleta de dados climáticos já estão ok, incluindo a programação. Só falta o RTC.

Caso seja bom em análise de circuito, pode verificar o datasheet do DS3231 e medir cada pino dele (pelo menos os de alimentação e endereço) para verificar se os níveis de tensão estão corretos.

Realmente não vou saber analisar os circuitos do módulo para verificar problemas no hardware. Baixei o datasheet, mas é muito complexo para mim. Medi a tensão nos terminais do módulo (Vcc, SDA, SCL, SQW e 32K) e todos apresentaram 5 volts. Vou comprar outro módulo de qualquer forma.

Abraços,