Nach der Erstellung des Beispiels wird der nun erstellte Beispiel-Code in einem neuen Fenster der Arduino IDE geöffnet. Da der erstellte Code allerdings mehr Informationen verarbeitet, wie das Datum oder den Wochentag, müssen wir diesen zuerst so anpassen, dass wir lediglich die Informationen/Codezeilen für die Uhrzeit haben. Hier ist einmal zu sehen, wie der Beispielcode aussieht und wie man ihn verändern muss.  


(Um das rechte Code-Beispiel zum besseren Vergleich angucken zu können muss unten der Schieberegler verwendet werden.)

Beispiel-code

Angepasster Beispiel-code

                    /*
                        DS3231_set.pde
                        Eric Ayars
                        4/11
                        
                        Test of set-time routines for a DS3231 RTC
                        
                        */
                        
                        #include <DS3231.h>
                        #include <Wire.h>
                        
                        DS3231 Clock;
                        
                        byte Year;
                        byte Month;
                        byte Date;
                        byte DoW;
                        byte Hour;
                        byte Minute;
                        byte Second;
                        
                        void GetDateStuff(byte& Year, byte& Month, byte& Day, byte& DoW, 
                                byte& Hour, byte& Minute, byte& Second) {
                            // Call this if you notice something coming in on 
                            // the serial port. The stuff coming in should be in 
                            // the order YYMMDDwHHMMSS, with an 'x' at the end.
                            boolean GotString = false;
                            char InChar;
                            byte Temp1, Temp2;
                            char InString[20];
                        
                            byte j=0;
                            while (!GotString) {
                                if (Serial.available()) {
                                    InChar = Serial.read();
                                    InString[j] = InChar;
                                    j += 1;
                                    if (InChar == 'x') {
                                        GotString = true;
                                    }
                                }
                            }
                            Serial.println(InString);
                            // Read Year first
                            Temp1 = (byte)InString[0] -48;
                            Temp2 = (byte)InString[1] -48;
                            Year = Temp1*10 + Temp2;
                            // now month
                            Temp1 = (byte)InString[2] -48;
                            Temp2 = (byte)InString[3] -48;
                            Month = Temp1*10 + Temp2;
                            // now date
                            Temp1 = (byte)InString[4] -48;
                            Temp2 = (byte)InString[5] -48;
                            Day = Temp1*10 + Temp2;
                            // now Day of Week
                            DoW = (byte)InString[6] - 48;		
                            // now Hour
                            Temp1 = (byte)InString[7] -48;
                            Temp2 = (byte)InString[8] -48;
                            Hour = Temp1*10 + Temp2;
                            // now Minute
                            Temp1 = (byte)InString[9] -48;
                            Temp2 = (byte)InString[10] -48;
                            Minute = Temp1*10 + Temp2;
                            // now Second
                            Temp1 = (byte)InString[11] -48;
                            Temp2 = (byte)InString[12] -48;
                            Second = Temp1*10 + Temp2;
                        }
                        
                        void setup() {
                            // Start the serial port
                            Serial.begin(9600);
                        
                            // Start the I2C interface
                            Wire.begin();
                        }
                        
                        void loop() {
                        
                            // If something is coming in on the serial line, it's
                            // a time correction so set the clock accordingly.
                            if (Serial.available()) {
                                GetDateStuff(Year, Month, Date, DoW, Hour, Minute, Second);
                        
                                Clock.setClockMode(false);	// set to 24h
                                //setClockMode(true);	// set to 12h
                        
                                Clock.setYear(Year);
                                Clock.setMonth(Month);
                                Clock.setDate(Date);
                                Clock.setDoW(DoW);
                                Clock.setHour(Hour);
                                Clock.setMinute(Minute);
                                Clock.setSecond(Second);
                        
                                // Test of alarm functions
                                // set A1 to one minute past the time we just set the clock
                                // on current day of week.
                                Clock.setA1Time(DoW, Hour, Minute+1, Second, 0x0, true, 
                                false, false);
                                // set A2 to two minutes past, on current day of month.
                                Clock.setA2Time(Date, Hour, Minute+2, 0x0, false, false, 
                                false);
                                // Turn on both alarms, with external interrupt
                                Clock.turnOnAlarm(1);
                                Clock.turnOnAlarm(2);
                        
                            }
                        delay(1000);
                    }
                
                        #include <DS3231.h>
                        #include <Wire.h>
                        
                        DS3231 Clock;
                        bool h12;
                        bool PM;

                        byte Hour;
                        byte Minute;
                        byte Second;
                        
                        void GetDateStuff(byte& Hour, byte& Minute, byte& Second) {
                            boolean GotString = false;
                            char InChar;
                            byte Temp1, Temp2;
                            char InString[6];
                        
                            byte j=0;
                            while (!GotString) {
                                if (Serial.available()) {
                                    InChar = Serial.read();
                                    InString[j] = InChar;
                                    j += 1;
                                    if (InChar == 'x') {
                                        GotString = true;
                                    }
                                }
                            }
                            
                            Temp1 = (byte)InString[0] -48;
                            Temp2 = (byte)InString[1] -48;
                            Hour = Temp1*10 + Temp2;

                            Temp1 = (byte)InString[2] -48;
                            Temp2 = (byte)InString[3] -48;
                            Minute = Temp1*10 + Temp2;

                            Temp1 = (byte)InString[4] -48;
                            Temp2 = (byte)InString[5] -48;
                            Second = Temp1*10 + Temp2;
                        }
                        
                        void setup() {
                            Serial.begin(9600);
                            Wire.begin();
                        }
                        
                        void loop() {
                            if (Serial.available()) {
                                GetDateStuff(Hour, Minute, Second);
                        
                                Clock.setClockMode(true);
                                Clock.setHour(Hour);
                                Clock.setMinute(Minute);
                                Clock.setSecond(Second);
                            }
                        }
                

