RTC gibt falsche Werte aus

Das gibt der Serial Monitor aus:

1:03:37 2 4 2019
1:03:38 2 4 2019
1:03:39 2 4 2019
1:03:40 2 4 2019
1:03:41 2 4 2019
1:03:42 2 4 2019
1:03:43 2 4 2019
1:03:44 2 4 2019
1:03:45 2 4 2019
1:03:46 2 4 2019
1:03:47 2 4 2019
1:03:48 2 4 2019
1:03:49 2 4 2019
1:03:50 2 4 2019
1:03:51 2 4 2019
1:03:52 2 4 2019
1:03:53 2 4 2019
1:03:54 2 4 2019
1:03:55 2 4 2019
1:03:56 2 4 2019
1:03:57 2 4 2019
1:03:58 2 4 2019
1:03:59 2 4 2019
1:04:00 2 4 2019
1:04:01 2 4 2019
0:04:03 2 4 2019
0:04:04 2 4 2019
0:04:05 2 4 2019
0:04:06 2 4 2019
0:04:07 2 4 2019
0:04:08 2 4 2019
0:04:09 2 4 2019
0:04:10 2 4 2019
0:04:11 2 4 2019
0:04:12 2 4 2019
0:04:13 2 4 2019
0:04:14 2 4 2019
0:04:15 2 4 2019
0:04:16 2 4 2019
0:04:17 2 4 2019
0:04:18 2 4 2019
0:04:19 2 4 2019
0:04:20 2 4 2019
0:04:21 2 4 2019
0:04:22 2 4 2019
0:04:23 2 4 2019
0:04:24 2 4 2019
0:04:25 2 4 2019
0:04:26 2 4 2019
0:04:27 2 4 2019
0:04:28 2 4 2019
0:04:29 2 4 2019
0:04:30 2 4 2019
0:04:31 2 4 2019
0:04:32 2 4 2019
0:04:33 2 4 2019
0:04:34 2 4 2019
0:04:35 2 4 2019
0:04:36 2 4 2019
0:04:37 2 4 2019
0:04:38 2 4 2019
0:04:39 2 4 2019
0:04:40 2 4 2019
0:04:41 2 4 2019
0:04:42 2 4 2019
0:04:43 2 4 2019
0:04:44 2 4 2019
0:04:45 2 4 2019
0:04:46 2 4 2019
0:04:47 2 4 2019
0:04:48 2 4 2019
0:04:49 2 4 2019
0:04:50 2 4 2019
0:04:51 2 4 2019
0:04:52 2 4 2019
0:04:53 2 4 2019
0:04:54 2 4 2019

Der Code:

#include <TimeLib.h> Bibliotheken laden
#include <Wire.h>
#include <DS1307RTC.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //In dieser Zeile wird festgelegt, welche Pins des Mikrocontrollerboards für das LCD verwendet wird

void setup() 
{
lcd.begin(16, 2); //Im Setup wird angegeben, wie viele Zeichen und Zeilen werwendet werden.
Serial.begin(9600); //Öffnet den seriellen Port und legt die Baud Rate (9600) für die serielle Übertragung fest.
//setSyncProvider(RTC.get); //Dies ist die Funktion um die Zeit- und Datumsangabe von der RTC zu bekommen
  RTC.stop();
   RTC.set(DS1307_SEC,0);
   RTC.set(DS1307_MIN,20);
   RTC.set(DS1307_HR,10);
   RTC.set(DS1307_DOW,1);
   RTC.set(DS1307_DATE,8);
   RTC.set(DS1307_MTH,6);
   RTC.set(DS1307_YR,12);
   RTC.start();
}

