RTC "vergisst" die Zeit?

Moin Leute :slight_smile:

Ich habe ein einfaches RTC Modul hier an meinen Arduino angeschlossen, wenn ich die Zeit per .lib einspeicher, behält sie sie auch sehr gut. Wenn ich nur kurz die Stromversorgung kappe und nach meinetwegen 5 Minuten neu anschließe, gehts ebenfalls super.

Problem nur, wenn ich bsp. den Arduino √ľber nacht an habe, gibt er mir bsp. jetzt statt der jetzigen Uhrzeit (16:50 Uhr = in Sekunden -> 60600) 36400 Sekunden an.

Die Knopfzelle habe ich bereits gegen eine neue eingewechselt, woran kann das liegen, dass die Uhr trotz Knopfzelle (aber Arduino l√§uft √ľber nacht bsp nicht) falsch geht?

VIERcntHOLZ:
Die Knopfzelle habe ich bereits gegen eine neue eingewechselt, woran kann das liegen, dass die Uhr trotz Knopfzelle (aber Arduino l√§uft √ľber nacht bsp nicht) falsch geht?

Entweder hat Deine Bastelei eine Zeitreise gemacht.
Oder es liegt an der verwendeten Hardware oder Software.

Hallo,
Du hast das etwas komisch beschrieben. Deine RTC l√§uft richtig und gibt Dir weiterhin die richtige Zeit und Datum aus. Weil die RTC selbst keine reinen Sekunden z√§hlt, kannst Du das nur in Deinem Sketch machen. Und Deine Sekunden in Zahlen lassen mich vermuten, dass Du die Sekunden in int speicherst statt in long. Bei int hast Du aktuell einen Speicher√ľberlauf. Mit long wirst Du irgendwann auch einen haben. Nur sp√§ter. Dar√ľber mu√üt Du Dir Gadanken machen wenn Du √ľber l√§ngere Zeit die Laufzeit in reinen Sekunden haben m√∂chtest. Je nach dem was Du mit den Sekunden √ľberhaupt machen m√∂chtest.

Komplette Verdrahtung sowie die Software nachliefern.

sschultewolter:
Komplette Verdrahtung sowie die Software nachliefern.

Also verdrahtet habe ich momentan eigentlich ganz normal, GND auf GND, 5Volt auf VCC, A5 auf SCL und A4 auf SDA.
Ich habe ein Arduino Uno und ein normales DS1307 RTC modul.

Hallo,
Du hast das etwas komisch beschrieben. Deine RTC l√§uft richtig und gibt Dir weiterhin die richtige Zeit und Datum aus. Weil die RTC selbst keine reinen Sekunden z√§hlt, kannst Du das nur in Deinem Sketch machen. Und Deine Sekunden in Zahlen lassen mich vermuten, dass Du die Sekunden in int speicherst statt in long. Bei int hast Du aktuell einen Speicher√ľberlauf. Mit long wirst Du irgendwann auch einen haben. Nur sp√§ter. Dar√ľber mu√üt Du Dir Gadanken machen wenn Du √ľber l√§ngere Zeit die Laufzeit in reinen Sekunden haben m√∂chtest. Je nach dem was Du mit den Sekunden √ľberhaupt machen m√∂chtest.

Sie läuft richtig, wenn ich ihr mit

#include <Wire.h>    // I2C-Bibliothek einbinden
#include "RTClib.h"  // RTC-Bibliothek einbinden
RTC_DS1307 RTC;

void setup(void) {
  // Initialisiere I2C  
  Wire.begin();
  // Initialisiere RTC
  RTC.begin();
  // Serielle Ausgabe starten 
  Serial.begin(9600);
¬† // Pr√ľfen ob RTC l√§uft¬† 
  if (! RTC.isrunning()) {
    
    // Aktuelles Datum und Zeit setzen, falls die Uhr noch nicht läuft
    RTC.adjust(DateTime(__DATE__, __TIME__));
    
    Serial.println("Echtzeituhr wurde gestartet und auf Systemzeit gesetzt.");
  }
  else Serial.println("Echtzeituhr laeuft bereits.");

}

void loop(){
  DateTime now=RTC.now(); // aktuelle Zeit abrufen
  show_time_and_date(now);  // Datum und Uhrzeit ausgeben
  delay(1000); // 1 Sekunde warten bis zur nächsten Ausgabe
}

