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.
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).
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
Download
Quellcode RTC DS3231 mit serieller Ausgabe
Quellcode RTC DS3231 Ausgabe auf dem LCD-Display aus der Beispielanwendung
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
Hallo Jackel,
wie genau, definiert sich dieser Fehler bei dir?
Weil bei mir hat dieses wunderbar funktioniert.
Gruß,
Stefan
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
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
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 🙂
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);
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
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
ICh hab auch den UNO oder den Mega 2560 R3.
also mir ist das egal.
Vielen Dank schon einmal
Gruß
Dirk
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?
Fehler gefunden. Beim Arduino Mega werden Pin 20 als SDA und Pin21 als SCL verwendet!
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
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 ?
Hi,
was für einen Arduino verwendest du? Manchmal sind die Bibliotheken nicht kompatibel.
Gruß,
Stefan
Arduino Uno R3 SMD Edition
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.
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
Hallo, warum muss ich 2021 eingeben um 2017 zu erhalten?
Hab noch keinen fehler im Programm gefunden
Hab den fehler gefunden, es stand jahr-2100 bei mir drin anstatt jahr-2000
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
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
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…
Hallo Henrik,
welches Board verwendest du?
Hast du den Quellcode 1:1 übernommen?
Ich versuche das mal nachzustellen.
Gruß,
Stefan
Moin. wow danke für die schnelle Antwort. Habe einen Arduino UNO R3.
Den Quellcode habe ich 1:1 übernommen
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
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
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.
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
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 ?
Die immense Ungenauigkeit des DS3231 wird hier gut erklärt:
http://www.harald-sattler.de/html/body_ds3231_-_ungenau-.htm
Servus
Peter
Hy ich nutze einen Wemos D1 (mini) und kann die Uhrzeit/Datum auch nicht über die set-Funktion setzen.
Gruß Sebasian
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
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
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
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
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
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