Problem mit DS3231 AT24C32 IIC Precision RTC Real Time Clock

Hallo liebe Forumsgemeinde,
ich habe mir oben genanntes RTC Modul schicken lassen. Gestern abend auf dem Steckbrett vom Arduino Uno R3 versorgt:

ARDUINO RTC
GND GND
5V VC
SDA SDA
SCL SCL

dann folgenden Sketch eingespielt:

/*----------------------------------------------------------------------*
   Display the date and time from a DS3231 or DS3232 RTC every second.
   Display the temperature once per minute. (The DS3231 does a
   temperature conversion once every 64 seconds. This is also the
   default for the DS3232.)
 *                                                                      *
   Set the date and time by entering the following on the Arduino
   serial monitor:
      year,month,day,hour,minute,second,
 *                                                                      *
   Where
      year can be two or four digits,
      month is 1-12,
      day is 1-31,
      hour is 0-23, and
      minute and second are 0-59.
 *                                                                      *
   Entering the final comma delimiter (after "second") will avoid a
   one-second timeout and will allow the RTC to be set more accurately.
 *                                                                      *
   No validity checking is done, invalid values or incomplete syntax
   in the input will result in an incorrect RTC setting.
 *                                                                      *
   Jack Christensen 08Aug2013
 *                                                                      *
   Tested with Arduino 1.0.5, Arduino Uno, DS3231/Chronodot, DS3232.
 *                                                                      *
   This work is licensed under the Creative Commons Attribution-
   ShareAlike 3.0 Unported License. To view a copy of this license,
   visit http://creativecommons.org/licenses/by-sa/3.0/ or send a
   letter to Creative Commons, 171 Second Street, Suite 300,
   San Francisco, California, 94105, USA.
  ----------------------------------------------------------------------*/

#include <DS3232RTC.h>        //http://github.com/JChristensen/DS3232RTC
#include <Streaming.h>        //http://arduiniana.org/libraries/streaming/
#include <Time.h>             //http://playground.arduino.cc/Code/Time
#include <Wire.h>             //http://arduino.cc/en/Reference/Wire

void setup(void)
{
  Serial.begin(9600);

  //setSyncProvider() causes the Time library to synchronize with the
  //external RTC by calling RTC.get() every five minutes by default.
  setSyncProvider(RTC.get);
  Serial << F("RTC Sync");
  if (timeStatus() != timeSet) Serial << F(" FAIL!");
  Serial << endl;
}

void loop(void)
{
  static time_t tLast;
  time_t t;
  tmElements_t tm;

  //check for input to set the RTC, minimum length is 12, i.e. yy,m,d,h,m,s
  if (Serial.available() >= 12) {
    //note that the tmElements_t Year member is an offset from 1970,
    //but the RTC wants the last two digits of the calendar year.
    //use the convenience macros from Time.h to do the conversions.
    int y = Serial.parseInt();
    if (y >= 100 && y < 1000)
      Serial << F("Error: Year must be two digits or four digits!") << endl;
    else {
      if (y >= 1000)
        tm.Year = CalendarYrToTm(y);
      else    //(y < 100)
        tm.Year = y2kYearToTm(y);
      tm.Month = Serial.parseInt();
      tm.Day = Serial.parseInt();
      tm.Hour = Serial.parseInt();
      tm.Minute = Serial.parseInt();
      tm.Second = Serial.parseInt();
      t = makeTime(tm);
      RTC.set(t);        //use the time_t value to ensure correct weekday is set
      setTime(t);
      Serial << F("RTC set to: ");
      printDateTime(t);
      Serial << endl;
      //dump any extraneous input
      while (Serial.available() > 0) Serial.read();
    }
  }

  t = now();
  if (t != tLast) {
    tLast = t;
    printDateTime(t);
    if (second(t) == 0) {
      float c = RTC.temperature() / 4.;
      float f = c * 9. / 5. + 32.;
      Serial << F("  ") << c << F(" C  ") << f << F(" F");
    }
    Serial << endl;
  }
}

//print date and time to Serial
void printDateTime(time_t t)
{
  printDate(t);
  Serial << ' ';
  printTime(t);
}

//print time to Serial
void printTime(time_t t)
{
  printI00(hour(t), ':');
  printI00(minute(t), ':');
  printI00(second(t), ' ');
}

//print date to Serial
void printDate(time_t t)
{
  printI00(day(t), 0);
  Serial << monthShortStr(month(t)) << _DEC(year(t));
}

//Print an integer in "00" format (with leading zero),
//followed by a delimiter character to Serial.
//Input value assumed to be between 0 and 99.
void printI00(int val, char delim)
{
  if (val < 10) Serial << '0';
  Serial << _DEC(val);
  if (delim > 0) Serial << delim;
  return;
}