// Wochentag ermitteln
String get_day_of_week(uint8_t dow){ 
  
  String dows="  ";
  switch(dow){
   case 0: dows="So"; break;
   case 1: dows="Mo"; break;
   case 2: dows="Di"; break;
   case 3: dows="Mi"; break;
   case 4: dows="Do"; break;
   case 5: dows="Fr"; break;
   case 6: dows="Sa"; break;
  }
  
  return dows;
}

// Datum und Uhrzeit ausgeben
void show_time_and_date(DateTime datetime){
  
  // Wochentag, Tag.Monat.Jahr
  Serial.print(get_day_of_week(datetime.dayOfWeek()));
  Serial.print(", ");
  if(datetime.day()<10)Serial.print(0);
  Serial.print(datetime.day(),DEC);
  Serial.print(".");
  if(datetime.month()<10)Serial.print(0);
  Serial.print(datetime.month(),DEC);
  Serial.print(".");
  Serial.println(datetime.year(),DEC);
  
  // Stunde:Minute:Sekunde
  if(datetime.hour()<10)Serial.print(0);
  Serial.print(datetime.hour(),DEC);
  Serial.print(":");
  if(datetime.minute()<10)Serial.print(0);
  Serial.print(datetime.minute(),DEC);
  Serial.print(":");
  if(datetime.second()<10)Serial.print(0);
  Serial.println(datetime.second(),DEC);
}

Die Richtige Zeit einprogramier.

auch mit meinem Aquarien Controller läuft sie super.
Es l√§uft auf weiterhin Super, wenn ich nur ‚Äúkurz‚ÄĚ die Stromversorgung trenne, aber bsp. gestern Abend gegen 22 Uhr habe ich den PC ausgemacht => Arduino aus (bis dahin lief die RTC im Programm/Serial Monitor noch super)

Heute gegen 16:30, wie oben beschrieben, mach ich den pc wieder an, Arduino kriegt wieder strom, aber die Uhrzeit lief etwas nach, wie oben beschrieben :frowning:

Meine Sekunden habe ich als unsigned long gespeichert, da dies ja auch jede nacht um 0 Uhr resettet wird, sollte unsigned long doch theoretisch den Bereich von 0-86400 abbilden können?

Off topic, aber das mit dem Wochentag geht viel, viel schöner und Ressourcen-schonender, wenn du dir ein Array aus Strings anlegst. Dann ist "dow" einfach der Index im Array und du hast direkt den String. Und mit "String" meine ich char Arrays, nicht die String Klasse:

char dayStrings[][3] = { "So", "Mo", "Di", "Mi", "Do", "Fr", "Sa" };

Ich habe ein Arduino Uno und ein normales DS1307 RTC modul.

Die genaue Hardware könnte schon helfen (Link), denn mein DS1307-Modul zeigt dieses Verhalten nicht.
Zudem solltest Du uns einen Link zur von Dir verwendeten DS1307-Bibliothek angeben, denn davon gibt's mindestens ein Dutzend.
Dein Sketch funktioniert nämlich vielleicht nicht so, wie Du Dir das vorstellst:

  if (! RTC.isrunning()) {
    
    // Aktuelles Datum und Zeit setzen, falls die Uhr noch nicht läuft
    RTC.adjust(DateTime(__DATE__, __TIME__));
    
    Serial.println("Echtzeituhr wurde gestartet und auf Systemzeit gesetzt.");
  }

Bei vielen Bibliotheken liefert isrunning() gleich nach dem begin() kein verlässliches Resultat. Zudem sagt es im Normalfall nicht das, was der Sketch daraus interpretiert.
Der Kommentar stimmt auch nicht, denn die RTC wird nicht auf Systemzeit gesetzt, sondern auf Kompilierzeit, was nach einem Tag ein deutlicher Unterschied ist.
Ich habe jeweils f√ľr das Stellen des RTC einen separaten Sketch, im Hauptsketch wird die RTC nur abgefragt.

VIERcntHOLZ:
Ich habe ein Arduino Uno und ein normales DS1307 RTC modul.

Normal ist immer relativ.

