RTC DS1307 --- Wir leben im Jahr 2165

Hallo zusammen,

ich tüfftel gerade an einer Ausgabe der Zeit mit einem Arduino und einem RTC DS1307.
Prinzip habe ich denke ich verstanden, aber das Modul oder besser gesagt beide Module di eich habe geben komische Dinge aus.
Ich habe auch schon Google gefragt und hier im Forum geschaut, auch etwas gefunden aber irgendwie für mich keine Lösung entdeckt!

Von links nach rechts gesehen:
GND, 5V, SDA an A4, SCL an A5

So schaut das aus:


mit folgendem Sketch

// Tiny RTC (DS1307)

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

RTC_DS1307 RTC;      // RTC Modul

void setup(void) {

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

  // Serielle Ausgabe starten 
  Serial.begin(9600);

  // Begrüßungstext auf seriellem Monitor ausgeben
  Serial.println("Starte Datum und Zeit - blog.simtronyx.de");

  // Pruefen ob RTC laeuft  
  if (! RTC.isrunning()) {
    
    // Aktuelles Datum und Zeit setzen, falls die Uhr noch nicht laeuft
    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(30000); // 30 Sekunden warten bis zur naechsten 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);
}

Hat jemand Erfahrung mit dieser Sache?

Danke im Voraus und Gruß
André

PanTau78: Hat jemand Erfahrung mit dieser Sache?

Wahrscheinlich ziemlich viele, die - minderwertige TinyRTC-Module kaufen - diese Module nicht richtig betreiben und - diese Module nicht richtig per Software ansteuern

Versuchs's als erstes mal mit:

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

Macht es mit "delay(100)" zwischendrin einen Unterschied?

Die "165" sind dadurch verursacht, dass Du beim Auslesen weder prüfst, ob die Uhr überhaupt funktionierst und dann noch die BCD-Umwandlung aus ungültigen BCD-Ziffern machst: Aus den mit Bits voll gefüllten Bytes rechnest Du einen Stunden- oder Minutenwert aus zu "15*10+15". Das ist natürlich keine gültige zweistellige Dezimalzahl. Unter anderem deshalb, weil auch die Zahl vor der Umwandlung keine zweistellig gepackte BCD-Zahl war.

Du nimmst also eine schrottige und ungültige BCD-Zahl, die Du vermeintlich aus der Uhr ausgelesen hast (was nicht der Fall ist), und wandelst diese ungültige Zahl in eine eben so schrottige "165" Dezimalzahl um. Das was Du da machst, nennt sich in der Informationsverarbeitung das GIGO-Prinzip und es ist dasselbe Prinzip wie es bei einer Mülltonne zu Anwendung kommt:

GIGO ==> Garbage in, garbage out

Danke für die Antwort.

Soll bedeuten ich habe mist gekauft? Woran und vor allem wann weiß ich denn das ein solches Modul nicht mehr minderwertig ist ?

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

Hat nicht funktioniert.

Was genau willst Du mir mit dem Mülltonnenprinzip mitteilen?

  • diese Module nicht richtig betreiben und (deswegen wende ich mich ja an Erfahrene)
  • diese Module nicht richtig per Software ansteuern (siehe oben)

Gruß
André

PanTau78:
Soll bedeuten ich habe mist gekauft?

Kann man so nicht sagen.
Nicht alles, was minderwertig ist, ist deshalb gleich Mist.

PanTau78:
Woran und vor allem wann weiß ich denn das ein solches Modul nicht mehr minderwertig ist ?

Falsche Frage. Umgekehrt wird ein Schuh draus: Kann ich an manchen Modulen erkennen, dass es sich um ein minderwertiges DS1307 Modul handelt?

Antwort: Wenn die Platine mit “Tiny RTC” beschriftet ist, handelt es sich um ein minderwertiges Modul.

Die Kondensatoren in dieser Schaltung passen üblicherweise nicht zum Uhrenquarz, so dass diese Uhrenmodule meistens eine viel größere Gangabweichung aufweisen als es notwendig wäre, und die Ladeschaltung für den LIR-Akku auf der Platine ist auch etwas wackelig ausgelegt, so dass die Akkus manchmal überladen werden, was dann zum Fehlstart der I2C-Kommunikation führt.

Wenn die 100ms delay nicht ausreichen, lasse mal diesen Sketch zum Testen durchlaufen:

#include <Wire.h>
 
void setup() {
  Serial.begin(9600);
  Wire.begin();
  while(1)
  {
    Wire.beginTransmission(0x68);
    byte error = Wire.endTransmission();
    if (error)
    {
      Serial.println(F("RTC ERROR"));
      delay(250);
    }
    else break;
  }
  Serial.println(F("RTC ready"));
}

void loop() {}

Zeigt Dir dieser Sketch nach einer Weile (Zeit circa?) die Meldung “RTC ready” an, oder läuft ständig nur “RTC ERROR” durch?

Länger als ca. 1 Minute (mit ggf. zwischendurch mal Wackeln an den Drähten) brauchst Du nicht zu warten, wenn das nicht funktioniert, liegt ein anderer Fehler vor als die minderwertige Schaltung des Moduls oder ein Wackelkontakt bei Deinem fliegenden Aufbau.

PanTau78:
Was genau willst Du mir mit dem Mülltonnenprinzip mitteilen?

Das Mülltonnenprinzip bedeutet: Wenn Du Müll vom Uhrenmodul geliefert bekommst und keine vernünftige Fehlerbehandlung machst, sondern den Müll ohne Fehlerbehandlung zum Beispiel an den seriellen Monitor weiterleitest, dann kommt auch am seriellen Monitor Müll an.

Wenn Du eine vernünftige Fehlermeldung zu sehen bekommen möchtest, wenn ein Fehler auftritt, mußt Du auch eine vernünftige Fehlerbehandlung machen, sonst wird das nichts mit einer vernünftigen Fehlermeldung.

Wahnsinn, ich weiß gar nicht wie ich Dir für deine Mühen danken soll !!!

Ok, dann habe ich also Müll gekauft ;) Was ist den z.B. mit diesem Modul hier? https://www.sparkfun.com/products/12708