Über Serial Datum und Uhr gestellt (nach Atomzeit)und seitdem läuft das Ding.
Allerdings habe ich jetzt das Phänomen, das nach ca. 14 Stunden mein RTC um 1,5 Sekunden hinten nachhängt.
Das nenne ich nicht präzise, hat jemand eine Idee bzw. ähnlich Erfahrungen?

Danke, Claus

Laut Datenblatt ~~https://datasheets.maximintegrated.com/en/ds/DS3232.pdf~~ http://datasheets.maximintegrated.com/en/ds/DS3231.pdf ist der Fehler +/- 2 ppm.
Das währen in 14 Stunden (50400 Sekunden) ca 40mS.

Falls Dein Zeitvergleich richtig ist, fällt mir als Fehlerquelle nur eines ein: Ausschuß. Wegen Ungenauigkeit aussortierte Teile die anstatt resyceld zu werden auf verschlungenen Wegen es auf eine Platine geschafft haben.

Grüße Uwe
[EDIT]hatte falsches Datenblatt angegeben[/EDIT]

also ich denke mein Zeitvergleich ist soweit in Ordnung,

lg, Claus

Ich vermute, wie Uwe geschrieben, die hat eine schlechte Qualität.

Ich habe hier aktuell 3 (alle länger als 3 Monate) von denen laufen, die alle weniger als eine Sek. falsch gehen.

Hi Hotsystems,

ich habe befürchtet, dass ich so eine Antwort bekomme :wink:

mit Steckverbindung über Breadboard und Wires kann es ja wohl nicht zusammenhängen, nehme ich jetzt mal an...

Werde sie auf jeden Fall noch eine Weile laufen lassen.

Im Grunde ist mir die sekunden-genaue Anzeige (in diesem konkreten Projekt) nicht ganz so wichtig, ich möchte eigentlich nur 2 mal in 24 Stunden (gegen Mittag und einmal in der Nacht) eine Aktion starten (Messungen durchführen). Ob dies nun genau um 12:00 Uhr oder um 12:00:05 sek und um 00:00:05 statt 00:00:00 stattfindet spielt in dem konkreten Fall keine Rolle.

Kann ich sw-seitig die Uhr einmal in der Woch um x sek. nach vorne stellen? Gibt es da Beispiele?

Danke
Claus

Also an den Verbindungen kann es nicht liegen.
Das wird schon der Chip selber sein.

Das Nachstellen der Uhr kannst du so machen. Dazu musst du die aktuelle Zeit auslesen, 2 Sek. draufrechnen und wieder zurückschieben.

Beispiel habe ich leider aktuell nicht zur Hand, wird es aber im Netz genügend geben, evtl. auch hier im Forum.

Allerdings bei diesen Preisen solltest du dir gleich eine weitere besorgen, aber bei einem anderen Händler.

Wichtiger Hinweis:
Wenn eine Batterie eingebaut ist, darfst du die nicht laden, dann muss der Widerstand raus.

http://arduino-hannover.de/tag/ds3231/

HotSystems:
Wichtiger Hinweis:
Wenn eine Batterie eingebaut ist, darfst du die nicht laden, dann muss der Widerstand raus.

http://arduino-hannover.de/tag/ds3231/

Hi Hotsystems,
Danke für den Hinweis. Ergo werde ich mir eine wiederaufladbare LIR2032 besorgen. Dann muss nicht an die Platine :slight_smile: Echt cool, dass Du daran gleich gedacht hast. Werde mir sicher noch einige RTCs ordern....

lg, Claus

Der DS3231 hat ein Trimm-Register für Alterungserscheinungen. Vielleicht kann man da die Genauigkeit erhöhen.

Bei meinen DS3231-Modulen war die aufladbare Knopfzelle dabei.

Ich habe das mal mit einer DS1307 getestet. Die ging 1,5s am Tag zu langsam. Schau mal, ob du nicht die falsche bekommen hast.

Theseus:
Bei meinen DS3231-Modulen war die aufladbare Knopfzelle dabei.

Das ist von Händler zu Händler unterschiedlich, manche liefern nichts mit.
Und die Beschreibung stimmt leider auch nicht immer.

So, also es ist die DS3231 mit den rausgeführten Pins, keine Batterie dabei. Werde halt einmal pro Tag die Uhr um 2 sek vorstellen, "Live" muss das Projekt ja erst im Frühjahr gehen, bis dahin kann ich noch schauen, ob ich mit anderen Modulen mehr Glück habe :slight_smile:

