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
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
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
hallo sergej
Habe de3n sketch gerade geladen und er funktioniert tadellos.
an welcher Stelle setzt du die aktuellen Werte ein?
Gruß Uwe
Hallo,
super Blog.
Wie funktioniert das einstellen und nutzen der internen Alarmfunktionen?
Wäre für Hilfe Dankbar. Mit den verfügbaren Libs ist das nicht wirklich zu verstehen.
Gruß Marc
Da die Uhrzeit beim Start eingestellt wird, hab ich den Sketch einfach mit einer Zeit in 2 minuten kompiliert und geladen und dann im richtigen Moment Reset gedrueckt.
Hallo Matthias,
Klasse geschrieben. Das Wesentliche! Ohne Spielereien. Die kann dann jeder selber dazu bauen.
Ich hatte das Problem, dass beim Ausschalten meiner Schaltung die Uhrzeit verloren ging. Obwohl ich den Pufferakku drin hatte. Nach tagelanger Suche die Ursache:
Ich arbeitete mit zwei Arduinos, wobei einer das dcf-Signal dekodierte und nach erfolgreicher Decodierung dem zweiten per INT1 mitteilte, dass neue Daten für die RTC vorlagen.
Aber: Nach dem Einschalten der Stromversorgung und dem Hochfahren beider MCUs gab es einen kurzen (256 us) Impuls auf der INT-Leitung. Die RTC-MCU holte sich dann unechte Daten.
Mit einer einfachen Softwareänderung (ersten Impuls ignorieren) lief alles perfekt.
Danke für deinen Scetch.
Christoph
Hallo Matthias,
Ich brauche Deine Hilfe.Bin auf der suche nach ein Programm,womit ich die Uhrzeit des RTC DS3231 einstellen kann.
Dein Programm habe ich hier gefunden ,super.Das Problem ist aber ,daß er beim Verifizieren ein Fehler meldet:
Die Zeile 38 wird gelb hinterlegt und die Fehlermeldung ist:
:38: error: expected unqualified-id before ‚ { ‚ token
expected unqualified-id before ‚ { ‚ token
Hallo Matthias ,
ich habe den Sketch heute probiert, alles super, funktioniert einfach Klasse.
Die Zeit ist nun fast genau, also auf die Minute, das ist für meine Zwecke ausreichend.
Vielen lieben Dank dafür :))))
Grüß Lothar
Hallo Matthias,
ich bin heute zufällig auf deinen Beitrag gestoßen. Beim Nachbauen versuche
ich, so viel wie möglich vom Inhalt zu verstehen (lernen), ansonsten behelfe
ich mir mittels Google.
Hier ist es aber so wie ich weiß, zwar was ich wissen will, kann es aber schlecht
in Worte fassen daher die Frage an Dich.
Kannst du mir bitte erklären, was es mit dem * vor der Sekunde und natürlich auch
mit dem & vor der Sekunde auf sich hat. Ich habe das noch nirgens in irgendeinem
Sketch oder einer Dokumentation gelesen oder gesehen.
Ich habe die zwei Stellen mal hier kopiert, so das du weißt was ich meine:
void leseDS3231zeit(byte *sekunde, byte *minute,byte *stunde,
byte *wochentag, byte *tag, byte *monat, byte *jahr)
leseDS3231zeit(&sekunde, &minute, &stunde, &wochentag, &tag, &monat, &jahr);
Ich währe dir dankbar, wenn du mir weiterhelfen könntest.
Bernd