void loop() 
{
Serial.print(hour()); //Serial.print ist der Befehl etwas im seriellen Monitor anzuzeigen (Stunde, Minute, Sekunde, Leerzeichen, Tag, Leerzeichen, usw.)
printDigits(minute()); //bei den Minuten und Sekunden wird der Befehl
printDigits(second()); //printDigits angegeben welcher am Ende des Codes noch festgelegt wird.
Serial.print(" ");
Serial.print(day());
Serial.print(" ");
Serial.print(month());
Serial.print(" ");
Serial.print(year());
Serial.println();
delay(1000); //warte eine Sekunde
lcd.setCursor(2, 0); //setCursor gibt an wo der Text beginnen soll. In diesem Fall beim dritten Zeichen in der ersten Reihe.
lcd.print(hour()); //Hier soll jetzt die Uhrzeit angezeigt werden, also „hour“ „:“ „minute“ usw..
lcd.print(":");
lcd.print (minute());
lcd.print(":");
lcd.print(second());
lcd.print(" ");
lcd.print("Uhr"); //Hier soll nach der Uhrzeit noch das Wort „Uhr“ angezeigt werden, dazu müssen noch3 Leerzeichen folgen, sonst würde bei Zahlen <10 immer ein weiteres „r“ hinter Uhr angezeigt werden. Das liegt daran, dass in der LCD Library der Befehl eine 0 vor Zahlen <10 anzuzeigen nicht vorhanden ist.
lcd.print(" ");
lcd.print(" ");
lcd.print(" "); 
lcd.setCursor(1, 1); // Der nächste „Text“ soll nun beim zweiten Zeichen in der zweiten Reihe beginnen.
lcd.print(day()); // Das Datum soll nun als
lcd.print("."); // „Tag“, „.“ „Monat“ usw. angegeben werden.
lcd.print(month());
lcd.print(".");
lcd.print(year());
}

void printDigits(int digits) //In diesem Abschnitt wird festgelgt, dass bei Zahlen <10 im seriellen Monitor automatisch eine 0 vor den Ziffern angezeigt wird. Das gilt nur für den seriellen Monitor und nicht für LCD Display.
{ 
Serial.print(":"); 
if(digits < 10) 
Serial.print('0'); 
Serial.print(digits); 
}

Kann mir jemand helfen?

Hi

Du machst was falsch.
Ganz bestimmt sogar.

Denke, Dein Sketch ist ein Beispiel der verwendeten Library?
Meine Beispiele zur RTC1307 sehen anders aus - somit kann ich auch nicht prüfen, ob Deine Aufrufe korrekt sind.

Geben die Methoden zu RTC.set was zurück?
Ein Blick in die Library könnte Das klären - wenn ja, könnte man sich die Rückgaben ausgeben lassen und so einkreisen, wo was falsch läuft.
Da scheinbar keine Deiner Eingaben übernommen wird (10:20:00h, 08.06.2012 ... oder 1912?)

MfG

Also mit dem Original Code von der Libary haben beide RTCs (DS1301 und DS3231) das selbe Problem (falscher Tag und Stunde)

#include <TimeLib.h> Bibliotheken laden
#include <Wire.h>
#include <DS1307RTC.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //In dieser Zeile wird festgelegt, welche Pins des Mikrocontrollerboards für das LCD verwendet wird

void setup() 
{
lcd.begin(16, 2); //Im Setup wird angegeben, wie viele Zeichen und Zeilen werwendet werden.
Serial.begin(9600); //Öffnet den seriellen Port und legt die Baud Rate (9600) für die serielle Übertragung fest.
setSyncProvider(RTC.get); //Dies ist die Funktion um die Zeit- und Datumsangabe von der RTC zu bekommen
}

