Das Uhrzeitmodul RTC DS3231 (Real Time Clock ZS-042) ist eine genaue Uhr mit eingebauten Quarz. Dieser Quarz wird intern Temperatur überwacht und korrigiert sodass sie einen Fehler von nur +-2ppm hat, was ca. 1 Minute pro Jahr entspricht.
Ich habe das RTC3231 mit 4 Leitungen an den Arduino Uno angeschlossen.
3,3V > VCC
GND > GND
A5 > SCL
A4 > SDA
Die Uhrzeit und das Datum sollen auf der Konsole ausgegeben werden. Hier das Programm.
// Die Uhrzeit auslesen von der Uhr RTC3231 // Die Uhr ist sehr genau mit einem Temperatur kompensierten Takt // Der Fehler beträgt +-2ppm bei 0-40°C oder max ca. 1 Minute pro Jahr // // Matthias Busse 6.11.2016 Version 1.0 #include "Wire.h" #define DS3231_ADDRESSE 0x68 void setup() { Wire.begin(); Serial.begin(38400); } void loop() { zeigeZeit(); // Zeit ausgeben delay(1000); // jede Sekunde } 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)); }
Und hier die Ausgabe
Verwendet wurden:
Arduino Uno
DS3231 Board, ZS-042 von ebay
Arduino 1.6.5
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 einstellen
Danke für das Tutorial 🙂
Benutze aber bisher nur die kleineren RTC´s, diese hier ist mir ein wenig oversized^^
hallo.
Leider funktioniert meine Uhr überhaupt nicht.
Ich habe einen Nano. mit diesem möchte ich für meine Modeleisenbahn eine echte Bahnhofsuhr realisieren. Dazu sollte ein 0,96″ Oled Display und ein Uhrenmodul Tiny DS3231 in Einsatz kommen.
Das einzige , was funktioniert ist das Oled Display mit einer Beispiel Bibliothek.
Vielleicht kann mir geholfen werden.
einige Nano“s benötigen für I2C die Anschlüsse SDA A4 und SCL A5 anstelle von D4 und D5.
Das könnte Ihr Problem sein.
Pingback: Die Uhrzeit des RTC3231 Modul vom Arduino einstellen | Shelvin – Elektronik ausprobiert und erläutert
Pingback: Rechteck 1Hz (+-2ppm) ausgeben mit dem RTC DS3231 und dem Arduino | Shelvin – Elektronik ausprobiert und erläutert
Pingback: Von der RTC DS3231 die Temperatur auslesen mit dem Arduino | Shelvin – Elektronik ausprobiert und erläutert
Pingback: Den Arduino Quarztakt auf 3ppm genau bestimmen mit der DS3231 RTC | Shelvin – Elektronik ausprobiert und erläutert
Hallo, ich habe mit dem schreiben von den Alarmregistern alles mögliche getestet, und ich bekommen einfach nicht hin ohne lib Datei Weckzeiten in das Modul ds3231 zu schreiben und auszulesen. Hättest Du vielleicht einen Ansatz oder ein Beispie? Gruß Frank
Hallo Matthias,
ich finde das Tutorail hier sehr gut erklärt. Aber ich musste bei mir eine andere Baudrate einstellen (9600).
Grüße
Christian
Hallo Herr Matthias Busse,
ich möchte noch den Wochentag angezeigt bekommen.
Als Zahl habe ich geschafft. Als Montag nur mit dayofWeek.
ich bastele schon lange an elektrischen Schaltungen. Vor einem Jahr habe ich mit Arduino angefangen. Einfache Sketche haben gut funktioniert. Mit der Aufgabe mehrere Zeiten zu schalten habe ich mich wohl zu viel vorgenommen.
Können Sie mir etwas helfen? Ich habe einen Sketch von Ihnen als Vorlage genommen vom 6.11.2016 Version 1.0 ( DS3231 auslesen und benutzen ) Auf den seriellen Monitor läuft auch alles. Die Zeit möchte ich aber auch auf einem 20×4 Display mit I2C anzeigen.
Dafür habe ich einen anderen Sketch der funktioniert. Beide Sketche zu einem machen funktioniert aber seit Wochen einfach nicht.
Ich möchte für meine Bewässerung im Garten mindestens 16 Ausgänge schalten. (funktioniert seriell ) mit 2 Zeiten am Tag. Für einen Tag auslassen habe ich auch noch keine softe Idee.
Ich würde die galvanisch getrennten Relay Module abschalten.
Meine verwendeten Teile:
Arduino Mega 2560 oder etwas kleiner Arduino UNO
Display 20×4 über I2C angeschlossen
DS3231
4x Relay Module 4fach mit Optokoppler
Software Arduino 1.8.6
meine 2 Sketche würde ich Ihnen gerne mal zum Anschauen schicken
Hallo,
danke für das Tutorial.
Ich hab hier nur ein kleines Problem mit der Ausgabe des Datums.
Anstatt des 09.04.2020 wird der 09:84:2020 ausgegeben.
Ich hab’s mit dem originalen Sketch von dir versucht.
Schöne Grüße
Thomas
Hallo
Ich konnte die Zeit am RTC Modul bereits einstellen und der Arduino Uno liesst diese auch gut aus. Ich möchte jetzt aber, das er um 18:00 eine Led anmacht und am 18:30 wieder aus. Um 19:00 ein Servo auf 20 Grad stellen u.s.w.
Jetzt ist die Frage, da ich mich noch nicht so gut auskenne, ob es dafür auch ein Command gibt. Vielleicht wie:
If RTC (18.00)
digitalWrite (13, HIGH);
Können sie mir dabei helfen ?
Lg Simon