DateTime Format

Hallo zusammen,

ich bastel mich gerade durch mein erstes Arduino Projekt :slight_smile:

Das ist eine Uhr, welche die Uhrzeit mit der Hilfe von zwei analogen Amperemeter anzeigt. Die Anzeige funktioniert, ich arbeite gerade an der Schnittstelle zum DS1307.

Folgendes Problem:
Mit Hilfe der Adafruit Seite (link) habe ich den Chip bereits in mein Sketch eingebunden. Funktioniert soweit auch.

Gestellt wird die Uhr aktuell √ľber die Zeit beim hochladen des Sketchs:

// RTC nach Programmierzeit stellen
  RTC.adjust(DateTime(__DATE__, __TIME__));

Ich möchte die Uhr aber gerne anschließend noch per Hand nachstellen. Denn später soll diese am USB-Netzteil betrieben werden, ohne PC in der Nähe. Außerdem ists ja auch unpraktisch :confused:

Wie erzähle ich den dm RTC jetzt, dass er bei Tastendruck genau eine Stunde (oder Minute) hochrechnen soll.
Bin quasi bei:

  if(digitalRead(11) == HIGH) {
    RTC.adjust(DateTime(__DATE__, (__TIME__+ 1 Stunde)));
  }

Ich finde auf der Playground Seite auch keine (zumindest f√ľr mich) hilfereichen Hinweise zum Aufbau bzw. Arbeitsweise des DateTime Formates.

Vielen Dank und weiterhin schönen Sonntag,
Mr_C_

Anmerkungen:

  1. DS3231 ist genauer.
  2. Das Format sind einfach Zahlen: hour+ 1 oder ++
  3. Aktuelle Zeit auslesen, ver√§ndern, zur√ľckschreiben.

Dir auch einen schönen Sonntag!

EDIT: TIME ersetzt durch hour

Mr_C_:
Bin quasi bei:

  if(digitalRead(11) == HIGH) {

RTC.adjust(DateTime(DATE, (TIME+ 1 Stunde)));
 }

Das ist nat√ľrlich Quatsch.

DATE und TIME stehen immer f√ľr Datum und Uhrzeit, auf die Deine PC-Uhr eingestellt war, als Du den Sketch kompiliert hast. Das ist quasi Datums- und Zeitstempel Deines Programms, wann Du es gemacht hast.

Wenn Du nun jedesmal das Datum und die Uhrzeit auf das Datum und die Uhrzeit zur√ľckstellst, an dem das Programm auf dem PC kompiliert wurde, wird die Uhr nat√ľrlich nach jedem Power-On oder Reset des Controllers wieder zur√ľckgestellt.

Um die Zeit eine Stunde/Minute vor oder zur√ľck zu stellen, m√ľ√ütest Du nat√ľrlich die aktuelle Zeit aus der RTC auslesen, die Zeitvariablen verstellen und dann die Zeit in die RTC zur√ľckschreiben.

jurs:
Das ist nat√ľrlich Quatsch.

DATE und TIME stehen immer f√ľr Datum und Uhrzeit, auf die Deine PC-Uhr eingestellt war, als Du den Sketch kompiliert hast. Das ist quasi Datums- und Zeitstempel Deines Programms, wann Du es gemacht hast.

Das ist mir Bewusst. Wollte auch eher Beispielhaft sagen, was ich machen wollte.

Insgesamt sieht es gerade so aus:

void loop() {
  
  // RTC auslesen
  DateTime now = RTC.now();
  Minute = now.minute(), DEC;
  Stunde = now.hour(), DEC;
  
  // Umrechnung in 12 Stunden Format
  if(Stunde > 12) {
    Stunde = Stunde - 12;
  }
  
  // Serielle Ausgabe
  Serial.print(Stunde);
  Serial.print("  ");
  Serial.print(Minute);
  Serial.print("  ");
  Serial.print(now.second(), DEC);
  Serial.println();
  
  // Ampere-Meter Ausgabe
  analogWrite(AmpMeterH, pwm_stunde[Stunde]);
  analogWrite(AmpMeterM, pwm_minute[Minute]);
  
  if(digitalRead(11) == HIGH) {
    Serial.println("Taster gedrueckt");
    DateTime test;
    test = now;
    RTC.adjust(test);
  }

  delay(500);
}

