Arduino Lektion 17: RealTimeClock RTC DS3231

Mit dem Modul RTC DS3231 ist es möglich einen Datum / Uhrzeit Wert zu speichern bzw. auszugeben ohne, dass dieser mit dem Computer verbunden ist. Und sollte der Mikrocontroller 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 PINs welche wie folgt 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 abgebildet, dieser verfügt über die PINs SDA & SCL und somit kann man statt an die analogen PINs auch an diese anschließen.
Jedoch gibt es Mikrocontroller, welche diese PINs 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), dasselbe Ergebnis erzielt werden.
Es ist natürlich nicht ganz so komfortabel, da man hier direkt auf der Adresse arbeiten muss, als mit Getter und Setter.

#include <Wire.h>
#define RTC_I2C_ADDRESS 0x68 // I2C Adresse des RTC  DS3231

//Membervariablen
int jahr,monat,tag,stunde,minute,sekunde, wochentag;
int daysInMonth[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
String daysInWeek[7] = {"Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"};
String monthInYear[12] = {"Januar","Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"};
String outputFormat = "%s, %02d.%s %04d %02d:%02d:%02d Uhr";

//Ließt den aktuellen Zeitstempel aus dem RTC Modul.
void rtcReadTime(){
  Wire.beginTransmission(RTC_I2C_ADDRESS); //Aufbau der Verbindung zur Adresse 0x68
  Wire.write(0);
  Wire.endTransmission();
  Wire.requestFrom(RTC_I2C_ADDRESS, 7);
  sekunde    = bcdToDec(Wire.read() & 0x7f);
  minute     = bcdToDec(Wire.read()); 
  stunde     = bcdToDec(Wire.read() & 0x3f); 
  //Der Wochentag wird hier nicht ausgelesen da dieses mit 
  //dem Modul RTC DS3231 nicht über die Wire.h zuverlässig funktioniert.
  /* wochentag  =*/ bcdToDec(Wire.read());
  tag        = bcdToDec(Wire.read());
  monat      = bcdToDec(Wire.read());
  jahr       = bcdToDec(Wire.read())+2000;    
}

//Funktion zum schreiben / setzen der Uhrzeit.
void rtcWriteTime(int jahr, int monat, int tag, int stunde, int minute, int sekunde){
  Wire.beginTransmission(RTC_I2C_ADDRESS);
  Wire.write(0); // Der Wert 0 aktiviert das RTC Modul.
  Wire.write(decToBcd(sekunde));    
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(stunde));                                  
  Wire.write(decToBcd(0)); // Wochentag unberücksichtigt
  Wire.write(decToBcd(tag));
  Wire.write(decToBcd(monat));
  Wire.write(decToBcd(jahr-2000));  
  Wire.endTransmission();  
}

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

//Convertiert Dezimalzeichen in binäre Zeichen.
byte decToBcd(byte val){
  return ( (val/10*16) + (val%10) );
}

//Convertiert binäre Zeichen in Dezimal Zeichen.
byte bcdToDec(byte val){
  return ( (val/16*10) + (val%16) );
}

//Ließt einen String und liefert einen Integer Wert von einer 
//definierten Stelle (byte num) des Stringwertes.
int getIntFromString (char *stringWithInt, byte num){
  char *tail; 
  while (num>0){
    num--;
    //Bei Kommanseparierten Listen werden die Kommata 
    //übersprungen und geben damit die Unterteilung des Strings an.
    while ((!isdigit (*stringWithInt))&&(*stringWithInt!=0)){
      stringWithInt++;
    }
    tail=stringWithInt;
    //Schleife solange ausführen bis eine Zahl gefunden wurde
    //welche größer 0 ist.
    while ((isdigit(*tail))&&(*tail!=0)){
      tail++;
    }
   
    if (num>0){
      stringWithInt=tail;
    }
  }  
  return(strtol(stringWithInt, &tail, 10));
}  

//Setup Methode
void setup(){
  Wire.begin(); //Kommunikation über die Wire.h bibliothek beginnen.       
  Serial.begin(57600);  //Übertragungsgeschwindigkeit 9600 Baud
  Serial.println("Mit dem Befehl kann das Datum und die Uhrzeit gesetzt oder veraendert werden.");
  Serial.println("Beispiel: set 28.08.2013 10:54:23");
}

