Hallo liebes Forum und ein Frohes neues Jahrđ
ich versuche mein Sketch fĂŒr die Wetterstation anzupassen damit die Sommer und Winterzeit korrekt angepasst wird. Die uhrzeit soll nach diesem Schema angepasst werden:
-
MĂ€rz (Beginn der Sommerzeit):
Um 01:59 Uhr wechselt die Uhr auf 03:00 Uhr. -
Oktober (Ende der Sommerzeit):
Um 02:00 Uhr wechselt die Uhr auf 01:00 Uhr.
Um zu prĂŒfen, ob die Zeit korrekt angepasst wird, habe ich die RTC auf den 31.03.2024 und 1:59 Uhr eingestellt, dies wurde von der RTC auch so ĂŒbernommen, das Problem ist das der Sketch nicht bei 1:59 Uhr anfĂ€ngt zu zĂ€hlen, sondern bei 0:59 Uhr und dann auf 3 Uhr springt, ich habe Ewigkeiten probiert und etliche varianten ausprobiert aber dieser Fehler verschwindet nicht, ich wĂŒrde mich Seher freuen, wenn jemand weiĂ, wo ich was Korrigieren muss und wo mein Fehler liegt, vielen Dank im Voraus.
Der Code zum Anzeigen der Uhrzeit und des Datums:
#include "RTClib.h"
RTC_DS3231 rtc;
void setup()
{
Serial.begin(115200);
rtc.begin();
}
bool isDST(const DateTime& dt)
{
// Sommerzeit in Deutschland: Letzter Sonntag im MĂ€rz bis letzter Sonntag im Oktober
if (dt.month() < 3 || dt.month() > 10)
{
return false;
}
else if (dt.month() > 3 && dt.month() < 10)
{
return true;
}
else if (dt.month() == 3)
{
int lastSunday = 31 - ((5 + dt.year() * 5 / 4) % 7);
return (dt.day() >= lastSunday && dt.hour() >= 2); // Sommerzeit beginnt um 02:00 Uhr
}
else
{
int lastSunday = 31 - ((5 + dt.year() * 5 / 4) % 7);
return (dt.day() < lastSunday || (dt.day() == lastSunday && dt.hour() < 2)); // Sommerzeit endet um 02:00 Uhr
}
}
void adjustForDST(DateTime& dt)
{
// Sommerzeit in Deutschland: Letzter Sonntag im MĂ€rz bis letzter Sonntag im Oktober
if (isDST(dt))
{
// Sommerzeit: Eine Stunde vorstellen
dt = dt + TimeSpan(0, 1, 0, 0); // Eine Stunde zur Uhrzeit hinzufĂŒgen
}
else
{
// Winterzeit: Eine Stunde zurĂŒckstellen
dt = dt - TimeSpan(0, 1, 0, 0); // Eine Stunde von der Uhrzeit abziehen
}
}
void readAndPrintRTC()
{
DateTime now = rtc.now();
adjustForDST(now);
char dateDisplay[15];
char timeDisplay[15];
sprintf(dateDisplay, "%.1d.%.02d.%.2d", now.day(), now.month(), now.year());
sprintf(timeDisplay, "%.02d:%02d", now.hour(), now.minute());
Serial.print("Date: ");
Serial.print(dateDisplay);
Serial.print(" Time: ");
Serial.println(timeDisplay);
}
void loop()
{
readAndPrintRTC();
delay(1000);
}