RTC3231 Aufbau

Die Uhrzeit des RTC DS3231 Modul vom Arduino auslesen

Das Uhrzeitmodul RTC DS3231 (Real Time Clock ZS-042) ist eine genaue Uhr mit eingebauten Quarz. Dieser Quarz wird intern Temperatur überwacht und korrigiert sodass sie einen Fehler von nur +-2ppm hat, was ca. 1 Minute pro Jahr entspricht.

Ich habe das RTC3231 mit 4 Leitungen an den Arduino Uno angeschlossen.

3,3V > VCC
GND > GND
A5 > SCL
A4 > SDA rtc3231-aufbau-1000

Die Uhrzeit und das Datum sollen auf der Konsole ausgegeben werden. Hier das Programm.

// Die Uhrzeit auslesen von der Uhr RTC3231
// Die Uhr ist sehr genau mit einem Temperatur kompensierten Takt
// Der Fehler beträgt +-2ppm bei 0-40°C oder max ca. 1 Minute pro Jahr
//
// Matthias Busse 6.11.2016 Version 1.0

#include "Wire.h"
#define DS3231_ADDRESSE 0x68

void setup() {
  Wire.begin();
  Serial.begin(38400);
}

void loop() {
  zeigeZeit(); // Zeit ausgeben
  delay(1000); // jede Sekunde
}

void leseDS3231zeit(byte *sekunde, byte *minute,byte *stunde, byte *wochentag, byte *tag, byte *monat, byte *jahr) {
  Wire.beginTransmission(DS3231_ADDRESSE);
  Wire.write(0); // DS3231 Register zu 00h
  Wire.endTransmission();
  Wire.requestFrom(DS3231_ADDRESSE, 7); // 7 Byte Daten vom DS3231 holen
  *sekunde = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *stunde = bcdToDec(Wire.read() & 0x3f);
  *wochentag = bcdToDec(Wire.read());
  *tag = bcdToDec(Wire.read());
  *monat = bcdToDec(Wire.read());
  *jahr = bcdToDec(Wire.read());
}

void zeigeZeit(){
byte sekunde, minute, stunde, wochentag, tag, monat, jahr;
  leseDS3231zeit(&sekunde, &minute, &stunde, &wochentag, &tag, &monat, &jahr);   // Daten vom DS3231 holen
  if (tag < 10) { Serial.print("0");} 
  Serial.print(tag); // ausgeben T.M.J H:M:S
  Serial.print(":");
  if (monat < 10) { Serial.print("0");}
  Serial.print(monat);
  Serial.print(":20");
  Serial.print(jahr);
  Serial.print(" ");
  if (stunde < 10) { Serial.print("0");}
  Serial.print(stunde, DEC); // byte in Dezimal zur Ausgabe
  Serial.print(":");
  if (minute < 10) { Serial.print("0");}
  Serial.print(minute, DEC);
  Serial.print(":");
  if (sekunde < 10) { Serial.print("0"); }
  Serial.println(sekunde, DEC);
}

byte decToBcd(byte val) {
// Dezimal Zahl zu binary coded decimal (BCD) umwandeln
  return((val/10*16) + (val%10));
}

byte bcdToDec(byte val) {
// BCD (binary coded decimal) in Dezimal Zahl umwandeln
  return((val/16*10) + (val%16));
}

Und hier die Ausgabe

RTC3231 Ausgabe

Verwendet wurden:
Arduino Uno
DS3231 Board, ZS-042 von ebay
Arduino 1.6.5

von Matthias Busse

Weitere Beiträge zum DS3231:
Den Arduino Quarztakt auf 3ppm genau bestimmen mit der DS3231 RTC
Von der RTC DS3231 die Temperatur auslesen mit dem Arduino
Rechteck 1Hz (+-2ppm) ausgeben mit dem RTC DS3231 und dem Arduino
Die Uhrzeit des RTC DS3231 Modul vom Arduino einstellen

