RTC3231 Aufbau

Die Uhrzeit des RTC DS3231 Modul vom Arduino einstellen

Die Uhrzeit des RTC DS3231 Uhrzeitmoduls soll vom Arduino einmalig eingestellt werden. Danach speichert das Modul die richtige Uhrzeit und läuft mit der angebauten Batterie weiter.
Die Verkabelung wurde im vorherigen Beitrag beschrieben.

Hier das Programm.
Die aktuelle Uhrzeit +1min wird manuell eingegeben unter setup(). Dann wird das Programm ca. 4 Sekunden vor der Uhrzeit übersetzt und hochgeladen. Es sollte nun ungefähr zur richtigen Uhrzeit im RTC Chip ankommen. Ansonsten ein wenig mit den 4 Sekunden herum spielen.

// Einstellen der Uhrzeit vom RTC3231
// Die aktuelle Zeit wird in Setup() eingestellt und beim Start übertragen
// Dazu wird das Programm ca. 4 Sekunden vor der eingestellten Zeit übersetzt 
// und übertragen, dann ist es rechtzeitig fertig
//
// Matthias Busse 7.11.2016 Version 1.0

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

void setup() {
  Wire.begin();
  Serial.begin(38400);
  // aktuelle Zeit     sek min std wt tag mon jahr
  einstellenDS3231zeit(30, 34, 10, 2, 7,  11,  16);
}

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

void einstellenDS3231zeit(byte sekunde, byte minute, byte stunde, byte wochentag, byte tag, byte monat, byte jahr) {
  // Datum und Uhrzeit einstellen
  Wire.beginTransmission(DS3231_ADDRESSE);
  Wire.write(0);
  Wire.write(decToBcd(sekunde)); // Sekunden einstellen
  Wire.write(decToBcd(minute)); // Minuten einstellen
  Wire.write(decToBcd(stunde));
  Wire.write(decToBcd(wochentag)); // 1=Sonntag ... 7=Samstag
  Wire.write(decToBcd(tag));
  Wire.write(decToBcd(monat));
  Wire.write(decToBcd(jahr)); // 0...99
  Wire.endTransmission();
}


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));
}

Verwendet wurden:
Arduino Uno
RTC3231 Platine ZS-042
Arduino 1.6.5 Programm

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 auslesen

9 Gedanken zu „Die Uhrzeit des RTC DS3231 Modul vom Arduino einstellen

  1. Maya

    Hi, dein sketch funktioniert gut. Könnte man das jetzt so machen, das bei einem Tastendruck (sagen wir mal taster1 für “setup“) , die einstellprozedur zum einstellen der zeit mit 2 weiteren tastern (t2 “+“ & t3 “-“) öffnet? Das speichern und senden zum ds3231 wieder mit T1 und damit aus der einstellungsroutine zurück zum hauptprogramm….
    Ich denk mal, das es machbar ist, unter umständen mit etwas aufwand….

    Lg maya

    Antworten
  2. Sergej Klamm

    Hi,

    ich verwende ein Elegoo Mega Board. Das Auslesen der Uhrzeit funktionert aber das stellen der Zeit geht nicht. Habe dein Code eins zu eins übernommen und geladen. Als ob er die Zeit setzen Funktion nicht bearbeitet. Eine Idee woran das liegen kann? Habe schon versucht den Inhalt der Funktion in den loop zu testzwecken mit auf zu nehmen, hat aber nicht geändert.

    Gruß
    Sergej

    Antworten
  3. Marc

    Hallo,

    super Blog.
    Wie funktioniert das einstellen und nutzen der internen Alarmfunktionen?

    Wäre für Hilfe Dankbar. Mit den verfügbaren Libs ist das nicht wirklich zu verstehen.

    Gruß Marc

    Antworten
  4. Dan

    Da die Uhrzeit beim Start eingestellt wird, hab ich den Sketch einfach mit einer Zeit in 2 minuten kompiliert und geladen und dann im richtigen Moment Reset gedrueckt.

    Antworten
  5. Chrstoph

    Hallo Matthias,
    Klasse geschrieben. Das Wesentliche! Ohne Spielereien. Die kann dann jeder selber dazu bauen.
    Ich hatte das Problem, dass beim Ausschalten meiner Schaltung die Uhrzeit verloren ging. Obwohl ich den Pufferakku drin hatte. Nach tagelanger Suche die Ursache:
    Ich arbeitete mit zwei Arduinos, wobei einer das dcf-Signal dekodierte und nach erfolgreicher Decodierung dem zweiten per INT1 mitteilte, dass neue Daten für die RTC vorlagen.
    Aber: Nach dem Einschalten der Stromversorgung und dem Hochfahren beider MCUs gab es einen kurzen (256 us) Impuls auf der INT-Leitung. Die RTC-MCU holte sich dann unechte Daten.
    Mit einer einfachen Softwareänderung (ersten Impuls ignorieren) lief alles perfekt.
    Danke für deinen Scetch.
    Christoph

    Antworten
  6. Hubert

    Hallo Matthias,
    Ich brauche Deine Hilfe.Bin auf der suche nach ein Programm,womit ich die Uhrzeit des RTC DS3231 einstellen kann.
    Dein Programm habe ich hier gefunden ,super.Das Problem ist aber ,daß er beim Verifizieren ein Fehler meldet:
    Die Zeile 38 wird gelb hinterlegt und die Fehlermeldung ist:
    :38: error: expected unqualified-id before ‚ { ‚ token
    expected unqualified-id before ‚ { ‚ token

    Antworten
  7. Lothar

    Hallo Matthias ,
    ich habe den Sketch heute probiert, alles super, funktioniert einfach Klasse.
    Die Zeit ist nun fast genau, also auf die Minute, das ist für meine Zwecke ausreichend.
    Vielen lieben Dank dafür :))))

    Grüß Lothar

    Antworten
  8. Bernd

    Hallo Matthias,

    ich bin heute zufällig auf deinen Beitrag gestoßen. Beim Nachbauen versuche
    ich, so viel wie möglich vom Inhalt zu verstehen (lernen), ansonsten behelfe
    ich mir mittels Google.
    Hier ist es aber so wie ich weiß, zwar was ich wissen will, kann es aber schlecht
    in Worte fassen daher die Frage an Dich.
    Kannst du mir bitte erklären, was es mit dem * vor der Sekunde und natürlich auch
    mit dem & vor der Sekunde auf sich hat. Ich habe das noch nirgens in irgendeinem
    Sketch oder einer Dokumentation gelesen oder gesehen.

    Ich habe die zwei Stellen mal hier kopiert, so das du weißt was ich meine:

    void leseDS3231zeit(byte *sekunde, byte *minute,byte *stunde,
    byte *wochentag, byte *tag, byte *monat, byte *jahr)

    leseDS3231zeit(&sekunde, &minute, &stunde, &wochentag, &tag, &monat, &jahr);

    Ich währe dir dankbar, wenn du mir weiterhelfen könntest.

    Bernd

    Antworten

Schreibe einen Kommentar zu Sergej Klamm Antworten abbrechen

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.