//Gibt einen Zeitstempel auf der Seriellen Schnittstelle aus.
void printRTCDateTime(){
  char linebuf[60];
  int dOW = calcDayOfWeek(jahr, monat, tag);
  String wochentagC = daysInWeek[dOW];
  String monatC = monthInYear[monat];

  String result = "";
  result += wochentagC;
  result += ", ";
  result += tag;
  result += ".";
  result += monatC;
  result += " ";  
  result += jahr;  
  result += " "; 
  if(stunde<10) { result += "0"; }
  result += stunde;  
  result += ":";  
  if(minute<10) { result += "0"; }
  result += minute;  
  result += ":"; 
  if(sekunde<10) { result += "0"; }
  result += sekunde;  
  Serial.println(result); 
}

//Manuelles setzen der Uhrzeit über den Seriellen Monitor der IDE.
void setRTCTime(){
  char linebuf[30];
  byte counter;
  if (Serial.available()){
    delay(100); // Warte auf das Eintreffen aller Zeichen vom seriellen Monitor
    memset(linebuf,0,sizeof(linebuf)); // Zeilenpuffer löschen
    counter=0; // Zähler auf Null
    while (Serial.available()){
      linebuf[counter]=Serial.read(); // Zeichen in den Zeilenpuffer einfügen
      if (counter<sizeof(linebuf)-1) counter++; // Zeichenzähler erhöhen
    }
    // Wenn in der gelesenen Zeile das Wort 'set' vorkommt dann...
    //(Hier muss man bedenken das die Suche nach 'set' auch nach x Zeichen ein positives Ergebnis liefern wird, zbsp. 123set 09.01.2016 12:00:00)
    if (strstr(linebuf,"set")==linebuf){ 
      tag=getIntFromString (linebuf,1);
      monat=getIntFromString (linebuf,2);
      jahr=getIntFromString (linebuf,3);
      stunde=getIntFromString (linebuf,4);
      minute=getIntFromString (linebuf,5);
      sekunde=getIntFromString (linebuf,6);
    } else {
      Serial.println("Befehl unbekannt.");
      return;
    }
    // Ausgelesene Werte einer groben Plausibilitätsprüfung unterziehen:
    if (!checkDateTime(jahr, monat, tag, stunde, minute, sekunde)){
      Serial.println(linebuf);
      Serial.println("Fehlerhafte Zeitangabe im 'set' Befehl");
      Serial.println("Beispiel: set 28.08.2013 10:54");
      return;
    }
    rtcWriteTime(jahr, monat, tag, stunde, minute, sekunde);
    Serial.println("Zeit und Datum wurden auf neue Werte gesetzt.");
  }
}

//Prüft das eingegebene Datum auf korrektheit.
boolean checkDateTime(int jahr, int monat, int tag, int stunde, int minute, int sekunde){
   boolean result = false;
   if(jahr>2000){
     result = true;  
   } else {
     return false;
   }
   // Schaltjahr prüfen
   if(jahr % 400 == 0 || (jahr % 100 != 0 && jahr % 4 == 0)){
     //Wenn es ein Schaltjahr ist dann den Wert 29 in das Array an der Stelle 1 für den Monat Februar schreiben.
     daysInMonth[1]=29;
   }
   
   //Monat muss kleiner 13 sein.
   if (monat<13){
      if( tag <= daysInMonth[monat-1] ){
        result = true;
      }
   } else {
     return false;
   }
    
  //Wert für Stunde muss zwischen 0 und 24 liegen,
  //Wert für Minute und sekunde muss zwischen 0 und 59 liegen
  if(stunde <24 && minute <60 && sekunde <60 && stunde >= 0 && minute >=0 && sekunde >=0){
        result = true;
  } else {
     return false;
   }
   
   return result;
}

void loop(){ 
 rtcReadTime();
 printRTCDateTime();
 setRTCTime();
 delay(1000);
}

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

#include <LiquidCrystal.h>
#include <Wire.h>
#define RTC_I2C_ADDRESS 0x68 // I2C Adresse des RTC  DS3231