if (! RTC.isrunning()) {

// Aktuelles Datum und Zeit setzen, falls die Uhr noch nicht läuft
RTC.adjust(DateTime(DATE, TIME));
...

Wenn Du so einen schrottigen Code aus einem Demoprogramm verwendest, der mit dieser merkw√ľrdigen Funktion "RTC.isrunning()" pr√ľfen m√∂chte, ob die Uhr funktioniert und l√§uft und die dann ggf. gnadenlos erstmal eine falsche Zeit in der RTC setzt, wenn diese Funktion d√§mlicherweise ermittelt, dass die Uhr wohl nicht l√§uft, gibst Du der Uhr vielleicht eine kurze Besinnungszeit per "delay(100)" nach dem Aktivieren der Wire-Library, bevor Du die Funktion "isRunning" drauflosl√§sst.

Also:

  // Initialisiere I2C  
  Wire.begin();
  delay(100);
  // Initialisiere RTC
  RTC.begin();

Vielleicht hilft's!

Ich pers√∂nlich w√ľrde es nicht so machen, die Zeit "automatisch" beim Hochladen eines Sketches stellen zu wollen, sondern eher eine Stellm√∂glichkeit der Uhr √ľber die serielle Schnittstelle im Betrieb vorsehen.

Im √ľbrigen mu√üt Du beim Wechseln der Knopfzelle an Deinem mehr oder weniger "normalen" RTC-Modul aufpassen. Das "normale" TinyRTC Modul hat in der Schaltung zum Beispiel keine Batterie (CR2032) sondern einen Akku, Type LIR2032. Den Akku darfst Du in dem Fall nat√ľrlich nicht gegen eine Batterie austauschen.

Ich habe mir dieses Hier bestellt :slight_smile:

Aber mit meinem Code bekomm ich das ja eigentlich hin, die Uhrzeit einzuprogrammieren... bei unterbrochener Stromzufuhr scheint Sie sie nur zu "vergessen" :frowning: SOlang die Unterbrechung scheinbar Lang genug ist..

Das mit dem Akku habe ich ber√ľcksichtigt, jedoch war das Problem vorher auch schon das selbe :confused: desswegen tauschte ich ja erst die Batterie

Habt ihr sonst einen anderen code mit dem ich meine Uhr mal stellen kann?

Jurs hatte da mal nen Code gepostet, der das fein erledigt, √ľber die serielle Schnittstelle (man kann ihn auch entsprechend umbauen, dass die Uhr auf andere Weise gestellt werden kann).

Musst du mal die Forensuche bem√ľhen (notfalls hab ich den da, aber das wird dann erst nachmittags, weil ich gleich weg muss).
Was dein Problem angeht, so ganz kann ich nicht folgen.
Meine Uhr zeigt folgendes Verhalten:
Sie läuft wochen und monatelang blitzesauber mit sehr wenig Abweichung (wenige Sekunden im Monat), wenn sie denn ununterbrochen Strom bekommt. Zihe ich allerdings den Stecker, kann es passieren (es kommt echt nur manchmal vor), dass sie stehen bleibt. In dem Falle geht sie zehn Minuten nach, wenn der Arduino zehn Minuten stromlos war. Stecke ich sie wieder an, läuft sie problemlos weiter, hinkt aber genau die Zeit nach, die sie aus war.
Das passiert jedoch nur _manchmal. In den meisten Fällen läuft sie ohne Strom (halt aus der Pufferbatterie) problemlos weiter.
Hast du auch dieses Verhalten?

Das mit dem Akku habe ich ber√ľcksichtigt, jedoch war das Problem vorher auch schon das selbe :confused: desswegen tauschte ich ja erst die Batterie

Das Teil braucht ein LIR2032 Akku, eine CR2032-Knopfzelle ist nicht geeignet. Die Knopfzelle wird sehr langsam geladen, d.h. Du musst den RTC zuerst f√ľr eine Woche oder so am Strom haben, bevor er l√§nger durchh√§lt. Die Schaltung ist nicht sehr gut gemacht, der Spannungsteiler verbraucht mehr als das 5-fache dessen, was der DS1307 ben√∂tigt. Zudem ist die "Lade-Schaltung" (wenn man die wirklich so nennen will) gef√§hrlich, der Akku ist auf Li-Ionen-Basis und sollte somit mehrphasig geladen werden, was hier nicht stattfindet.
Ich w√ľrde Dir empfehlen, D1, R4 und R5 herauszul√∂ten, R6 zu √ľberbr√ľcken und anstatt des LIR2032 eine CR2032-Knopfzelle zu nehmen. Alternative w√§re, ein simples DS1307-Modul zu nehmen, wenn Du die restlichen Komponenten (DS18B20 und AT24C32) nicht brauchst.