Arduino Lektion 17: RealTimeClock RTC DS3231

Mit dem Modul RTC DS3231 ist es möglich einen Datum / Uhrzeit Wert zu speichern bzw. auszugeben ohne das dieser mit dem Computer verbunden ist. Und sollte der Microcontroller einmal ausgefallen oder abgeschaltet worden sein so läuft dieses Modul durch die mitgelieferte Batterie zuverlässig weiter.

RTC DS3231 Modul
RTC DS3231 Modul

Bezug

Das Modul „RealTimeClock DS3231 kann zbsp. über eBay.de für ca. 1,10€ erworben werden.

Technische Daten der RTC DS3231

  • Betriebsspannung – 3,3V bis 5.5V
  • Gewicht – 8g

Der Schaltplan

Das Modul verfügt über 6 PIN’s welche wiefolgt am Arduino Nano angeschlossen werden:

  • 32K – ohne Belegung
  • SQW – ohne Belegung
  • SCL – analog PIN A5
  • SDA – analog PIN A4
  • VCC – 5V
  • GND – GND

In folgender Zeichnung ist ein Arduino Mega 2560 angebildet, dieser verfügt über die PIN’s SDA & SCL und somit kann man statt an die analogen PIN’s auch an diese anschließen.
Jedoch gibt es Microcontroller welche diese PIN’s nicht haben
(zbsp. Arduino Nano, Arduino Micro).

RealTimeClock DS3231 am Arduino Nano
RealTimeClock DS3231 am Arduino Nano

 

Arduino Nano mit RTC DS3231 Modul
Arduino Nano mit RTC DS3231 Modul

Der Quellcode

Für den Betrieb des RTC DS3231 Moduls werden verschiedene Bibliotheken angeboten, jedoch kann durch die „Wire Bibliothek“ welche der Arduino IDE beiliegt
(zbsp. Version 1.6.6), das selbe ergebnis erzielt werden.
Es ist natürlich nicht ganz so kompfortabel, da man hier direkt auf der Adresse arbeiten muss, als mit Getter und Setter.

 

Beispielanwendung

Als eine kleine Beispielanwendung werde ich nun das Datum und die Uhrzeit auf einem Display (LCD 16×2) anzeigen. Wie das Display angeschlossen wird habe
ich im Tutorial „Arduino Lektion 7: LCD Display ansteuern“ beschrieben.

Der Quellcode

Das Video

RealTimeClock RTC DS3231

Download

Quellcode RTC DS3231 mit Serieller Ausgabe

Quellcode RTC DS3231 Ausgabe auf dem LCD Display aus der Beispielanwendung

