RTC DS1307 Zeit lässt sich nicht stellen

Ich fummle gerade an einem RTC rum:
Angeschlossen über I2C an den Uno kann ich die Zeit zwar auslesen, das RTC aber nicht stellen (interne Zeit ist falsch)

Auch RTC.adjust(DateTime(2021, 2, 25, 18, 20, 0)); funtioniert nicht.

#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;

void setup () {
    Serial.begin (9600);
    Wire.begin ();
    RTC.begin ();
  if (! RTC.isrunning ()) {
    Serial.println ("RTC läuft NICHT!");
    // Die folgende Zeile setzt die RTC auf das Datum und die Uhrzeit, zu der diese Skizze erstellt wurde
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }}

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 (now.hour (), DEC);
    Serial.print (':');
    Serial.print (now.minute (), DEC);
    Serial.print (':');
    Serial.print (now.second (), DEC);
    Serial.println (); 
    delay(1000);
}

stoni99:
RTC aber nicht stellen (interne Zeit ist falsch)

Auch RTC.adjust(DateTime(2021, 2, 25, 18, 20, 0)); funtioniert nicht.

  if (! RTC.isrunning ()) {

Serial.println ("RTC läuft NICHT!");
    // Die folgende Zeile setzt die RTC auf das Datum und die Uhrzeit, zu der diese Skizze erstellt wurde
    RTC.adjust(DateTime(DATE, TIME));
  }}

Du musst schon schauen, wo Du versuchst zu stellen.

Weil RTC.isrunning() gibt einen bool zurück. Wenn der sagt, das die Uhr läuft (was sie ja tut - nur eben falsch), kannst Du in der Funktion reinschreiben was willst...

Also ausserhalb der Funktion die Zeit setzen.

Beispielcode im Original:

  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));
  }

Beispielcode spielt Dir nach jedem hochladen 2021... ein wenn die Uhr läuft:

  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));
  }
  else
  {
    rtc.adjust(DateTime(2021, 2, 25, 19, 10, 10));
  }

Und warum verwendest du eine solch ungenaue RTC, die den Namen RTC eigentlich nicht verdient hat.
Es gibt doch schon seit Jahren die DS3231, die deutlich genauer ist.

DANKE!

Also ist schon der Beispielcode falsch?! Tsss, tss, tsss... :smiley:

Die DS1307 lag bei mir noch in der Kramkiste. Wenn sie zu ungenau ist kann ich ja immer noch wechseln.

Was passier den dann wenns nicht funktioniert?
Grüße Uwe

stoni99:
DANKE!

Also ist schon der Beispielcode falsch?! Tsss, tss, tsss... :smiley:

NEIN! Deine Annahme entbehrt jeglichem Verständnis.
Der Beispielcode ist richtig. Der stellt die Uhr nur, wenn der Status "Ich bin irgendwas ausserhalb der Spur" zurück gegeben wird. z.B. Stromausfall.
Wenn die Abfrage ergibt, das die RTC "Ich laufe in der Spur" zurück gibt, ist es Deine Aufgabe das adjust durchzuführen.

Stelle Dir vor, ich komme aus China mit dem laufenden Modul und Du sitzt in Paris. :wink:
Fällt der Groschen?

uwefed:
Was passier den dann wenns nicht funktioniert?

Na nichts. Der bekommt die Zeit zurück, die die RTC ausgibt.
Erst wenn die Batterie entfernt würde. Dann kommt die Abfrage dazu festzustellen, das die Uhr nicht eingestellt ist.

stoni99:
Wenn sie zu ungenau ist kann ich ja immer noch wechseln.

Das ist die def. und da wäre mir die Zeit zu schade damit zu experimentieren.

Die DS1307 hat ein Bit das gesetzt wird wenn die beiden Versorgungsspannung (5V und Batterie) weg war und die Zeit ungültig ist.
mit
if (! RTC.isrunning ())
wird dies kontrolliert.
Eine falsch gestellte Zeit ist eine gültige Zeit. Darum muß das Zeitrichtigstellen über einene anderen Mechanismus erfolgen.
Grüße Uwe

HotSystems:
Und warum verwendest du eine solch ungenaue RTC, die den Namen RTC eigentlich nicht verdient hat.
Es gibt doch schon seit Jahren die DS3231, die deutlich genauer ist.

Ist "etwas" OT, dafür sorry, aber die Frage passt gut zu Deinem Hinweis:
Kennt jemand ein Micro SD Speichermodul mit DS3231, ähnlich wie Kombis die es mit der DS1307 gibt?

herbk:
Ist "etwas" OT, dafür sorry, aber die Frage passt gut zu Deinem Hinweis:
Kennt jemand ein Micro SD Speichermodul mit DS3231, ähnlich wie Kombis die es mit der DS1307 gibt?

Und welches wurde da vorgeschlagen ?
Vorschlag :
Alte RTC runterschmeißen und dieses hier drauflöten.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.