Ganz am Ende kommt die Stelle, wo ich bei Tastendruck die aktuelle Zeit (Variable now) in die Variable test hereinschiebe. In test w√ľrde ich nun gerne +1 Minute rechnen. Aber irgendwie bin ich gerade zu bl√∂d daf√ľr >:(

@agmue:
Hab leider zu wenig gegoogelt und bin so als erstes auf den DS1307 gestoßen. Nun habe ich den hier liegen und möchte den auch einsetzen.

Mr_C_:
@agmue:
Hab leider zu wenig gegoogelt und bin so als erstes auf den DS1307 gestoßen. Nun habe ich den hier liegen und möchte den auch einsetzen.

Schade, hängt auch vom Einsatzzweck ab. Aber wenn Dich irgendwann die Ungenauigkeit stört, kennst Du schon den Ersatz.

Jo, so ist das eben.
Das hilft mir aber jetzt bei dem aktuellen Problem auch nicht weiter :slight_smile:

Mr_C_:
Ganz am Ende kommt die Stelle, wo ich bei Tastendruck die aktuelle Zeit (Variable now) in die Variable test hereinschiebe. In test w√ľrde ich nun gerne +1 Minute rechnen. Aber irgendwie bin ich gerade zu bl√∂d daf√ľr >:(

Das Setzen der Zeit ist nur auf eine Art beschrieben, langsam verstehe ich Dein Problem :slight_smile:
Ich habe die Bibliothek nicht installiert, schaue aber mal auf diese Seite in das erste Beispiel. Ich w√ľrde versuchen:

DateTime now = RTC.now();
RTC.adjust(DateTime(now.unixtime() + 60)); // plus 60 Sekunden

Ich bin nicht sicher, was adjust haben will, DateTime akzeptiert uint32_t, könnte die Unix-Zeit sein.

Wenn das nicht funktioniert, hole ich morgen mein Uhrmodul aus der Bastelkiste. Jetzt ist Schnarchzeit :sleeping:

EDIT: Ich habe gerade meine RTC mit -3600 von Sommer- auf Winterzeit umgestellt, funktioniert also. :slight_smile:

Leichter verständlich finde ich die direkte Nutzung ohne Bibliothek >>klick<<

Mr_C_:
...

Was mir beim √úberfliegen des Threads einfiel: Mein aktuelles Gebastel enth√§lt ebenfalls eine Uhr. Anstatt mich bei der Umstellung auf Sommer-/Winterzeit gro√ü mit dem Ding befassen zu m√ľssen, habe ich ihm einen ‚ÄěSommer-/Winterzeit-Jumper‚Äú spendiert.

Gruß

Gregor

Hmm also mit der von dir genannten Library kenne ich mich auch nicht aus, aber vielleicht hast ja Lust mal folgende auszuprobieren: https://github.com/JChristensen/DS3232RTC
Die ist f√ľr den DS1307 und auch f√ľr den bereits genannten DS3232.

Mit dem Befehl ‚ÄúRTC.write()‚ÄĚ kann damit die Zeit gespeichert werden.

Ich habe bei meiner Uhr zwei Tasten verbaut, womit ich pro Tastendruck die Zeit um eine Minute erhöhen oder erniedrigen kann. Zeitgleich setzte ich auch die Sekunden auf 0. Die Funktion um die Minuten zu erhöhen sieht dann folgendermaßen aus:

void Minute_erhoehen() {
  RTC.read(tm);  // Zeit von RTC lesen
  // Minuten erhöhen
  if (tm.Minute < 59) {
    tm.Minute++;
    tm.Second = 0;
  }
  // bei xx:59 auch die Stunde erhöhen
  else {
    tm.Minute = 0;
    tm.Second = 0;
    if (tm.Hour < 23) 
      tm.Hour++;
    else 
      tm.Hour = 0;
  }
¬† RTC.write(tm);¬†  // Zeit in RTC √ľbertragen
}

Vielleicht hilft dir das ja weiter.

Gruß

Edit/Nachtrag:
Bin mir nicht mehr ganz sicher wieso aber in 'nem neueren Projekt habe ich folgende Library verwendet: https://github.com/PaulStoffregen/DS1307RTC
Der Aufruf mit RTC.write() d√ľrfte aber der gleiche sein.