12 Gedanken zu „Die Uhrzeit des RTC DS3231 Modul vom Arduino auslesen

    1. Günter Müller

      hallo.
      Leider funktioniert meine Uhr überhaupt nicht.
      Ich habe einen Nano. mit diesem möchte ich für meine Modeleisenbahn eine echte Bahnhofsuhr realisieren. Dazu sollte ein 0,96″ Oled Display und ein Uhrenmodul Tiny DS3231 in Einsatz kommen.
      Das einzige , was funktioniert ist das Oled Display mit einer Beispiel Bibliothek.
      Vielleicht kann mir geholfen werden.

      Antworten
  1. Pingback: Die Uhrzeit des RTC3231 Modul vom Arduino einstellen | Shelvin – Elektronik ausprobiert und erläutert

  2. Pingback: Rechteck 1Hz (+-2ppm) ausgeben mit dem RTC DS3231 und dem Arduino | Shelvin – Elektronik ausprobiert und erläutert

  3. Pingback: Von der RTC DS3231 die Temperatur auslesen mit dem Arduino | Shelvin – Elektronik ausprobiert und erläutert

  4. Pingback: Den Arduino Quarztakt auf 3ppm genau bestimmen mit der DS3231 RTC | Shelvin – Elektronik ausprobiert und erläutert

  5. Frank

    Hallo, ich habe mit dem schreiben von den Alarmregistern alles mögliche getestet, und ich bekommen einfach nicht hin ohne lib Datei Weckzeiten in das Modul ds3231 zu schreiben und auszulesen. Hättest Du vielleicht einen Ansatz oder ein Beispie? Gruß Frank

    Antworten
  6. Christian Geissler

    Hallo Matthias,

    ich finde das Tutorail hier sehr gut erklärt. Aber ich musste bei mir eine andere Baudrate einstellen (9600).

    Grüße

    Christian

    Antworten
  7. Friedhelm Mertke

    Hallo Herr Matthias Busse,
    ich möchte noch den Wochentag angezeigt bekommen.
    Als Zahl habe ich geschafft. Als Montag nur mit dayofWeek.

    ich bastele schon lange an elektrischen Schaltungen. Vor einem Jahr habe ich mit Arduino angefangen. Einfache Sketche haben gut funktioniert. Mit der Aufgabe mehrere Zeiten zu schalten habe ich mich wohl zu viel vorgenommen.
    Können Sie mir etwas helfen? Ich habe einen Sketch von Ihnen als Vorlage genommen vom 6.11.2016 Version 1.0 ( DS3231 auslesen und benutzen ) Auf den seriellen Monitor läuft auch alles. Die Zeit möchte ich aber auch auf einem 20×4 Display mit I2C anzeigen.
    Dafür habe ich einen anderen Sketch der funktioniert. Beide Sketche zu einem machen funktioniert aber seit Wochen einfach nicht.

    Ich möchte für meine Bewässerung im Garten mindestens 16 Ausgänge schalten. (funktioniert seriell ) mit 2 Zeiten am Tag. Für einen Tag auslassen habe ich auch noch keine softe Idee.
    Ich würde die galvanisch getrennten Relay Module abschalten.

    Meine verwendeten Teile:
    Arduino Mega 2560 oder etwas kleiner Arduino UNO
    Display 20×4 über I2C angeschlossen
    DS3231
    4x Relay Module 4fach mit Optokoppler
    Software Arduino 1.8.6
    meine 2 Sketche würde ich Ihnen gerne mal zum Anschauen schicken

    Antworten
  8. Thomas

    Hallo,

    danke für das Tutorial.
    Ich hab hier nur ein kleines Problem mit der Ausgabe des Datums.
    Anstatt des 09.04.2020 wird der 09:84:2020 ausgegeben.
    Ich hab’s mit dem originalen Sketch von dir versucht.

    Schöne Grüße

    Thomas

    Antworten
  9. Simon

    Hallo
    Ich konnte die Zeit am RTC Modul bereits einstellen und der Arduino Uno liesst diese auch gut aus. Ich möchte jetzt aber, das er um 18:00 eine Led anmacht und am 18:30 wieder aus. Um 19:00 ein Servo auf 20 Grad stellen u.s.w.
    Jetzt ist die Frage, da ich mich noch nicht so gut auskenne, ob es dafür auch ein Command gibt. Vielleicht wie:
    If RTC (18.00)
    digitalWrite (13, HIGH);
    Können sie mir dabei helfen ?

    Lg Simon

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.