Der Sketch wirft lediglich PTC ERROR aus :(

Ok, wie schon einmal geschrieben, bin ich noch neu in der Arduinowelt und kenne mich noch nicht so gut aus. Es macht natürlich Sinn eine Fehlererkennung mit in den Code einzubauen und diesen dann im serial auszugeben, aber da fehlt mir einfach die Erfahrung zu!

Also sollte ich mir ein vernünftiges Modul zulegen?

Danke und Gruß André

Wenn du eine vernünftige RTC willst, dann nimm gleiche eine DS3231:

http://www.ebay.de/itm/Tiny-DS3231-AT24C32-I2C-Module-Precision-Real-Time-Clock-Module-For-Arduino-/171420340260?pt=UK_BOI_Electrical_Components_Supplies_ET&hash=item27e972d024 http://www.ebay.de/itm/RTC-Modul-DS3231-inkl-AT24C32-Eeprom-Real-Time-Clock-I2C-fur-Arduino-AVR-uvm-/171507144989?pt=Wissenschaftliche_Ger%C3%A4te&hash=item27ee9f591d

PanTau78: Ok, dann habe ich also Müll gekauft ;)

Normalerweise laufen die Module. Wenn auch nicht besonders genau.

Und: Die Headerleisten hast Du Dir selbst angelötet.

Hast Du Dir mal mit einer stark vergrößernden Lupe die Lötstellen angesehen? Schlecht gelötet? Oder vielleicht sogar ein Kurzschluss zwischen zwei Kontakten?

PanTau78: Was ist den z.B. mit diesem Modul hier? https://www.sparkfun.com/products/12708

Das sieht mir vor allem erstmal extrem teuer aus.

Für den Preis gibt es ja in China schon mehrere Module der sehr viel genaueren DS3231.