35 Gedanken zu „Arduino Lektion 17: RealTimeClock RTC DS3231

  • Januar 14, 2017 um 13:07
    Permalink

    Arduino Lektion 17: RealTimeClock RTC DS3231

    Hallo, habe mich mal ein wenig mit dem Quellcode gespielt.
    Schade nur das beide Beispiele nicht funktionieren.
    bei der Seriellen Ausgabe : // setRTCTime(); somit wird setRTCTime nie aufgerufen .
    bei LCD : if(jahr<2000){ somit wird es nach 2000 nie funktionieren
    Vielleicht kann man das ja irgendwo vermerken

    Antwort
    • Januar 14, 2017 um 13:21
      Permalink

      Hallo Jackel,

      wie genau, definiert sich dieser Fehler bei dir?
      Weil bei mir hat dieses wunderbar funktioniert.

      Gruß,

      Stefan

      Antwort
  • Januar 14, 2017 um 16:42
    Permalink

    Hallo,
    im 1.Quellcode wird die Funktion setRTCTime() nie aufgerufen da sie in der Loop()
    deaktiviert ist . Zeile 193 fängt mit // an .
    Wenn ich die // in Zeile193 etferne geht das Programm und ich kann auch
    Zeit setzen.
    Im 2.Quellcode ist die Bedingung das Zahlem kleiner als 2000 akzeptiert werden.
    Wenn ich mit set 14.01.2016 12:10:00 eingeben kommt
    „Fehlerhafte Zeitangabe im ’set‘ Befehl“.
    Zeile 164 if(jahr<2000).
    Wenn cih daraus "if jahr gösser als 2000" mache geht auch dieses Programm

    Gruß Jackel

    Antwort
  • Januar 14, 2017 um 17:54
    Permalink

    Hi Jackel,

    ja da muss ich dir recht geben und mich bedanken das du mich darauf hingewiesen hast. Ich habe beides berichtigt. Es ist wahrscheinlich beim späteren experimentieren etwas durch einander gekommen.

    Gruß,

    Stefan

    Antwort
  • Januar 14, 2017 um 18:39
    Permalink

    Hallo Stefan,
    sehr schön. Auf den Quelltexten auf der Webseite hat sich aber bis jetzt nichts geändert . Die Downloads sind angepasst.
    Gruß Jackel
    PS: kannst die Kommentare ja auch löschen 🙂

    Antwort
    • September 9, 2017 um 17:40
      Permalink

      Kannst du mir diesen Befehl etwas erläutern

      //Berechnet den Tag der Woche aus dem übergebenen Datumswerten.
      byte calcDayOfWeek(int jahr, byte monat, byte tag) {
      static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
      jahr -= monat < 3;
      return ((jahr + jahr/4 – jahr/100 + jahr/400 + t[monat-1] + tag) % 7);

      Antwort
  • Februar 1, 2017 um 21:18
    Permalink

    Hallo Stefan,
    Dein Projekt finde ich klasse hab schon lange nach so etwas gesucht.
    Hat alles wunderbar geklappt.
    Ich hab den Code mal ein bisschen bearbeitet und hab versucht neben der Uhrzeit noch die Temperatur anzeigen zu lassen.
    Hinbekommen habe ich das leider nur über ein extra Thermsitor, aber um Bauteile einzusparen wollte ich gerne den Temperatur Sensor der im DS3231 integriert ist benutzen, aber ich bekomme den Wert nur ausgelesen und im Serial Monitor angezeigt aber nicht auf dem LCD Display.

    Könntest du dein Code mal so umschreiben das die Temperatur vom DS3231 im LCD angezeigt wird und mir zukommen lassen?

    Vielen Dank

    Antwort
    • Februar 3, 2017 um 19:39
      Permalink

      Hi,

      für welches Board brauchst du das denn? Ich habe einen Arduino UNO, Arduino Nano und einen Arduino Mega2360 R3 zur Auswahl :).

      Gruß,

      Stefan Draeger

      Antwort
      • Februar 5, 2017 um 18:06
        Permalink

        ICh hab auch den UNO oder den Mega 2560 R3.
        also mir ist das egal.

        Vielen Dank schon einmal

        Gruß

        Dirk

        Antwort
  • März 19, 2017 um 18:53
    Permalink

    Hi zusammen,

    ich habe mal die komplette Anleitung durchgelesen, die SW auf den Mega aufgespielt. Als Datum/Uhrzeit kommt allerdings nur „Dienstag, 165. 2165 45:165:85“. Wenn ich versuche das aktuelle Datum, die aktuelle Uhrzeit zu setzen, dann erscheint „Zeit und Datum wurden auf neue Werte gesetzt.“ Im seriellen Monitor ändert sich aber nichts. Ich kann keinen Fehler finden. Hat einer einen Tipp für mich?

    Antwort
    • März 19, 2017 um 18:59
      Permalink

      Fehler gefunden. Beim Arduino Mega werden Pin 20 als SDA und Pin21 als SCL verwendet!

      Antwort
      • März 19, 2017 um 20:39
        Permalink

        Hi, ja das stimmt in der Grafik habe ich einen Arduino Mega verwendet aber in der Schaltung ein Nano. Sorry. Habe den Fehler behoben.

        Gruß,

        Stefan

        Antwort
  • Mai 18, 2017 um 11:02
    Permalink

    Hallo, ich habe ein Arduino Uno mit dem DS3231 prinzipiel funktioniert auch alles, Problem ist nur das ich Uhrzeit, Monat und Tag nicht über den „set 18.05.2017 12:00“ Befehl ändern kann. Ausschließlich die Eingabe der Jahreszahl funktioniert.

    Der Quellcode wurde von mir nicht verändert, außer die Boudzahl des Seriellen Monitors hab ich auf 57600 geändert, da sonst nur Hieroglyphen raus kamen….

    Hat jemand eine Idee an was es liegen könnte ?

    Antwort
    • Mai 18, 2017 um 12:43
      Permalink

      Hi,
      was für einen Arduino verwendest du? Manchmal sind die Bibliotheken nicht kompatibel.

      Gruß,

      Stefan

      Antwort
  • August 3, 2017 um 17:26
    Permalink

    Kleiner Hinweis zu dem angezeigten RTC Modul,

    keine Batterie einlegen!!!

    Dieses Board enthält ein „Ladeschaltung“ und ist somit für einen LIR2032 Akku gedacht!

    Wenn ein Betrieb mit Batterie gewünscht wird, dann muss der Widerstand (201) oberhalb (auf das Foto hier bezogen) vom DS3231 IC ausgelötet werden.

    Antwort
    • August 3, 2017 um 18:23
      Permalink

      Hi,

      danke für den Hinweis. Ich habe nochmal das ebay Angebot geprüft und dort steht „nur“ etwas von CR2032 aber auf dem Bild des Angebots ist deutlich die von dir erwähnte Batterie mit der Bezeichnung „LIR2032“ zu sehen.
      Da ich das Modul bisher nur wenige Stunden in betrieb hatte ist bisjetzt nix größeres passiert.

      Danke.

      Gruß,

      Stefan

      Antwort
  • Oktober 12, 2017 um 21:04
    Permalink

    Hallo, warum muss ich 2021 eingeben um 2017 zu erhalten?
    Hab noch keinen fehler im Programm gefunden

    Antwort
    • Oktober 12, 2017 um 21:07
      Permalink

      Hab den fehler gefunden, es stand jahr-2100 bei mir drin anstatt jahr-2000

      Antwort
  • Pingback:Arduino Lektion 26: TM1637 - 4 Digit 7 Segment Display - Technik Blog

  • Pingback:Arduino Projekt: LED Matrix Uhr - Technik Blog

  • April 7, 2018 um 19:32
    Permalink

    set 07.04.2018 19:27
    erzeugt bei meinem arduino mega2560 eine Zeit von:
    Samstag, 7.Mai 2018 , 19:27:01 usw

    Aus April wird der Mai
    Wenn ich set 07.03.2018 19:27 eingebe dann wird der April eingestellt.
    Was mache ich falsch ?
    Vielen Dank Stephan für diese wunderbaren und freien Codezeilen,
    ich suchte genau danach um mir die Bibliotheken zu ersparen.
    Mehr als das was Du da gemacht hast brauche ich nicht für meine Zeitstempel.

    Ja, für den Code die Temperatur des Modules auszulesen würde ich mich auch brennend interessieren.

    Gerhard

    Antwort
    • April 7, 2018 um 19:59
      Permalink

      Hallo Gerhard,

      danke für deinen Kommentar.
      Das liegt warscheinlich daran das die Bibliothek nicht bei 0 mit den Monaten anfängt sondern bei 1 somit müßtest du den Index für den Zugriff auf das Array um eines erhöhen.
      Wie man die Temperatur aus dem Modul ließt habe ich im Tutorial https://draeger-it.blog/arduino-lektion-25-temperaturmessen-mit-dem-rtc-modul-ds3231/ erläutert.

      Solltest du noch fragen haben kannst du dich jederzeit melden.

      Gruß,

      Stefan

      Antwort
  • April 15, 2018 um 19:25
    Permalink

    Moin, Ich kann leider die Zeit nicht einstellen. Es funktioniert soweit alles wunderbar. Wenn ich im seriellen Monitor set 15.04.2018 19:23 eingebe, kommt:
    set 15.04.2018 19:24
    Fehlerhafte Zeitangabe im ’set‘ Befehl
    Beispiel: set 28.08.2013 10:54

    Ich weiß nicht was ich falsch mache…

    Antwort
    • April 15, 2018 um 19:58
      Permalink

      Hallo Henrik,

      welches Board verwendest du?
      Hast du den Quellcode 1:1 übernommen?
      Ich versuche das mal nachzustellen.

      Gruß,
      Stefan

      Antwort
      • April 15, 2018 um 20:09
        Permalink

        Moin. wow danke für die schnelle Antwort. Habe einen Arduino UNO R3.
        Den Quellcode habe ich 1:1 übernommen

        Antwort
  • Pingback:Arduino Lektion 45: RealTimeClock DS3231 (Mini) - Technik Blog

  • August 22, 2018 um 12:40
    Permalink

    Habe als Anfänger mal den Quellcode herunter geladen. Beim Setzen von Datum und Zeit wird statt 22.08.2018 immer September statt August ausgegeben. Woran kann das liegen

    Antwort
    • August 22, 2018 um 12:51
      Permalink

      Hallo,

      das liegt daran das die Monate mit 0 beginnen somit ist 0 = Januar, 1 = Februar usw.. Du solltest also im Quellcode Wire.write(decToBcd(monat)); in Wire.write(decToBcd(Monat-1)); ändern. Somit erhältst du das korrekte Datum.
      Ich werde das mal anpassen damit der Fehler raus ist. Danke und Gruß,
      Stefan Draeger

      Antwort
  • September 9, 2018 um 18:57
    Permalink

    Den Monat in Wire.write(decToBcd(Monat-1)); mit -1 zu ändern bewirkt daß die Wochentage des Vormonats angezeigt werden. Bei mir hilft es das Array String monthInYear 12 mit dem Monat „Dezember“ beginnen zu lassen.Dieses Jahr überprüft, Monat und der dazugehörige Wochentag sind so richtig.

    Antwort
  • September 16, 2018 um 11:08
    Permalink

    Hallo Stefan,
    erst einmal vielen vielen Dank für den super Sketch. Es funktioniert alles einwandfrei und ich konnte ohne Probleme den Sketch auf meine persönlichen Ansprüche anpassen.
    Jetzt habe ich nur ein kleines Problem… Und zwar läuft die Uhr nach nur 24h fast 2:30 min nach…
    Bei Verwendung eines anderen Quellcode’s, der auch die Temperatur des DS3231-Moduls ausließt, ergab sich eine Temperaturabweichung ins Positive von ca. 7,5 °C. Deshalb vermute ich, dass durch die falsche Temperaturkompensation die Schwingfrequenz des Quarz nicht akkurat überwacht/angepasst werden kann.
    Ist das möglich ? Und kann man das über den/deinen Quellcode ändern ?

    Beste Grüße

    Antwort
  • September 16, 2018 um 15:00
    Permalink

    Hallo Stefan,
    vielen Dank für den super Sketch. Funktioniert einwandfrei.
    Ein kleines Problem hätte ich aber… Und zwar läuft bei mir das DS3231-Modul mit der Zeit nach…
    Angeschlossen ist es am UNO und hängt mit einem LCD-Display in Serie am I2C-Bus.
    Weißt du/jemand wie man das in den Griff bekommen kann ?

    Antwort
  • Pingback:Arduino Lektion 71: analoge Uhr mit Drehspulinstrumenten und RTC Modul DS3231 - Technik Blog

  • Mai 21, 2019 um 09:54
    Permalink

    Hy ich nutze einen Wemos D1 (mini) und kann die Uhrzeit/Datum auch nicht über die set-Funktion setzen.

    Gruß Sebasian

    Antwort

Schreibe einen Kommentar

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