Skip to content

Technik Blog

Programmieren | Arduino | ESP32 | MicroPython | Python | Raspberry Pi | Raspberry Pi Pico

Menu
  • Smarthome
  • Arduino
  • ESP32 & Co.
  • Raspberry Pi & Pico
  • Solo Mining
  • Über mich
  • Deutsch
  • English
Menu

Arduino Lektion 17: RealTimeClock RTC DS3231

Posted on 9. Januar 20165. März 2024 by Stefan Draeger

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
  • Technische Daten
  • Der Schaltplan
  • Der Quellcode
  • Beispielanwendung
    • Der Quellcode
    • Das Video
  • Download

Bezug

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

Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!

Technische Daten

  • 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 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
Dieses Video auf YouTube ansehen.

Download

Quellcode RTC DS3231 mit serieller Ausgabe

RTC DS3231 mit Serieller AusgabeHerunterladen

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

RTC DS3231 Ausgabe auf einem LCD DisplayHerunterladen

38 thoughts on “Arduino Lektion 17: RealTimeClock RTC DS3231”

  1. Jackel sagt:
    14. Januar 2017 um 13:07 Uhr

    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

    Antworten
    1. Stefan Draeger sagt:
      14. Januar 2017 um 13:21 Uhr

      Hallo Jackel,

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

      Gruß,

      Stefan

      Antworten
  2. Jackel sagt:
    14. Januar 2017 um 16:42 Uhr

    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

    Antworten
  3. Stefan Draeger sagt:
    14. Januar 2017 um 17:54 Uhr

    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

    Antworten
  4. Jackel sagt:
    14. Januar 2017 um 18:39 Uhr

    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 🙂

    Antworten
    1. Anton sagt:
      9. September 2017 um 17:40 Uhr

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

      Antworten
  5. Dirk sagt:
    1. Februar 2017 um 21:18 Uhr

    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

    Antworten
    1. Stefan Draeger sagt:
      3. Februar 2017 um 19:39 Uhr

      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

      Antworten
      1. Dirk sagt:
        5. Februar 2017 um 18:06 Uhr

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

        Vielen Dank schon einmal

        Gruß

        Dirk

        Antworten
  6. Josef1973 sagt:
    19. März 2017 um 18:53 Uhr

    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?

    Antworten
    1. Josef1973 sagt:
      19. März 2017 um 18:59 Uhr

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

      Antworten
      1. Stefan Draeger sagt:
        19. März 2017 um 20:39 Uhr

        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

        Antworten
  7. Pascal Herbst sagt:
    18. Mai 2017 um 11:02 Uhr

    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 ?

    Antworten
    1. Stefan Draeger sagt:
      18. Mai 2017 um 12:43 Uhr

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

      Gruß,

      Stefan

      Antworten
      1. Pascal Herbst sagt:
        29. Mai 2017 um 12:11 Uhr

        Arduino Uno R3 SMD Edition

        Antworten
  8. Micha sagt:
    3. August 2017 um 17:26 Uhr

    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.

    Antworten
    1. Stefan Draeger sagt:
      3. August 2017 um 18:23 Uhr

      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

      Antworten
  9. stephan sagt:
    12. Oktober 2017 um 21:04 Uhr

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

    Antworten
    1. stephan sagt:
      12. Oktober 2017 um 21:07 Uhr

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

      Antworten
  10. Gerhard sagt:
    7. April 2018 um 19:32 Uhr

    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

    Antworten
    1. Stefan Draeger sagt:
      7. April 2018 um 19:59 Uhr

      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

      Antworten
  11. henrikkk sagt:
    15. April 2018 um 19:25 Uhr

    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…

    Antworten
    1. Stefan Draeger sagt:
      15. April 2018 um 19:58 Uhr

      Hallo Henrik,

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

      Gruß,
      Stefan

      Antworten
      1. henrikkk sagt:
        15. April 2018 um 20:09 Uhr

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

        Antworten
  12. fibeule sagt:
    22. August 2018 um 12:40 Uhr

    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

    Antworten
    1. Stefan Draeger sagt:
      22. August 2018 um 12:51 Uhr

      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

      Antworten
  13. Winfried Dams sagt:
    9. September 2018 um 18:57 Uhr

    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.

    Antworten
  14. Gabriel sagt:
    16. September 2018 um 11:08 Uhr

    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

    Antworten
  15. Gabriel sagt:
    16. September 2018 um 15:00 Uhr

    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 ?

    Antworten
  16. Peter sagt:
    13. Mai 2019 um 14:19 Uhr

    Die immense Ungenauigkeit des DS3231 wird hier gut erklärt:
    http://www.harald-sattler.de/html/body_ds3231_-_ungenau-.htm

    Servus
    Peter

    Antworten
  17. Sebastian sagt:
    21. Mai 2019 um 09:54 Uhr

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

    Gruß Sebasian

    Antworten
  18. Michael Brandl sagt:
    6. Februar 2020 um 18:37 Uhr

    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

    Antworten
    1. Stefan Draeger sagt:
      8. Februar 2020 um 11:43 Uhr

      Hi,

      schau doch mal in dem Beitrag https://draeger-it.blog/arduino-lektion-93-setzen-der-uhrzeit-an-einer-rtc-ds3231-realtimeclock/ , dort habe ich noch einmal einpaar offene Fragen aufgegriffen und beantwortet.

      Gruß,

      Stefan

      Antworten
  19. Stefan Müller sagt:
    11. Mai 2020 um 09:39 Uhr

    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

    Antworten
    1. Stefan Draeger sagt:
      11. Mai 2020 um 09:50 Uhr

      Hallo Stefan,

      der Beitrag „Arduino Lektion 7: LCD Display ansteuern“ ist unter der Adresse https://draeger-it.blog/sainsmart-lektion-7-lcd-display-ansteuern/ aufrufbar.
      Erhälst du eine Fehlermeldung im Browser?

      Gruß,

      Stefan

      Antworten
  20. Lars sagt:
    4. Februar 2022 um 23:14 Uhr

    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

    Antworten
    1. Stefan Draeger sagt:
      5. Februar 2022 um 11:04 Uhr

      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

      Antworten
  21. Pingback: Arduino Lektion 26: TM1637 - 4 Digit 7 Segment Display - Technik Blog