Für eine bessere Übersichtlichkeit, wurden die Kommentare bei der Anpassung auch entfernt. Im normalen Fall, würde man diese im Code lassen, um diesen auch nach längerer Zeit noch nachvollziehen zu können. Die vorgenommenen Änderungen sind zum einen das Entfernen der Codestellen für die Initialisierung von dem Datum sowie die Anpassung der Initialisierung für die Uhrzeit, aber auch das Entfernen der Methoden für das Stellen eines Weckers.
Um den nun bestehenden Code zu verstehen, muss man sich die einzelnen Zeilen angucken.

#include <DS3231.h>
#include <Wire.h>
Mit diesen Codezeilen werden die zum Verwenden der RTC benötigten Libraries importiert, so dass diese verwendet werden können. Bei der DS3231.h-Bibliothek handelt es sich um die von uns installierte Bibliothek die für die RTC benötigt wird. Bei der Wire.h handelt es sich um eine Bibliothek die es dem ESP32 ermöglicht mit der RTC zu kommunizieren.

DS3231 Clock;
bool h12;
bool PM;

Es wird ein Objekt mit dem Namen Clock erstellt, um die Funktionen aus der DS3231-Library verwenden zu können. Ebenfalls werden zwei Booleans mit den Namen h12 und PM erstellt, da wir diese später für eine Methode benötigen.

byte Hour;
byte Minute;
byte Second;
Mit diesen Zeilen werden lediglich Variablen vom Datentyp Byte deklariert.

void GetDateStuff(byte& Hour, byte& Minute, byte& Second) {
     boolean GotString = false;
     char InChar;
     byte Temp1, Temp2;
     char InString[6];
                        
     byte j=0;
     while (!GotString) {
        if (Serial.available()) {
           InChar = Serial.read();
           InString[j] = InChar;
           j += 1;
           if (InChar == 'x') {
              GotString = true;
           }
        }
     }
Bei diesen Zeilen wird eine Methode mit dem Namen GetDateStuff erstellt, die die Parameter Hour, Minute, Second besitzt. In dieser Methode werden wieder verschiedene Variablen mit den Datentypen boolean (booleans sind wahr oder falsch abfragen), char (chars speichern einzelne Charaktere also z.B. ‘A’) byte erstellt. Es wird eine while-Schleife erzeugt, in der durch die einzelnen eingegebenen Zeichen durchgegangen wird und diese in einem Array gespeichert werden. Dies wird solange wiederholt, bis ein x gefunden wurde.

     Temp1 = (byte)InString[0] -48;
     Temp2 = (byte)InString[1] -48;
     Hour = Temp1*10 + Temp2;

     Temp1 = (byte)InString[2] -48;
     Temp2 = (byte)InString[3] -48;
     Minute = Temp1*10 + Temp2;

     Temp1 = (byte)InString[4] -48;
     Temp2 = (byte)InString[5] -48;
     Second = Temp1*10 + Temp2;
}
In diesen Zeilen werden lediglich die eingegebenen Zahlen, umgewandelt und in die vorher erstellten Variablen abgespeichert.
void setup() {
     Serial.begin(9600);
     Wire.begin();
 }
In der setup-Methode wird eine serielle Verbindung aufgebaut, damit man später darüber die Uhrzeit eingeben kann. Um die Wire.h-Bibliothek verwenden zu können, muss diese erst einmal mit Wire.begin() initialisiert werden.

void loop() {
     if (Serial.available()) {
         GetDateStuff(Hour, Minute, Second);              
         Clock.setClockMode(true);
         Clock.setHour(Hour);
         Clock.setMinute(Minute);
         Clock.setSecond(Second);
     }
 }
In der loop()-methode  wird einfach überprüft, ob Daten im Seriellen Monitor eingegeben wurden. Wenn Daten eingegeben wurden, werden diese mit der GetDateStuff -Methode geholt und anschließend über die Methoden z.B. setHour (Hour) an die RTC übergeben. Mit der Methode setClockMode(truewird der RTC gesagt, dass diese das 12-Stunden-System verwenden soll. 
Last modified: Thursday, 1 February 2024, 2:46 PM