Mega + RTC DS3231 verliert Zeit

Hallo in die Runde,

ich nutze einen Mega mit einem DS3231, auch nicht das erste mal... Ich kann mit dem Beispiel- Sketch "set.RTC seriell" Datum und Zeit erfolgreich setzen, doch sobald die Schaltung stromlos ist verliert sie auch die Zeit. Ich habe schon 2 verschiedene Module getestet und auch die Batterie erneuert... leider ohne Erfolg.

Wie hoch ist der Zeitverlust?

Ich kenne dieses Problem bei meinen RTC nicht und ich verwende hier aktuell 2 Stück, die auch nach dem Einschalten die genaue Zeit anzeigen.

Evtl. sind die RTC von minderer Qualität.

der geht immer direkt auf den 1.1.1970- also so als wenn das Modul die Spannung verliert...

MaHa76:
der geht immer direkt auf den 1.1.1970- also so als wenn das Modul die Spannung verliert...

Das sieht danach aus, als würdest du die RTC jedes mal neu stellen.

Poste bitte deinen Sketch.

Aber bitte in Code-Tags (Schaltfläche </> verwenden)

MaHa76:
der geht immer direkt auf den 1.1.1970- also so als wenn das Modul die Spannung verliert...

Der 01.01.1970 00:00 UTC ist der Startzeitpunkt der Linux-Zeit ("Sekunden seit diesem Zeitpunkt").

Deine RTC arbeitet intern gar nicht mit dieser Zeit, sondern mit getrennten Registern für Tag, Monat, Jahr, Stunde, Minute, Sekunde.

Wenn Deine Uhr stromlos ist und auch die Backup-Batteriestromversorgung versagt, dann sollte Deine Uhr mit dieser Zeitangabe starten:
01.01.00 um 00:00:00 Uhr.
Je nach verwendeter Library könnte das interpretiert werden als:
01.01.1900 um 00:00:00 Uhr.
oder
01.01.2000 um 00:00:00 Uhr.

letztere Zeitangabe ließe sich auch in eine Linux-Zeitangabe umwandeln.

Also wenn Deine Zeit immer am 01,01.1970 startet, dann vermute ich eher, dass Du die Zeit nicht von einem RTC-Modul beziehst (weder einem mit richtiger Zeit gestellten noch einem bei 0 startenden Modul), sondern dass Du einfach die Zeit aus einer nicht initialisierten Time-Library rausziehst, die intern mit Linux-Zeit arbeitet.

Das mit dem 01.01.1970 sieht mir eher nach einem Softwarefehler als nach einem Hardwareproblem aus.

Es könnte allerdings auch sein, dass die von Dir verwendete Zeit-Library ein Problem mit der RTC erkennt, und es sich beim Start am 01.01.1970 um eine Art "Fehlerbehandlung" handelt.

Hallo,

versuch mal den Code aus diesem Tutorial: Tutorial – Using DS1307 and DS3231 Real-time Clock Modules with Arduino

Die Uhr wird ohne jedes schmückende Beiwerk ausgelesen. Man sieht sofort, was die Uhr macht.

ich bin in 2h zu Hause und setze mal den Code den ich habe hier rein...

mein Rechner läuft auf Linux... also holt er sich eventl. da die zeit?

MaHa76:
ich bin in 2h zu Hause und setze mal den Code den ich habe hier rein...

mein Rechner läuft auf Linux... also holt er sich eventl. da die zeit?

Dann müsste ja dein Linux-Rechner immer eine falsche Zeit anzeigen.

Ich glaube eher das ist in der Setup-Routine verankert.

Linux Zeit = Sekunden seit Anfang 1970 in einem 32 Bit Integer

Das ist nur ein bestimmtes Format

achso- OK... ich poste nachher den Code

MaHa76:
ich bin in 2h zu Hause und setze mal den Code den ich habe hier rein...

mein Rechner läuft auf Linux... also holt er sich eventl. da die zeit?

Nein, kein PC gibt seine Daten einfach so von alleine preis, auch nicht Datum und Uhrzeit.

Damit Dein Arduino seine Zeit von einem Linux-PC holen kann, müßte auf Deinen PC ein Programm aktiv laufen, das die Zeit zum Arduino sendet.

Die falsche Startzeit Unixtime "0" (= 01.01.1970 00:00 Uhr) wird sich Dein Arduino schon selber holen, entweder durch falsche oder fehlende Initialisierung einer verwendeten Library, oder als Fall-Back Option im Fehlerfall, dass die RTC nicht korrekt ausgelesen werden kann.

So, das hier ist der Code... mir ist aufgefallen, dass es schon reicht den seriellen Monitor zu und auf zu machen, dass die Zeit auf 1970 gesetzt wird....

Das setzen der Zeit klappt aber ohne Probleme....