Schreibe einen Kommentar Antworten abbrechen

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

Fragen oder Feedback?

Du hast eine Idee, brauchst Hilfe oder möchtest Feedback loswerden?
Support-Ticket erstellen

Newsletter abonnieren

Bleib auf dem Laufenden: Erhalte regelmäßig Updates zu neuen Projekten, Tutorials und Tipps rund um Arduino, ESP32 und mehr – direkt in dein Postfach.

Jetzt Newsletter abonnieren

Unterstütze meinen Blog

Wenn dir meine Inhalte gefallen, freue ich mich über deine Unterstützung auf Tipeee.
So hilfst du mit, den Blog am Leben zu halten und neue Beiträge zu ermöglichen.

draeger-it.blog auf Tipeee unterstützen

Vielen Dank für deinen Support!
– Stefan Draeger

Kategorien

Tools

  • Unix-Zeitstempel-Rechner
  • ASCII Tabelle
  • Spannung, Strom, Widerstand und Leistung berechnen
  • Widerstandsrechner
  • 8×8 LED Matrix Tool
  • 8×16 LED Matrix Modul von Keyestudio
  • 16×16 LED Matrix – Generator

Links

Blogverzeichnis Bloggerei.de TopBlogs.de das Original - Blogverzeichnis | Blog Top Liste Blogverzeichnis trusted-blogs.com

Stefan Draeger
Königsberger Str. 13
38364 Schöningen

Tel.: 01778501273
E-Mail: info@draeger-it.blog

Folge mir auf

  • Impressum
  • Datenschutzerklärung
  • Disclaimer
  • Cookie-Richtlinie (EU)
©2025 Technik Blog | Built using WordPress and Responsive Blogily theme by Superb
Cookie-Zustimmung verwalten
Wir verwenden Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wir tun dies, um das Surferlebnis zu verbessern und um personalisierte Werbung anzuzeigen. Wenn Sie diesen Technologien zustimmen, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn Sie Ihre Zustimmung nicht erteilen oder zurückziehen, können bestimmte Funktionen beeinträchtigt werden.
Funktional Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
Optionen verwalten Dienste verwalten Verwalten von {vendor_count}-Lieferanten Lese mehr über diese Zwecke
Einstellungen anzeigen
{title} {title} {title}