Schwierigkeiten mit Datums umrechnung.

Hallo Freunde

Da mir für meine UHR mit Kalender die Zeit über TIME hole was auch super läuft, wollte ich mir das Datum jetzt auch über DATE holen um es nicht bei jedem Start neu zu ändern. Jetzt habe ich das Problem, ist vielleicht nur eine Kleingkeit, aber ich versuche es schon seit 2 Stunden und bekomme es nicht hin. Hier einmal erst den Ausschnitt des Sketches.:

  char time[]=__TIME__; // UHRZEIT holen
  int stunden,minuten,sekunden;

  char datum[]=__DATE__; // DATUM holen
  int tag,monat,jahr;

 
  stunden=atoi(time);  // UHRZEIT für Ausgabe 
  minuten=atoi(&time[3]);
  sekunden=atoi(&time[6]);

  tag=atoi(&datum[4]); // DATUM für Ausgabe
  monat=atoi(&datum[0]);
  jahr=atoi(&datum[8]);

Also mit der Zeit habe ich keine Probleme, nur mit dem Datum. Da mit DATE das Datum wie folgt ausgibt:
Dec 13 2013

jetzt bei der umrechnung von tag,monat und jahr ist alles bei... tag und jahr ok lediglich den monat bekomme ich nicht hin. Ich könnte mir zwar ein Array erstellen mit ( jan,feb u.s.w.) und das durch eine Abrage , also jan=1, feb=2 u.s.w. erstellen aber das vergrößert meinen Skech noch mehr. Gibt es keinen Aufruf für DATE der das DEC gleich in 12 umwandelt oder eine andere lösung, so das ich im Grunde das Datum wie die Zeit umrechnen kann.

Was für ein RTC Modul und welche Lib?

Stefan, das ist keine Lib und kein Modul lediglich Softwarmässig. die Zeit wird beim Start berechnet also vom System geholt, das Datum auch. mit der Zeit und dem Datum habe ich ja auch kein Problem zumindest beim Datum mit dem Tag und dem Jahr, lediglich dadurch das siech der Arduino das Datum DEC 13 2013 vom System holt und ich nicht noch ein Array erstellen möchte für die Monate und diese dan in eine Zahl umfunktionieren möchte habe ich gedacht das es einen Aufruf für das Datum wo es komplet als Zahlenwert ausgegeben wird.

Holt sich vom System? Also du holst sie über die Serielle Schnittstelle von deinem PC? Hmm, okay, mit dem Software Lösung habe ich mich nie auseinander gesetzt. Ist mir zu ungenau, wenn der Arduino mal nicht mehr mit dem PC kommuniziert, zumal selbst die PC-RTC für A.... sind. Ohne NTP geht da auch nichts genau. Hast nicht zufällig noch einen RTC Modul rumfliegen? DS1307 würde ja reichen, bei dem kannst auch mit etwas schreibarbeit die Systemzeit vom PC holen lassen. Was spricht gegen weitere Arrays? Echt ein Speicherproblem? Wenn ja, evtl. den anderen Code optimieren/komprimieren mit F-Marko/PROGMEM

malerlein:
Da mir für meine UHR mit Kalender die Zeit über TIME hole was auch super läuft, wollte ich mir das Datum jetzt auch über DATE holen um es nicht bei jedem Start neu zu ändern. J

???

Dass das nur zwei Konstanten sind, die zum Zeitpunkt des Kompilierens erzeugt werden und bei jedem Programmstart exakt denselben Wert haben, ist Dir aber schon klar, oder?

malerlein:
Ich könnte mir zwar ein Array erstellen mit ( jan,feb u.s.w.) und das durch eine Abrage , also jan=1, feb=2 u.s.w. erstellen aber das vergrößert meinen Skech noch mehr.

Was ist denn das Problem? Die Sketchgröße? Oder die RAM-Speichergröße?

Wenn nur der RAM-Speicher ein Problem ist, kannst Du das Array der Monatsnamenabkürzungen natürlich im PROGMEM ablegen.

Ja Jurs, das ist mir schon klar , bis jetzt habe ich das Datum immer per Hand eingegeben wenn ich neu hochgeladen habe , da das aber mit TIME für die Uhrzeit so super klappt wollte ich das auch mit dem Datum über DATE machen. da ich immer noch etwas an meinem Kalender rumbastel und es mich einfach stört, wenn ich den Sketch neu auf den Arduino aufspiele, immer wieder das alte Datum auf meinen Kalender ausgegeben wird(wenn ich es nicht umgestellt habe, Manuell) Mein Gedanke war lediglich , da ich ja das Datum und die Zeit dann jedesmal vom System hole und ich schon alles versucht habe im Systen das Datum nur auf Zahlen um zu stellen. Ob es nicht eine einfachere lösung gibt als das JAN,FEb u.s.w. um zu wandeln. Aber wenn ich in der Systemsteuerung das Datumsformat so einstelle das es wie folgt ausgegeben werden soll 13.12.2013 das nimmt der PC nicht an und somit ändert sich nichts beim Hochladen des Programms auf den Arduino.