/*----------------------------------------------------------------------*
 * Display the date and time from a DS3231 or DS3232 RTC every second.  *
 * Display the temperature once per minute. (The DS3231 does a          *
 * temperature conversion once every 64 seconds. This is also the       *
 * default for the DS3232.)                                             *
 *                                                                      *
 * Set the date and time by entering the following on the Arduino       *
 * serial monitor:                                                      *
 *    year,month,day,hour,minute,second,                                *
 *                                                                      *
 * Where                                                                *
 *    year can be two or four digits,                                   *
 *    month is 1-12,                                                    *
 *    day is 1-31,                                                      *
 *    hour is 0-23, and                                                 *
 *    minute and second are 0-59.                                       *
 *                                                                      *
 * Entering the final comma delimiter (after "second") will avoid a     *
 * one-second timeout and will allow the RTC to be set more accurately. *
 *                                                                      *
 * No validity checking is done, invalid values or incomplete syntax    *
 * in the input will result in an incorrect RTC setting.                *
 *                                                                      *
 * Jack Christensen 08Aug2013                                           *
 *                                                                      *
 * Tested with Arduino 1.0.5, Arduino Uno, DS3231/Chronodot, DS3232.    *
 *                                                                      *
 * This work is licensed under the Creative Commons Attribution-        *
 * ShareAlike 3.0 Unported License. To view a copy of this license,     *
 * visit http://creativecommons.org/licenses/by-sa/3.0/ or send a       *
 * letter to Creative Commons, 171 Second Street, Suite 300,            *
 * San Francisco, California, 94105, USA.                               *
 *----------------------------------------------------------------------*/ 
 
#include <DS3232RTC.h>        //http://github.com/JChristensen/DS3232RTC
#include <Streaming.h>        //http://arduiniana.org/libraries/streaming/
#include <Time.h>             //http://playground.arduino.cc/Code/Time
#include <Wire.h>             //http://arduino.cc/en/Reference/Wire

void setup(void)
{
    Serial.begin(115200);
    
    //setSyncProvider() causes the Time library to synchronize with the
    //external RTC by calling RTC.get() every five minutes by default.
    setSyncProvider(RTC.get);
    Serial << F("RTC Sync");
    if (timeStatus() != timeSet) Serial << F(" FAIL!");
    Serial << endl;
}

void loop(void)
{
    static time_t tLast;
    time_t t;
    tmElements_t tm;

    //check for input to set the RTC, minimum length is 12, i.e. yy,m,d,h,m,s
    if (Serial.available() >= 12) {
        //note that the tmElements_t Year member is an offset from 1970,
        //but the RTC wants the last two digits of the calendar year.
        //use the convenience macros from Time.h to do the conversions.
        int y = Serial.parseInt();
        if (y >= 100 && y < 1000)
            Serial << F("Error: Year must be two digits or four digits!") << endl;
        else {
            if (y >= 1000)
                tm.Year = CalendarYrToTm(y);
            else    //(y < 100)
                tm.Year = y2kYearToTm(y);
            tm.Month = Serial.parseInt();
            tm.Day = Serial.parseInt();
            tm.Hour = Serial.parseInt();
            tm.Minute = Serial.parseInt();
            tm.Second = Serial.parseInt();
            t = makeTime(tm);
            RTC.set(t);        //use the time_t value to ensure correct weekday is set
            setTime(t);        
            Serial << F("RTC set to: ");
            printDateTime(t);
            Serial << endl;
            //dump any extraneous input
            while (Serial.available() > 0) Serial.read();
        }
    }
    
    t = now();
    if (t != tLast) {
        tLast = t;
        printDateTime(t);
        if (second(t) == 0) {
            float c = RTC.temperature() / 4.;
            float f = c * 9. / 5. + 32.;
            Serial << F("  ") << c << F(" C  ") << f << F(" F");
        }
        Serial << endl;
    }
}

//print date and time to Serial
void printDateTime(time_t t)
{
    printDate(t);
    Serial << ' ';
    printTime(t);
}

//print time to Serial
void printTime(time_t t)
{
    printI00(hour(t), ':');
    printI00(minute(t), ':');
    printI00(second(t), ' ');
}

//print date to Serial
void printDate(time_t t)
{
    printI00(day(t), 0);
    Serial << monthShortStr(month(t)) << _DEC(year(t));
}

//Print an integer in "00" format (with leading zero),
//followed by a delimiter character to Serial.
//Input value assumed to be between 0 and 99.
void printI00(int val, char delim)
{
    if (val < 10) Serial << '0';
    Serial << _DEC(val);
    if (delim > 0) Serial << delim;
    return;
}

Das Öffnen der seriellen Schnittelle löst einen Reset aus. Allerdings steht in setup() nichts dass die Zeit ändert.

mich wundert das ganze, weil ich mit den Zeitmodulen und diesem Sketch schon erfolgreich gearbeitet habe...

Prüfe doch mal mit dem Sketch von Theseus deine Hardware.

Habs... war mutmaßlich die Libary... habe eine bestehende funktionierende Schaltung genommen und getestet- selber Fehler... auf blauen Dunst die Libray neu installiert- siehe da es geht.

Vielen Dank für Eure schnelle und tolle Hilfe!!! Das Forum ist echt klasse!