Hallo,
ich bin gerade dabei die Sache mit der RTC anzupassen und nutze dafür den Code von jurs.
Danke erstmal dafür. 1A.
Jetzt bin ich beim testen, ob die Winter/Sommerzeit Feststellung bei mir funktioniert, auf ein Problem gestoßen.
Übergibt man der Funktion die Jahreszahl 4stellig, ist alles i.O.
Übergibt man der Funktion die Jahreszahl 2stellig, funktioniert sie nicht mehr.
Warum?
Die Berechnung der Hilfsvariablen x1 und x2 wird doch unabhängig von allen anderen vorgenommen.
Mit der alten Funktion funktioniert das auch 2stellig.
Und warum werden die Funktionsvariablen year, month, day und hour in der IDE rot dargestellt?
Würde doch bedeuten, diese Namen werden von der IDE intern schon verwendet?
/*
Arduino Mega2560
I2C RTC DS3231
*/
#include <Wire.h>
#define ds3231_adress 0x68 // Adresse
// boolean i2c_status;
int Sekunde, Minute, Stunde, Wochentag, Tag, Monat, Jahr;
void setup()
{
Wire.begin();
Serial.begin(57600);
}
void loop()
{
if (read_DS3231 (ds3231_adress) == true) // wenn Fehlerstatus "wahr", dann
{
Serial.println("DS3231 I2C Busfehler");
}
else // wenn kein Busfehler, dann
{
if (Sommerzeit_aktiv(Jahr, Monat, Tag, Stunde) == true)
{ // wenn Sommerzeit, dann
Serial.print("Sommerzeit"); Serial.print("\t");
Stunde = Stunde + 1; // Sommerzeitkorrektur
if (Stunde >=24)
{
Stunde = 0;
Tag = Tag + 1;
}
}
else
{
Serial.print("Winterzeit"); Serial.print("\t");
}
Serial.print(Stunde); Serial.print("\t");
Serial.print(Minute); Serial.print("\t");
Serial.print(Sekunde); Serial.print("\t");
Serial.print(Tag); Serial.print("\t");
Serial.print(Monat); Serial.print("\t");
Serial.print(Jahr); Serial.print("\n");
}
delay(1000);
}
boolean read_DS3231 (int i2c_adresse)
{
boolean error = false; // Fehlerstatus setzen
Wire.beginTransmission(i2c_adresse); // Connect
Wire.write(0); // Anfrage ab/der Register Nummer
if (Wire.endTransmission() > 0 ) // war Connect fehlerfrei?
{
error = true; // I2C Busfehler
return error; // Abruch
}
Wire.requestFrom(i2c_adresse, 7); // 7 Bytes in Folge anfordern/lesen
if (Wire.available() > 0 ) // sind Daten vorhanden?
{
Sekunde = bcdToDec(Wire.read() & 0x7F); // Maske für die ersten 7 Bits alleine
Minute = bcdToDec(Wire.read() );
Stunde = bcdToDec(Wire.read() & 0x3F); // Umschaltung auf 24h statt 12h (AM/PM)
Wire.read(); // wäre der Wochentag
Tag = bcdToDec(Wire.read() );
Monat = bcdToDec(Wire.read() );
Jahr = bcdToDec(Wire.read() ) + 2000;
}
}
boolean Sommerzeit_aktiv (int year, int month, int day, int hour)
// ausgehend das die RTC in der Zeitzone UTC+1, also "Winterzeit Berlin" dauerhaft läuft
// European Daylight Savings Time calculation by "jurs" for German Arduino Forum
// input parameters: "normal time" for year, month, day, hour
// return value: returns true during Daylight Saving Time, false otherwise
{
static int x1,x2, lastYear; // Zur Beschleunigung des Codes ein Cache für einige statische Variablen
int x3;
if (month<3 || month>10) return false; // keine Sommerzeit in Jan, Feb, Nov, Dez
if (month>3 && month<10) return true; // Sommerzeit in Apr, Mai, Jun, Jul, Aug, Sep
// der nachfolgende Code wird nur für Monat 3 und 10 ausgeführt
// Umstellung erfolgt auf Stunde utc_hour=1, in der Zeitzone Berlin entsprechend 2 Uhr MEZ
// Es wird ein Cache-Speicher für die Variablen x1 und x2 verwendet,
// dies beschleunigt die Berechnung, wenn sich das Jahr bei Folgeaufrufen nicht ändert
// x1 und x2 werden nur neu Berechnet, wenn sich das Jahr bei nachfolgenden Aufrufen ändert
if (year!= lastYear)
{ // Umstellungsbeginn und -ende
x1= 1 + 1 + 24*(31 - (5 * year /4 + 4) % 7);
x2= 1 + 1 + 24*(31 - (5 * year /4 + 1) % 7);
lastYear=year;
}
x3= hour + 24 * day;
if (month==3 && x3>=x1 || month==10 && x3<x2) return true; else return false;
}
/* Sommerzeit Korrektur, ausgehend das die RTC in der Zeitzone UTC+1, also Winterzeit Berlin dauerhaft läuft
// European Daylight Savings Time calculation by "jurs" for German Arduino Forum
// input parameters: "normal time" for year, month, day, hour
// return value: returns true during Daylight Saving Time, false otherwise */
/*
boolean Sommerzeit_aktiv()
{
if (Monat<3 || Monat>10) return false; // keine Sommerzeit in Jan, Feb, Nov, Dez
if (Monat>3 && Monat<10) return true; // Sommerzeit in Apr, Mai, Jun, Jul, Aug, Sep
if (Monat==3 && (Stunde + 24 * Tag)>=(2 + 24*(31 - (5 * Jahr /4 + 4) % 7)) || Monat==10 && (Stunde + 24 * Tag)<(2 + 24*(31 - (5 * Jahr /4 + 1) % 7)))
return true;
else
return false;
}
*/
byte bcdToDec(byte val) // Hilfsfunktion zum Lesen/Schreiben der RTC
// Convert binary coded decimal to decimal number
// Hilfsfunktion für die Echtzeituhr
{
return ( (val/16*10) + (val%16) );
}