PanTau78: Der Sketch wirft lediglich PTC ERROR aus :(

Hast Du ein Multimeter da, mit dem Du im 20V Gleichspannungsmessbereich messen kannst?

Und dann mal die Spannungen messen: - LIR-Akku aus dem Batteriehalter nehmen, Spannung des LIR-Akkus? - Akku wieder in die Halterung setzen, Schaltung in Betrieb nehmen - Spannung zwischen 5V und GND? - Spannung zwischen SDA und GND bei aufgespieltem RTC Test-Sketch? - Spannung zwischen SCL und GND bei aufgespieltem RTC Test-Sketch? - Spannung zwischen SDA und GND bei aufgespieltem Blink-Sketch? - Spannung zwischen SCL und GND bei aufgespieltem Blink-Sketch?

Ok, dann werde ich mal schauen das ich so ein DS3231 ran bekomme.

Lötstellen sind i.O. hatte ich gleich nach dem Löten nachgeschaut.
Kein Kurzschluss oder dergleichen.

Da ich zwei von den RTC DS1307 habe:

Akku 1 = 4,07 Volt
Akku 2 = 3,80 Volt

Spannung 1 zwischen 5V und GND? = 4,97 Volt
Spannung 2 zwischen 5V und GND? = 4,97 Volt

Spannung 1 zwischen SDA und GND bei aufgespieltem RTC Test-Sketch? = 4,97 Volt
Spannung 2 zwischen SDA und GND bei aufgespieltem RTC Test-Sketch? = 4,97 Volt

Spannung 1 zwischen SCL und GND bei aufgespieltem RTC Test-Sketch? = 4,94 Volt
Spannung 2 zwischen SCL und GND bei aufgespieltem RTC Test-Sketch? = 4,97 Volt

Spannung 1 zwischen SDA und GND bei aufgespieltem Blink-Sketch? = 4,97 Volt
Spannung 2 zwischen SDA und GND bei aufgespieltem Blink-Sketch? = 4,97 Volt

Spannung 1 zwischen SCL und GND bei aufgespieltem Blink-Sketch? = 4,97 Volt
Spannung 2 zwischen SCL und GND bei aufgespieltem Blink-Sketch? = 4,97 Volt

Ich hatte zwischen dem Wechseln der ersten Messung witziger weise einmal das richtige Datum angezeigt bekommen.
Denke es liegt an den Modulen.

Danke und Gruß

André

PanTau78: Da ich zwei von den RTC DS1307 habe:

Akku 1 = 4,07 Volt Akku 2 = 3,80 Volt

Ganz schön hoch für einen 3.6V LIR-Akku, besonders bei Deinem Akku-1!

Kannst Du mal den Akku-2 mit der niedrigeren Spannung in der Schaltung verwenden, und dabei an der in Betrieb befindlichen Schaltung auch die Spannung zwischen GND und BAT-Anschluss am Modul messen?

hi,

also das problem hatten wir jetzt doch schon oft hier im forum. übrigens auch ich mit meiner ersten DS1307. ist allerdings schon jahre her, und die suchfunktion hier geht ja noch nicht. ich glaube mich zu erinnern, daß es etwas mit der initialisierung zu tun hatte.

bin nicht sicher, aber ich glaube, mit der library DS1307new gings dann, und auch ohne RTC-library (nur mit wire.h, code im playground) lief es. mit der hardware hat das nichts zu tun.

wenn Du bei google "DS1307 165" eingibst, kommen viele, viele seiten.

gruß stefan

@Jurs

2,71 Volt im laufenden Betrieb.

@ Stefan

Dein Thema hatte ich hier im Forum gefunden und auch getestet, allerdings mit gleichem Ergebnis leider.

Danke und Gruß André

Hier habe ich doch noch den Beweis, dass es auch mit der RTC-library funktioniert. Habe allerdings nichts gemacht grins

PanTau78: @Jurs

2,71 Volt im laufenden Betrieb.

Hast Du mal den I2C-Scanner Sketch laufen lassen: http://playground.arduino.cc/Main/I2cScanner

Wie viele Geräte findet er auf Deiner RTC-Platine? Wenn er Geräte findet: An welchen Adressen?

Hast du überhaupt einen Akku (LIR 2032) oder eher eine CR2032 Batterie ?

Ich tippe mal: wenn die Spannung der Batterie unter 3.8V ist, läuft die Uhr.

@ jurs
Das Modul, was läuft (im Moment) spuckt das aus

und das Andere nichts bis auf Scanning…

@ michael_x
es ist ein Akku

PanTau78:
@ jurs

Das Modul was läuft (im Moment) spuckt das aus

und das Andere nichts bis auf Scanning…

Also wenn ich Dich richtig verstehe, dann hast Du jetzt:

  • ein Modul, das funktioniert
  • ein Modul, das nicht funktioniert
    Richtig?

Dann würde ich nun einmal:
Bei dem nicht funktionierenden Modul den Akku entnehmen, mindestens eine Minute warten, Akku wieder einsetzen und nochmal mit dem I2C-Scanner scannen. Ggf. zwei oder dreimal nacheinander, ob das Modul dann vielleicht noch startet.

Und ggf. die beiden Module mal auf der Bestückungsseite genau vergleichen: Ist auf beiden Modulen dieselbe Anzahl an Bauteilen vorhanden, oder fehlt auf dem nicht funktionierenden Modul vielleicht ein kleines Bauteil?

Also wenn ich Dich richtig verstehe, dann hast Du jetzt: - ein Modul, das funktioniert - ein Modul, das nicht funktioniert Richtig?

Das ist korrekt!

Bei dem nicht funktionierenden Modul den Akku entnehmen, mindestens eine Minute warten, Akku wieder einsetzen und nochmal mit dem I2C-Scanner scannen. Ggf. zwei oder dreimal nacheinander, ob das Modul dann vielleicht noch startet.

Leider ohne Erfolg!!!

Module sind identisch, keinerlei Unterschiede, weder Widerstände, Bauteile etc.

Danke und Gruß André

Moin, dass nicht funktionierende Modul musste wohl eine Nacht schlafen... Es funktioniert nun auch! Verstehe das wer will, ich jedenfalls nicht!

Danke für die tolle Hilfe :)

