From 5b81a04d0ffd8b19375b3bf77b439d5460fa7fb5 Mon Sep 17 00:00:00 2001 From: J-Brinkman <77969387+J-Brinkman@users.noreply.github.com> Date: Mon, 14 Oct 2024 15:24:31 +0200 Subject: [PATCH] Create DST_Europe.ino Minor improvements, combined with new filename and directory --- examples/DST_Europe/DST_Europe.ino | 96 ++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 examples/DST_Europe/DST_Europe.ino diff --git a/examples/DST_Europe/DST_Europe.ino b/examples/DST_Europe/DST_Europe.ino new file mode 100644 index 0000000..7bd7b29 --- /dev/null +++ b/examples/DST_Europe/DST_Europe.ino @@ -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 // 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 + } +}