//Membervariablen
int jahr,monat,tag,stunde,minute,sekunde, wochentag;
int daysInMonth[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
String daysInWeek[7] = {"So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"};
String monthInYear[12] = {"Jan","Feb", "Mrz", "Apr", "Mai", "Jun", "Jul", "Aug", "Sept", "Okt", "Nov", "Dez"};

String outputLine1 = "";
String outputLine2 = "";

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

//Ließt den aktuellen Zeitstempel aus dem RTC Modul.
void rtcReadTime(){
  Wire.beginTransmission(RTC_I2C_ADDRESS); //Aufbau der Verbindung zur Adresse 0x68
  Wire.write(0);
  Wire.endTransmission();
  Wire.requestFrom(RTC_I2C_ADDRESS, 7);
  sekunde    = bcdToDec(Wire.read() & 0x7f);
  minute     = bcdToDec(Wire.read()); 
  stunde     = bcdToDec(Wire.read() & 0x3f); 
  //Der Wochentag wird hier nicht ausgelesen da dieses mit 
  //dem Modul RTC DS3231 nicht über die Wire.h zuverlässig funktioniert.
  /* wochentag  =*/ bcdToDec(Wire.read());
  tag        = bcdToDec(Wire.read());
  monat      = bcdToDec(Wire.read());
  jahr       = bcdToDec(Wire.read())+2000;    
}

//Funktion zum schreiben / setzen der Uhrzeit.
void rtcWriteTime(int jahr, int monat, int tag, int stunde, int minute, int sekunde){
  Wire.beginTransmission(RTC_I2C_ADDRESS);
  Wire.write(0); // Der Wert 0 aktiviert das RTC Modul.
  Wire.write(decToBcd(sekunde));    
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(stunde));                                  
  Wire.write(decToBcd(0)); // Wochentag unberücksichtigt
  Wire.write(decToBcd(tag));
  Wire.write(decToBcd(monat));
  Wire.write(decToBcd(jahr-2000));  
  Wire.endTransmission();  
}

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

//Convertiert Dezimalzeichen in binäre Zeichen.
byte decToBcd(byte val){
  return ( (val/10*16) + (val%10) );
}

//Convertiert binäre Zeichen in Dezimal Zeichen.
byte bcdToDec(byte val){
  return ( (val/16*10) + (val%16) );
}

//Ließt einen String und liefert einen Integer Wert von einer 
//definierten Stelle (byte num) des Stringwertes.
int getIntFromString (char *stringWithInt, byte num){
  char *tail; 
  while (num>0){
    num--;
    //Bei Kommanseparierten Listen werden die Kommata 
    //übersprungen und geben damit die Unterteilung des Strings an.
    while ((!isdigit (*stringWithInt))&&(*stringWithInt!=0)){
      stringWithInt++;
    }
    tail=stringWithInt;
    //Schleife solange ausführen bis eine Zahl gefunden wurde
    //welche größer 0 ist.
    while ((isdigit(*tail))&&(*tail!=0)){
      tail++;
    }
   
    if (num>0){
      stringWithInt=tail;
    }
  }  
  return(strtol(stringWithInt, &tail, 10));
}  

//Setup Methode
void setup(){
  lcd.begin(16, 2);            // Einstellen des Displays für Zeilen und Spalten
  Wire.begin(); //Kommunikation über die Wire.h bibliothek beginnen.       
  Serial.begin(57600);  //Übertragungsgeschwindigkeit 9600 Baud
  Serial.println("Mit dem Befehl kann das Datum und die Uhrzeit gesetzt oder veraendert werden.");
  Serial.println("Beispiel: set 28.08.2013 10:54");
}

//Gibt einen Zeitstempel auf der Seriellen Schnittstelle aus.
void printRTCDateTime(){
  int dOW = calcDayOfWeek(jahr, monat, tag);
  String wochentagC = daysInWeek[dOW];
  String monatC = monthInYear[monat-1];

 outputLine1 = "";
 outputLine1 += wochentagC;
 outputLine1 += ", ";
 outputLine1 += tag;
 outputLine1 += ".";
 outputLine1 += monatC;
 outputLine1 += " ";  
 outputLine1 += jahr;
 
 outputLine2 = ""; 
 if(stunde<10) { outputLine2 += "0"; }
  outputLine2 += stunde;
  outputLine2 += ":";
  if(minute<10) {   outputLine2 += "0"; }
  outputLine2 += minute;
  outputLine2 += ":";
  if(sekunde<10) {   outputLine2 += "0"; }
  outputLine2 += sekunde;
}

//Manuelles setzen der Uhrzeit über den Seriellen Monitor der IDE.
void setRTCTime(){
  char linebuf[30];
  byte counter;
  if (Serial.available()){
    delay(100); // Warte auf das Eintreffen aller Zeichen vom seriellen Monitor
    memset(linebuf,0,sizeof(linebuf)); // Zeilenpuffer löschen
    counter=0; // Zähler auf Null
    while (Serial.available()){
      linebuf[counter]=Serial.read(); // Zeichen in den Zeilenpuffer einfügen
      if (counter<sizeof(linebuf)-1) counter++; // Zeichenzähler erhöhen
    }
    // Wenn in der gelesenen Zeile das Wort 'set' vorkommt dann...
    //(Hier muss man bedenken das die Suche nach 'set' auch nach x Zeichen ein positives Ergebnis liefern wird, zbsp. 123set 09.01.2016 12:00:00)
    if (strstr(linebuf,"set")==linebuf){ 
      tag=getIntFromString (linebuf,1);
      monat=getIntFromString (linebuf,2);
      jahr=getIntFromString (linebuf,3);
      stunde=getIntFromString (linebuf,4);
      minute=getIntFromString (linebuf,5);
      sekunde=getIntFromString (linebuf,6);
    } else {
      Serial.println("Befehl unbekannt.");
      return;
    }
    // Ausgelesene Werte einer groben Plausibilitätsprüfung unterziehen:
    if (!checkDateTime(jahr, monat, tag, stunde, minute, sekunde)){
      Serial.println(linebuf);
      Serial.println("Fehlerhafte Zeitangabe im 'set' Befehl");
      Serial.println("Beispiel: set 28.08.2013 10:54");
      return;
    }
    rtcWriteTime(jahr, monat, tag, stunde, minute, sekunde);
    Serial.println("Zeit und Datum wurden auf neue Werte gesetzt.");
  }
}