@ Doch Stefan ich warte ja noch auf 2 RTC Module, das ist nicht das Problem. Und ich kann Dir mit der Ungenauigkeit per Software nicht zustimmen..... Die Uhr läuft jetzt seit bestimmt 3 Monaten an einem Stück und in dieser Zeit geht sie vielleicht 20 bis 30 Sekunden nach. Ich habe aber auch viel ausprobiert und die millis nachgestellt und so wie sie juetzt stehen läuft alles ziemlich genau.

if (alteSekunde==millis()/999)  return; // loop verlassen, bei gleicher Sekunde
    sek=120;
    leds[1] = CHSV(fnr, 255, sek);
    
    FastLED.show();
    alteSekunde=millis()/999;
    tickOneSecond(); // Uhrzeit weiter laufen lassen

malerlein:
Ja Jurs, das ist mir schon klar , bis jetzt habe ich das Datum immer per Hand eingegeben wenn ich neu hochgeladen habe , da das aber mit TIME für die Uhrzeit so super klappt

Die Funktion zu programmieren ist doch ein Kinkerlitzlichen. Du müßtest nur wissen, was Deine Haupt-Zielvorgabe ist:

  • möglichst wenig Flash-Programmspeicher verbrauchen?
    oder
  • möglichst wenig RAM-Speicher verbrauchen?

Dein bisheriger Code für die TIME Zugriffe sieht so aus, als wenn Du reichlich RAM-Speicher hast und lieber mehr RAM verbraten möchtest, zugrunsten einer vorzugsweise etwas kleineren Programmgröße. Ist das so?

Oder darf umgekehrt eigentlich eher die Programmdatei ein paar Bytes größer sein, wenn das Programm dafür weniger RAM-Speicher verbraucht?

Mir gehts nicht um den Speicher, davon habe ich genug :slight_smile: Bisheriger Verbrauch für UHR und Kalender, LED Ansteuerung u.s.w. ist
27.954 Bytes (von einem Maximum von 258.048

Mir ging es lediglich darum ob ich mit DATE genau so verfahren kann wie mit TIME . Dann wurde mir im Seriellen Monitor aber das Datumsformat mit Dec 13 2013 angezeigt und mit den Tagen und der Jahreszahl mit atoi(&datum[x] raus zu holen ist ja auch kein Problem. ich habe nur gedacht man könnte das gesamte Datum als Zahlenwert holen und verarbeiten. Aus der Monatsangabe die Zahl für den Monat um zu wandeln iat auch nicht das Problem, Nur wäre es schöner gewesen so wie bei TIME die Zahlen zu holen und weiter zu verarbeiten. Ich bin nun einmal Bequem und suche immer den Weg des geringsten Wiederstands

Das Format kann man glaube ich nicht ändern

Die Umwandlung der Zeit geht übrigens kürzer und etwas leserlicher mit sscanf():
http://www.cplusplus.com/reference/cstdio/sscanf/

Funktioniert sehr ähnlich wie sprintf() aber in die andere Richtung:

char time[]=__TIME__; // UHRZEIT holen
int stunden,minuten,sekunden;
sscanf(time, "%d:%d:%d", &stunden, &minuten, &sekunden)

malerlein:
Nur wäre es schöner gewesen so wie bei TIME die Zahlen zu holen und weiter zu verarbeiten. Ich bin nun einmal Bequem und suche immer den Weg des geringsten Wiederstands

Ich glaube, dann mußt Du von der Arduino-IDE auf eine Entwicklungsumgebung aus externem Editor plus Makefile umsteigen. Und in Deinem Makefile kannst Du Dir dann auch auch ein eigenes DATE-Makro definieren, das dann anders aufgebaut ist als das, das Dir die Arduino-Macher fix und fertig anbieten.

Danke Serenifly

Das ist schon klar das es auch so geht :slight_smile: was mir eben fehlt ist diese funktion für DATE da ich dabei nicht wie bei TIME komplett Zahlenwerte raus bekomme- Also wird mir wohl nicht übrig bleiben als aus DATE wert } Dec 13 2013 den Tag und das Jahr aus zu lesen und den Monatnamen in eine Zahl umzuwandeln. Mehr wollte ich ja nich wissen, nur ob man durch eventuell einen anderen Befehl auch das Datum als Zahlenwert bekommen kann. :slight_smile: