Hallo,
diese RTC´s haben ja fast alle einen Kalender, wie komme ich denn an diesen ran?
Beispiel: wir schreiben das Jahr 2014, den 30. April.
Wenn ich jetzt (day + 1) rechne, kommt doch 31. April?
Ich möchte aber den 1. Mai als Ergebnis.
Gibt es einen einfachen Weg, den richtigen Tag aus der RTC zu holen?
Einfach, im Sinne von- ich habe keine große Lust auf KalenderRechnerei.
Gruß und Dank
Andreas
Die RTC hat immer das richtige Datum wenn es einmal gestellt ist und man nichts macht. Das Problem entsteht wenn du auf dem Arduino was änderst und das auf die RTC schreiben willst.
Nimm eine RTC Lib die Unix Zeit verarbeitet. Das sind die Sekunden seit 1970. Damit kann man dann einfach beliebige Zeiten addieren und subtrahieren: http://www.pjrc.com/teensy/td_libs_DS1307RTC.html
Um einen Tag zu addieren liest man die Zeit als time_t aus, addiert die entsprechende Anzahl an Sekunden schreibt den Wert wieder zurück. Die hat auch Funktionen um die Zeit in einem Menschen-lesbaren Format zu verarbeiten, mit dem tm struct
Das läuft zusammen mit der Time Lib. In dieser gibt es auch mit makeTime() und breakTime() Funktionen um Unix Zeit (time_t) und tm ineinander umzuwandeln, wenn du das brauchst: http://www.pjrc.com/teensy/td_libs_Time.html
Du musst nicht alles aus der Time Lib verwenden, z.B. die Zeit lokal zu zählen und zu Synchronisieren ist nicht unbedingt nötig. Aber die RTC Lib braucht die time_t und tm Definition aus Time.h. Außerdem gibt es da Umrechnungs-Makros wie tmYearToCalendar, da die Jahre ab 1970 gezählt werden und man das damit auf das aktuelle Jahr umrechnen muss. Ist aber ganz einfach, wenn du mal das Beispiel anschaust.
Es gibt auch ein SECS_PER_DAY Makro für die Anzahl der Sekunden pro Tag
SkobyMobil:
Gibt es einen einfachen Weg, den richtigen Tag aus der RTC zu holen?
Einfach, im Sinne von- ich habe keine große Lust auf KalenderRechnerei.
Aus der RTC kannst Du nur die jeweils aktuelle Zeit auslesen.
Aber wenn Du nur tageweise in die Zukunft rechnen möchtest, ist die Kalenderrechnerei doch einfach: Dann mußt Du nur wissen, wieviele Tage der Monat hat und addierst einen Tag zum aktuellen Datum.
Zum Beispiel mit so einer nexDay Funktion, mal ohne großartige Optimierungen:
// next day calculation by 'jurs' for German Arduino forum
void nextDay(int &day, int &month, int &year)
{
static int days_in_month[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if (((year%4==0 && year%100!=0) || year%400==0))
days_in_month[2] = 29;
else
days_in_month[2] = 28;
day += 1;
if (day > days_in_month[month])
{
day = 1;
month += 1;
if (month > 12)
{
month = 1;
year += 1;
}
}
}
void setup() {
int tag=30;
int monat=4;
int jahr=2014;
Serial.begin(9600);
nextDay(tag,monat,jahr);
Serial.print(tag);
Serial.print(".");
Serial.print(monat);
Serial.print(".");
Serial.println(jahr);
}
void loop() {
}
Wenn Du mehrere Tage in die Zukunft rechnen möchtest, die Funktion in einer Schleife mehrfach aufrufen, so oft ein Tag zum aktuellen Datum addiert werden soll. Oder die Funktion um einen Schleifenzähler als Parameter erweitern und eine Zählschleife in die Funktion packen.
Hallo,
das habe ich mir gedacht. Die RTC läßt sich nur lesen. Der interne ewige
Kalender läßt sich nicht anstoßen. Denn der muß ja vorhanden sein, ich kann
zwar die vergangenen UnixSekunden lesen, weiß aber nicht was für einen Tag
wir haben.
Der Gedanke mit den vorgegebenen "EndTagen" des Monat ist mir auch schon
gekommen. Das wird der einfachste Weg sein- ist mir aber zu "billig".
Rechenpower & Speicher sind ja vorhanden.
Dann werde ich mich mal mit dem ewigen Kalender beschäftigen…
Vielen Dank für eure Mühe.
Gruß und Spaß
Andreas
Hallo,
Zeit und Datum von der RTC holen- und in "Smarty´s" konvertieren funktioniert
ohne Probleme.
Ich wollte aus der RTC, Heute- den richtigen Tag für Morgen holen.
30. April -> 1. Mai
NICHT
30. April -> 31. April
Das kann man nur im Sketch mit RTC lesen/schreiben machen, oder aber man
deklariert die "EndTage" des Monats vorher. Das wollte ich aber umgehen.
Also, ein ewiger Kalender muss her, da gibt es bestimmt etwas.
Gruß und Dank
Andreas
Ich habe ds mit dem Kalender in meiner Dezimal Uhr mit Kalender so gelöst.
if (sekunden == 60) {sekunden=0;minuten++;}
if (minuten == 60) {minuten=0;stunden++;}
if (stunden == 24) {stunden=0;tag++;}
//Datum berechnen
if ((monat == 1) and (tag == 32) and (stunden == 0) and (minuten == 0) and (sekunden == 0)) { tag=1;monat=2; }
if ((monat == 3) and (tag == 32) and (stunden == 0) and (minuten == 0) and (sekunden == 0)) { tag=1;monat=4; }
if ((monat == 7) and (tag == 32) and (stunden == 0) and (minuten == 0) and (sekunden == 0)) { tag=1;monat=8; }
if ((monat == 8) and (tag == 32) and (stunden == 0) and (minuten == 0) and (sekunden == 0)) { tag=1;monat=9; }
if ((monat == 10) and (tag == 32) and (stunden == 0) and (minuten == 0) and (sekunden == 0)) { tag=1;monat=11; }
if ((monat == 12) and (tag == 32) and (stunden == 0) and (minuten == 0) and (sekunden == 0)) { tag=1;monat=1;jahr++;szeit--;wzeit--; }
if ((monat == 4) and (tag == 31) and (stunden == 0) and (minuten == 0) and (sekunden == 0)) { tag=1;monat=5; }
if ((monat == 5) and (tag == 31) and (stunden == 0) and (minuten == 0) and (sekunden == 0)) { tag=1;monat=6; }
if ((monat == 6) and (tag == 31) and (stunden == 0) and (minuten == 0) and (sekunden == 0)) { tag=1;monat=7; }
if ((monat == 9) and (tag == 31) and (stunden == 0) and (minuten == 0) and (sekunden == 0)) { tag=1;monat=10; }
if ((monat == 11) and (tag == 31) and (stunden == 0) and (minuten == 0) and (sekunden == 0)) { tag=1;monat=12; }
// Schaltjahre bis 2020 berücksichtigt
if ((jahr == 16) and (monat == 2) and (tag == 30) and (stunden == 0)) { tag=1;monat=3; } else if ((monat == 2) and (tag == 29) and (stunden == 0)) { tag=1;monat=3; }
if ((jahr == 20) and (monat == 2) and (tag == 30) and (stunden == 0)) { tag=1;monat=3; } else if ((monat == 2) and(tag == 29) and (stunden == 0)) { tag=1;monat=3; }
/*
//Umstellung bis 2015
if (monat >= 12) {monat=0;jahr++;szeit--;wzeit--;}
*/
if ((tag == wzeit) and (monat == 10) and (stunden == 2) and (minuten == 59)) { stunden=2;}
if ((tag == szeit) and (monat == 3) and (stunden == 1) and (minuten == 59)) { stunden=1;}
// Datum Berechnung Ende
Du must nur einmal die Sommer und Winterzeit eingeben.
Hallo malerlein,
das sieht verdächtig nach Wochentag Berechnung über T,M,J- Ziffer aus. Das sollte mit mudulo (mod7) funktionieren.
Das ist eigentlich das, das ich vermeiden wollte. Aber es geht wohl nicht anders.
Schönen Dank dafür.
Gruß und Spaß
Andreas
SkobyMobil:
Also, ein ewiger Kalender muss her, da gibt es bestimmt etwas.
Für allgemeine Datumsberechnung +x Tage und -x Tage bietet sich die Julianische Tageszahl an.
Man braucht dann nur zwei kleine Funktionen, um ein Datum in die Julianische Tageszahl umzuwandeln und umgekehrt.
Läßt sich mit wenigen Zeilen Code leicht auf dem Arduino implementieren.
Um dann x Tage zu einem Datum draufzupacken würde man:
Datum in Julianische Tageszahl wandeln
Julianische Tageszahl +x
die Summe wieder in ein Datum zurückwandeln
Mit denselben beiden Funktionen lassen sich dann auch Tagesdifferenzen zwischen zwei Daten ermitteln, z.B.:
Datum 12.06.2014 in Julianische Tageszahl umwandeln
Datum von heute in Julianische Tageszahl umwandeln
Differenz x der Tageszahlen = Noch x Tage bis zum Beginn der Fussball-WM