Beispiel anpassen
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(true) wird der RTC gesagt, dass diese das 12-Stunden-System verwenden soll. Zuletzt geändert: Donnerstag, 1. Februar 2024, 14:46