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

2 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

Schreibe einen Kommentar

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