//Prüft das eingegebene Datum auf korrektheit.
boolean checkDateTime(int jahr, int monat, int tag, int stunde, int minute, int sekunde){
   boolean result = false;
   if(jahr<2000){
     result = true;  
   } else {
     return false;
   }
   // Schaltjahr prüfen
   if(jahr % 400 == 0 || (jahr % 100 != 0 && jahr % 4 == 0)){
     //Wenn es ein Schaltjahr ist dann den Wert 29 in das Array an der Stelle 1 für den Monat Februar schreiben.
     daysInMonth[1]=29;
   }
   
   //Monat muss kleiner 13 sein.
   if (monat<13){
      if( tag <= daysInMonth[monat-1] ){
        result = true;
      }
   } else {
     return false;
   }
    
  //Wert für Stunde muss zwischen 0 und 24 liegen,
  //Wert für Minute und sekunde muss zwischen 0 und 59 liegen
  if(stunde <24 && minute <60 && sekunde <60 && stunde >= 0 && minute >=0 && sekunde >=0){
        result = true;
  } else {
     return false;
   }
   
   return result;
}

void loop(){ 
 rtcReadTime();
 printRTCDateTime();
 setRTCTime();
 lcd.setCursor(0, 0);
 lcd.print(outputLine1); 
 lcd.setCursor(0, 1);
 lcd.print(outputLine2); 
 delay(1000);
}

Das Video

RealTimeClock RTC DS3231

Download

Quellcode RTC DS3231 mit serieller Ausgabe

Quellcode RTC DS3231 Ausgabe auf dem LCD-Display aus der Beispielanwendung

44 Kommentare

  1. 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

  2. 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

  3. 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

  4. 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 🙂

    1. 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);

  5. 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

    1. 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

  6. 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?

      1. 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

  7. 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 ?

  8. 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.

    1. 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

  9. 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

    1. 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

  10. 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…

    1. Hallo Henrik,

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

      Gruß,
      Stefan

  11. 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

    1. 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

  12. 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.

  13. 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

  14. 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 ?

  15. Hallo,
    danke für den schönen Sketch, es hat auch alles super funktioniert, doch ab Februar 2020
    wird im Monitor jetzt der März angezeigt der Rest (Donnerstag, 6.März 2020 18:30:35) stimmt.
    Ich habe daraufhin mit Set die Daten neu eingegeben, nur das hat leider nichts geändert.
    Was könnte da bei mir falsch sein?

    Gruß Michael

  16. Hallo Stefan!
    Tolle Sketche. Ich habe hier schon viel für meine Ideen heraus genommen und dazu gelernt. Leider scheinen einige alte Lektionen nicht mehr verfügbar zu sein (z.B. Lektion 7, LCD ansteuern). Gerade die ersten Lektionen scheinen aber einiges an Lernpotential für mich zu haben. Könnten die eventuell wieder zur Verfügung gestellt werden?

    Mit freundlichen Grüßen

    Stefan

  17. Hallo Stefan,
    dein Sketch ist sehr passend für mein kleines Projekt. Ich will dafür ein Uno benutzen und ein 1,8 tft von DSD Tech. Kannst du mir dafür etwas helfen , um alles soweit zum laufen zu kriegen. Gut wäre es , mit Farbe , da Farbdisplay ist. Bin halt noch sehr Laienhaft dabei. Temperatur wäre auch von Vorteil. Echt guter Sketch.

    Gruß Lars

    1. Hallo Lars,

      schön das dir dieser Beitrag gefällt. Ein TFT Display habe ich bisher noch nicht in meinem Sortiment. Daher habe ich mir dieses heute bestellt und soll in ca. 3 Tagen ankommen.
      Bis dahin würde ich dich gerne bitten dein Projekt / Vorhaben etwas genauer zu beschreiben.

      Gruß

      Stefan Draeger

Kommentar hinterlassen

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