Gruß André

PanTau78: Moin, dass nicht funktionierende Modul musste wohl eine Nacht schlafen... Es funktioniert nun auch! Verstehe das wer will, ich jedenfalls nicht!

Modul müde, Modul schlafen ;)

BTT: Sorry, kenn mich mit den Modulen nicht aus, aber das konnte ich mir gerade nicht verkneifen ;)

LG

Fipsi

Akku 1 = 4,07 Volt
Akku 2 = 3,80 Volt

Der DS1307 macht die Umschaltung zwischen Batterie und Versorgungsspannung durch den Wert der Batterie. wenn Die Batteriespannung außerhalb der Spezifikation ist dan macht er komische Sachen.

aus http://datasheets.maximintegrated.com/en/ds/DS1307.pdf
VBAT Battery Voltage V BAT min: 2.0V , typ: 3V; max: 3.5V
und die Schaltschwelle ab der von der Versorgungsspannung auf Batteriespannung umgeschaltet wird:
Power - Fail Voltage (VBAT = 3.0V) min: VPF: min: 1.216 x VBAT, typ:1.25 xVBAT, max: 1.284 x VBAT

Wenn die Batteriespannung zu hoch ist dann schaltet der Ds1307 nicht auf Batteriebetrieb um. Die Batteriespannung bei 4,97V Versorgungsspannung darf max ca 3,8V sein.

Ich habe jetzt nicht verstanden wieso Du eine so hohe Batteriespannung hast. Ist der Akku überladen? Du könntest die Ladeschaltung auf dem Modul entfernen und mit einer CR2025 betreiben.

Grüße Uwe