Go Down

Topic: RTC DS1307 --- Wir leben im Jahr 2165 (Read 8667 times) previous topic - next topic

PanTau78

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

Code: [Select]

// 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é

jurs

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:
Code: [Select]

  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




PanTau78

#2
Oct 24, 2014, 05:32 pm Last Edit: Oct 24, 2014, 05:34 pm by PanTau78
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 ?

Code: [Select]
  // 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é

jurs

Soll bedeuten ich habe mist gekauft?
Kann man so nicht sagen.
Nicht alles, was minderwertig ist, ist deshalb gleich Mist.

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:

Code: [Select]

#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.

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.

PanTau78

#4
Oct 24, 2014, 06:18 pm Last Edit: Oct 24, 2014, 06:26 pm by PanTau78
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é

Serenifly

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

jurs

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?


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.


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?


PanTau78

#7
Oct 24, 2014, 07:17 pm Last Edit: Oct 24, 2014, 07:22 pm by PanTau78
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é

jurs

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?

Eisebaer

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

PanTau78

#10
Oct 24, 2014, 07:54 pm Last Edit: Oct 24, 2014, 11:34 pm by PanTau78
@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é

PanTau78

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


jurs

@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?

michael_x

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.

PanTau78

#14
Oct 24, 2014, 11:25 pm Last Edit: Oct 24, 2014, 11:41 pm by PanTau78
@ jurs
Das Modul, was läuft (im Moment) spuckt das aus


und das Andere nichts bis auf Scanning...

@ michael_x
es ist ein Akku

Go Up