Auf jeden Fall vielen Dank für Eure Unterstützung... bin jedesmal aufs Neue angetan wie schnell man hier Antworten bekommt - soferne man die richtigen Fragen stellt :smiley:

Claus

Claus_M:
Über Serial Datum und Uhr gestellt (nach Atomzeit)und seitdem läuft das Ding.

Dein www.atomzeit.eu ist ein mir unbekannter Internetserver, der offenbar eine mehr oder weniger genaue Zeit gegen den Abruf von Werbe-Spam auf der Seite verteilt.

Wenn der Dienst seine Zeit selbst nur auf +/- 1s genau von einem offiziellen Zeitserver bezieht und diese dann auf einem normalen Webserver mit einer Genauigkeit von +/- 1s zwischen den Aktualisierungsintervallen weiterschreibt, und Du die Zeit dann per HTTP im einem Webbrowser mit einer Genauigkeit von +/- 1s abrufst, dann addieren sich die Ungenauigkeiten zu einem beliebigen Zeitpunkt bereits auf 3 Sekunden.

Das kann gar nicht präzise sein. Also jedenfalls nicht genauer als +/-3s.

Wenn Du auf diese Art die Ganggenauigkeit einer DS3131 (64 Sekunden pro Jahr) prüfen willst, dann müßtest DU schon über einen deutlich längeren Zeitraum testen, also auch z.B. nach einer Woche, zwei Wochen, drei Wochen etc. mal nachsehen, wie dann die Zeitdifferenz ist.

Wenn Du die Genauigkeit einer DS3231 (die die Zeit selbst ja intern nur mit 1s Auflösung abrufbar hat) in kürzeren Zeiträumen prüfen möchtest, und dabei soll der Mikrocontroller abgeschaltet werden und die Uhr batteriegepuffert weiterlaufen, und nach ein paar Stunden möchtest Du wieder vergleichen, dann würde es sich anbieten, die Zeit zum Zeitvergleich von einem hochgenauen NTP Zeitserver abzurufen, z.B. wenn Du in Deutschland bist, von einem Zeitserver der PTB. Dazu würdest Du dann ein Ethernet-Shield für Deinen Arduino benötigen.

Hi Jurs,
okay... danke für die Info. habe mir jetzt mal einen Österreichischen Server gesucht...at.pool.ntp.org.. meine RTC nochmal aktualisiert, und im Windows auch den Server eingetragen. lasse sie jetzt mal wieder laufen....
Berichte wieder..

lg, Claus

Claus_M:
Hi Jurs,
okay... danke für die Info. habe mir jetzt mal einen Österreichischen Server gesucht...at.pool.ntp.org.. meine RTC nochmal aktualisiert, und im Windows auch den Server eingetragen. lasse sie jetzt mal wieder laufen....
Berichte wieder..

Windows in Standardkonfiguration aktualisiert seine Zeit meines Wissens nach ein- oder mehrmals pro Tag von einem NTP-Server in den USA (time.windows.com oder time.nist.gov beispielsweise), falls eine Internetverbindung besteht. Bei laufendem PC über den Tag läppert sich die Ungenauigkeit dann auch bei der Windows-Uhr ggf. auf 5 bis 10 Sekunden Ungenauigkeit, bis dann bei der nächsten NTP-Aktualisierung beim Hochfahren nach spätestens 24 Stunden die Ungenauigkeit von Windows wieder ausgebügelt wird. Mit Admin-Rechten kann der Zeitservice auf Windows auch umkonfiguriert werden, z.B. auf die Zeitserver der PTB und auch ggf. häufigere Aktualisierungen als einmal pro Tag, wenn bei der Windows-Uhr zwischenzeitlich nicht mehrere Sekunden Zeitdifferenz zur "amtlichen" Zeit auflaufen sollen.

Also im Windows 10 kannst du den Server ganz einfach ändern, es wird einmal pro Woche standardmäßig synchronisiert, man kann es auch manuell triggern... eine häufigere Synchronisation ist über die GUI nicht möglich, da muss man wohl in die Registry.... aber das ist jetzt ein bisschen OT, wenn auch interessant :wink:
lg, Claus

Hallo,

kann man nicht erst ab Win10. Ab Win10 ist das nur etwas schwieriger zu finden. :slight_smile:

http://www.zeitserver.de/deutschland/ptb-zeitserver-in-braunschweig/

Du kannst auch ein GPS Modul als Zeitnormal missbrauchen :sunglasses:
Damit GPS überhaupt funktioniert wird ein Heidenaufwand getrieben mit Atomuhren die Zeit entsprechend präzise zu ermitteln. Dieses Zeitsignal wird mit dem zivilen Datenstrom mit übertragen. Es gibt dafür auch schon fertigen Code. :wink: