-
Notifications
You must be signed in to change notification settings - Fork 712
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Minor improvements, combined with new filename and directory
- Loading branch information
1 parent
5b98cfd
commit 5b81a04
Showing
1 changed file
with
96 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,96 @@ | ||
/* European Daylight Saving Time (DST) example */ | ||
|
||
// The Real Time Clock is kept in local winter time (standard time). This approach is key for the simplicity of this solution. | ||
// This code is for a DST from Last sunday in March 1:00 (am) local time until Last sunday in October 3:00 (am) local time. | ||
// The DST time can be changed if required, by choosing a different hour in the DateTime function (4th parameter). | ||
|
||
#include <RTClib.h> // https://github.com/adafruit/rtclib | ||
RTC_DS3231 rtc; | ||
//RTC_DS1307 rtc; | ||
|
||
#define USEDST true // Use DST (true or false) | ||
#define BAUD 57600 // Baud rate for the serial monitor | ||
|
||
DateTime now; | ||
int lastsec; | ||
|
||
DateTime dstclock(DateTime n) { // Return the given (DST adjusted) date and time according to DST settings (for extensive date and time calculations) | ||
|
||
DateTime b, e; | ||
|
||
b = DateTime(n.year(), 3, 31, 1, 0, 0); // Begin of DST: set on March 31 1:000 (am) | ||
if (n.month() == 3) b = DateTime(n.year(), 3, 31 - b.dayOfTheWeek(), 1, 0, 0); // Begin of DST: adjusted to last sunday in March 1:00 (am) when actual month is March | ||
e = DateTime(n.year(), 10, 31, 3, 0, 0); // End of DST: set on October 31 3:00 (am) | ||
if (n.month() == 10) e = DateTime(n.year(), 10, 31 - e.dayOfTheWeek(), 3, 0, 0); // End of DST: adjusted to last sunday in October 3:00 (am) when actual month is October | ||
|
||
if (USEDST && (n > b) && (n < e)) n = n + TimeSpan(0,1,0,0); // adjust to standard time if within summertime | ||
return n; | ||
}; | ||
|
||
DateTime getclock() { // Retrieve the (DST adjusted) date and time | ||
|
||
DateTime n, b, e; | ||
|
||
n = rtc.now(); | ||
b = DateTime(n.year(), 3, 31, 1, 0, 0); // Begin of DST: set on March 31 1:000 (am) | ||
if (n.month() == 3) b = DateTime(n.year(), 3, 31 - b.dayOfTheWeek(), 1, 0, 0); // Begin of DST: adjusted to last sunday in March 1:00 (am) when actual month is March | ||
e = DateTime(n.year(), 10, 31, 3, 0, 0); // End of DST: set on October 31 3:00 (am) | ||
if (n.month() == 10) e = DateTime(n.year(), 10, 31 - e.dayOfTheWeek(), 3, 0, 0); // End of DST: adjusted to last sunday in October 3:00 (am) when actual month is October | ||
|
||
if (USEDST && (n > b) && (n < e)) n = n + TimeSpan(0,1,0,0); // adjust to standard time if within summertime | ||
return n; | ||
}; | ||
|
||
void setclock(DateTime n) { // if the clock is set during summertime then adjust the clock to standard time | ||
|
||
if (USEDST && (n != dstclock(n))) n = n - TimeSpan(0,1,0,0); // if summertime then adjust to the standard time | ||
rtc.adjust(n); // Set the clock to standard time | ||
}; | ||
|
||
void setup() { | ||
// initialise the rtc | ||
rtc.begin(); | ||
if (rtc.lostPower()) setclock(DateTime(F(__DATE__), F(__TIME__))); // Set date and time for use with the DS3231 RTC | ||
// if (!rtc.isrunning()) setclock(DateTime(F(__DATE__), F(__TIME__))); // Set date and time for use with the DS1307 RTC | ||
|
||
// initialise the serial port | ||
Serial.begin(BAUD); | ||
Wire.begin(); | ||
Serial.println(""); Serial.println(""); Serial.println("----------------- New start ------------------");; | ||
|
||
// Start the DST demonstration | ||
setclock(DateTime(F(__DATE__), F(__TIME__))); // Set the clock to compile date and time | ||
|
||
// show standard (winter) time | ||
now = rtc.now(); // retreive the winter time | ||
Serial.print(" Actual standard time: "); | ||
Serial.print(now.timestamp(DateTime::TIMESTAMP_DATE)); Serial.print(" "); // print the date | ||
Serial.println(now.timestamp(DateTime::TIMESTAMP_TIME)); // print the time | ||
|
||
// show DST corrected time (only when in DST period, otherwise this equals the standard time) | ||
Serial.print("Actual DST corrected time: "); | ||
now = getclock(); // get DST corrected time | ||
Serial.print(now.timestamp(DateTime::TIMESTAMP_DATE)); Serial.print(" "); // print the date | ||
Serial.print(now.timestamp(DateTime::TIMESTAMP_TIME)); Serial.println(""); // print the time | ||
Serial.println(""); | ||
delay(5000); | ||
|
||
Serial.println("Demonstration of the DST activation"); | ||
Serial.println("-----------------------------------"); | ||
Serial.println(" DST starts at: 2024-03-31 01:00:00"); | ||
Serial.println("First DST time: 2024-03-31 02:00:01"); | ||
Serial.println(""); | ||
delay(5000); | ||
setclock(DateTime(2024, 3, 31, 0, 59, 45)); // Set the clock 15 seconds before DST starts | ||
lastsec = now.second(); | ||
} | ||
|
||
void loop() { | ||
now = getclock(); // read the time from the RTC and adjust for DST or | ||
// now = dstclock(rtc.now()); // read the time from the RTC and adjust for DST | ||
if (lastsec != now.second()) { // if a new second | ||
Serial.print(now.timestamp(DateTime::TIMESTAMP_DATE)); Serial.print(" "); // print the date | ||
Serial.print(now.timestamp(DateTime::TIMESTAMP_TIME)); Serial.println(""); // print the time | ||
lastsec = now.second(); // store the current second | ||
} | ||
} |