RTC Tiny DS 1307 - Não recupera data certa


#1

Companheiros, estou tentando a duas semanas fazer o RTC Tiny 1307 ser estavel e não consigo. Testei varias rotinas e toda resultados parecidos. Recupera data e hora uma vez certo e outro errado.

====== Copilado em =======
Mar 10 2019 20:25:05

Ajustado horario RTC pela WEB
Variaveis usadas para acertar o RTC: 10.3.2019 — 22:24:31
Time das variables WEB: 10.3.2019 — 22:24:32
---------------------------
Data e Hora recuperado do RTC --> 10/3/2099 22:24:32
-------------
-------------
Time das variables WEB: 10.3.2019 — 22:24:33
---------------------------
Data e Hora recuperado do RTC --> 11/3/2099 23:25:33
-------------
-------------
Time das variables WEB: 10.3.2019 — 22:24:34
-------------**--------------
Data e Hora recuperado do RTC --> 10/3/2099 22:24:34

O codigo usado é este …

#include <WiFi.h>
#include “time.h”
#include “RTClib.h” // biblioteca RTC

RTC_DS1307 Rtc; // criado instancia Rtc
//struct tm t;

//time_t t_of_day;
const char* ssid = “********”;
const char* password = “”;

const char* ntpServer = “south-america.pool.ntp.org”;
const long gmtOffset_sec = -10800;
const int daylightOffset_sec = 3600;
int Websecond;
int Webminute;
int Webhour;
int Webday;
int Webmonth;
int Webyear;
int weekday;
long current;
//********************************************************
struct tm timeinfo;
time_t timeinfo_of_day;
//********************************************************
void printLocalTime()
{

if(!getLocalTime(&timeinfo)){
Serial.println(“Failed to obtain time”);
return;
}

//Serial.println(&timeinfo, “%A, %b %d %Y %H:%M:%S”);

Websecond = timeinfo.tm_sec;
Webminute = timeinfo.tm_min;
Webhour = timeinfo.tm_hour;
Webday = timeinfo.tm_mday;
Webmonth = timeinfo.tm_mon + 1;
Webyear = timeinfo.tm_year + 1900;
weekday = timeinfo.tm_wday +1;
Serial.print(“Time das variables WEB: “);
Serial.print(Webday);
Serial.print(”.”);
Serial.print(Webmonth);
Serial.print(".");
Serial.print(Webyear);
Serial.print(" — “);
Serial.print(Webhour);
Serial.print(”:");
Serial.print(Webminute);
Serial.print(":");
Serial.println(Websecond);

// ** Mostra no monitor serial a data e hora do RTC

DateTime tstamp = Rtc.now();

timeinfo.tm_year = tstamp.year()-1900;
timeinfo.tm_mon = tstamp.month(); // Month, 0 - jan
timeinfo.tm_mday = tstamp.day(); // Day of the month
timeinfo.tm_hour = tstamp.hour();
timeinfo.tm_min = tstamp.minute();
timeinfo.tm_sec = tstamp.second();
timeinfo.tm_isdst = -1; // Is DST on? 1 = yes, 0 = no, -1 = unknown
timeinfo_of_day = mktime(&timeinfo);
Serial.println("-------------**--------------");
Serial.print("Data e Hora recuperado do RTC --> ");

Serial.print(timeinfo.tm_mday, DEC);
Serial.print('/');
Serial.print(timeinfo.tm_mon, DEC);
Serial.print('/');
Serial.print(timeinfo.tm_year + 1900, DEC);
Serial.print(' ');
Serial.print(timeinfo.tm_hour, DEC);
Serial.print(':');
Serial.print(timeinfo.tm_min, DEC);
Serial.print(':');
Serial.print(timeinfo.tm_sec, DEC);
Serial.println();
Serial.println("-------------**-------------");

}

void setup()
{
Serial.begin(115200);

//connect to WiFi
Serial.printf(“Connecting to %s “, ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(”.”);
}
Serial.println(" CONNECTED");

//init and get the time
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
printLocalTime();

//disconnect WiFi as it’s no longer needed
WiFi.disconnect(true);
WiFi.mode(WIFI_OFF);

// ********************************************
// INICIA RTC
// ********************************************

Rtc.begin();  // Inicia RTC e copila com horario do computador

Serial.println("");
Serial.println("--------------------------");
Serial.println("====== Copilado em =======");
Serial.print(__DATE__);
Serial.print(" ");
Serial.println(__TIME__);
Serial.println("--------------------------");
Serial.println("");   
  

if (!Rtc.isrunning()) {
Serial.println("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");  
Serial.println("RTC parado, vou ajustar com a hora da compilacao...");
Serial.println("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
Rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}

Serial.println("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
Serial.println("           Ajustado horario RTC pela WEB");
Serial.println("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
Rtc.adjust(DateTime(Webyear - 1900, Webmonth, Webday, Webhour, Webminute, Websecond));

Serial.print(“Variaveis usadas para acertar o RTV: “);
Serial.print(Webday);
Serial.print(”.”);
Serial.print(Webmonth);
Serial.print(".");
Serial.print(Webyear);
Serial.print(" — “);
Serial.print(Webhour);
Serial.print(”:");
Serial.print(Webminute);
Serial.print(":");
Serial.println(Websecond);
}

void loop()
{
delay(1000);
printLocalTime();
}

Se alguem me ajudar, desde ja agradeço


#3

Uso a mesma lib e não tenho poblemas, inclusive percebi que você esta fazendo alguns calculos com o ano (-1900) que não são necessários como acontece usando time.h

Segue exemplo:

// Date and time functions using a DS1307 RTC connected via I2C and Wire lib
#include <Wire.h>
#include "RTClib.h"

#if defined(ARDUINO_ARCH_SAMD)
// for Zero, output on USB Serial console, remove line below if using programming port to program the Zero!
   #define Serial SerialUSB
#endif

RTC_DS1307 rtc;

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

void setup () {

#ifndef ESP8266
  while (!Serial); // for Leonardo/Micro/Zero
#endif

  Serial.begin(9600);
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
}

void loop () {
    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();
    
    Serial.print(" since midnight 1/1/1970 = ");
    Serial.print(now.unixtime());
    Serial.print("s = ");
    Serial.print(now.unixtime() / 86400L);
    Serial.println("d");
    
    // calculate a date which is 7 days and 30 seconds into the future
    DateTime future (now + TimeSpan(7,12,30,6));
    
    Serial.print(" now + 7d + 30s: ");
    Serial.print(future.year(), DEC);
    Serial.print('/');
    Serial.print(future.month(), DEC);
    Serial.print('/');
    Serial.print(future.day(), DEC);
    Serial.print(' ');
    Serial.print(future.hour(), DEC);
    Serial.print(':');
    Serial.print(future.minute(), DEC);
    Serial.print(':');
    Serial.print(future.second(), DEC);
    Serial.println();
    
    Serial.println();
    delay(3000);
}

#4

tenta fazer um Serial.print de (Webyear - 1900) logo antes do rtc.adjust() e ve o que da , pode ser um erro no que voce esta passando para o rtc.


#5

Arnold e Nicolas… muito obrigado pela resposta … mas depois de tando testar de tudo, resolvi comprar outro … e … pronto … rodando que é uma beleza, então eu devo estar com o RTC com defeito. Mas muito grato pela sua atenção.