void loop() 
{
Serial.print(hour()); //Serial.print ist der Befehl etwas im seriellen Monitor anzuzeigen (Stunde, Minute, Sekunde, Leerzeichen, Tag, Leerzeichen, usw.)
printDigits(minute()); //bei den Minuten und Sekunden wird der Befehl
printDigits(second()); //printDigits angegeben welcher am Ende des Codes noch festgelegt wird.
Serial.print(" ");
Serial.print(day());
Serial.print(" ");
Serial.print(month());
Serial.print(" ");
Serial.print(year());
Serial.println();
delay(1000); //warte eine Sekunde
lcd.setCursor(2, 0); //setCursor gibt an wo der Text beginnen soll. In diesem Fall beim dritten Zeichen in der ersten Reihe.
lcd.print(hour()); //Hier soll jetzt die Uhrzeit angezeigt werden, also „hour“ „:“ „minute“ usw..
lcd.print(":");
lcd.print (minute());
lcd.print(":");
lcd.print(second());
lcd.print(" ");
lcd.print("Uhr"); //Hier soll nach der Uhrzeit noch das Wort „Uhr“ angezeigt werden, dazu müssen noch3 Leerzeichen folgen, sonst würde bei Zahlen <10 immer ein weiteres „r“ hinter Uhr angezeigt werden. Das liegt daran, dass in der LCD Library der Befehl eine 0 vor Zahlen <10 anzuzeigen nicht vorhanden ist.
lcd.print(" ");
lcd.print(" ");
lcd.print(" "); 
lcd.setCursor(1, 1); // Der nächste „Text“ soll nun beim zweiten Zeichen in der zweiten Reihe beginnen.
lcd.print(day()); // Das Datum soll nun als
lcd.print("."); // „Tag“, „.“ „Monat“ usw. angegeben werden.
lcd.print(month());
lcd.print(".");
lcd.print(year());
}

void printDigits(int digits) //In diesem Abschnitt wird festgelgt, dass bei Zahlen <10 im seriellen Monitor automatisch eine 0 vor den Ziffern angezeigt wird. Das gilt nur für den seriellen Monitor und nicht für LCD Display.
{ 
Serial.print(":"); 
if(digits < 10) 
Serial.print('0'); 
Serial.print(digits); 
}

Andere Libary(DS1307RTC von Michael Margolis V1.4.0), andere Probleme…

DS1307RTC Read Test
-------------------
Ok, Time = 00:52:03, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:52:00, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:52:01, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:52:02, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:52:03, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:52:00, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:52:01, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:52:00, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:52:01, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:52:02, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:52:03, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:52:00, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:52:01, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:52:02, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:52:03, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:52:00, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:52:01, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:53:00, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:53:01, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:53:02, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:53:03, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:53:00, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:53:01, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:53:02, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:53:03, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:53:00, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:53:01, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:53:00, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:53:01, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:53:02, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:53:03, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:53:00, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:53:01, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:53:02, Date (D/M/Y) = 2/4/2019
Ok, Time = 00:53:03, Date (D/M/Y) = 2/4/2019
#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>

void setup() {
  Serial.begin(9600);
  while (!Serial) ; // wait for serial
  delay(200);
  Serial.println("DS1307RTC Read Test");
  Serial.println("-------------------");
}

void loop() {
  tmElements_t tm;

  if (RTC.read(tm)) {
    Serial.print("Ok, Time = ");
    print2digits(tm.Hour);
    Serial.write(':');
    print2digits(tm.Minute);
    Serial.write(':');
    print2digits(tm.Second);
    Serial.print(", Date (D/M/Y) = ");
    Serial.print(tm.Day);
    Serial.write('/');
    Serial.print(tm.Month);
    Serial.write('/');
    Serial.print(tmYearToCalendar(tm.Year));
    Serial.println();
  } else {
    if (RTC.chipPresent()) {
      Serial.println("The DS1307 is stopped.  Please run the SetTime");
      Serial.println("example to initialize the time and begin running.");
      Serial.println();
    } else {
      Serial.println("DS1307 read error!  Please check the circuitry.");
      Serial.println();
    }
    delay(9000);
  }
  delay(1000);
}

void print2digits(int number) {
  if (number >= 0 && number < 10) {
    Serial.write('0');
  }
  Serial.print(number);
}

Also mit dem Original Code von der Libary haben beide RTCs (DS1301 und DS3231) das selbe Problem (falscher Tag und Stunde)

Wieso verwendest Du eine DS1307 Library für die DS1301 bzw DS3231 RTCs?
Grüße Uwe