Vergleich Uhrzeiten

Hallo zusammen,

gerade versuche ich zwei Uhrzeiten zu vergleichen, die die RTC (DS3231) liefert. Also in der Art "Wenn eine Minute vergangen, dann mache etwas" (später dann auch für Stunden). Dabei stoße ich auf das Problem, dass er erst ~15 sek nach der neuen Minute etwas macht. Bei den Minuten evtl. noch vernachlässigbar, bei Stunden aber leider nicht.

Hier mein Code:

DateTime jetzt = rtc.now();
  MinuteJetzt = (jetzt.minute());

  if (MinuteJetzt==MinuteLetzte)
  {
    
  }
  else
  {
    Serial.println(MinuteJetzt);
    MinuteLetzte = MinuteJetzt; 
  }

Im Serial Monitor gibt er mir dann folgendes aus:

19:54:15.237 -> 54
19:55:15.238 -> 55
19:56:15.239 -> 56
19:57:15.238 -> 57
19:58:15.267 -> 58
19:59:15.262 -> 59
20:00:15.268 -> 0

Er ist also immer ca. 15 sek zu spät.

Wie kann ich das umgehen?

Vielen Dank für eure Hilfe sagt
Josch

Indem Du Deinen gesamten Sketch zeigst.
Dann hat irgendwer eine Chance Dein Problem zu lokalisieren.
Bedenke: Meine Glaskugel ist gerade in der Reinigung.

PS: Deine Serielle Monitor-ausgabe gibt die Uhrzeit vom Rechner und .minute die Zeit vom Controller wieder.
Jetzt weisst Du, wie lange es dauert, zwischen kompilieren, übertragen und ausführen Deines Codes :grin::grin::grin:

Hallo zusammen,

hier der komplette Code:

#include <Arduino.h>
#include <Wire.h>
#include <RTClib.h>


RTC_DS3231 rtc;

uint8_t MinuteJetzt;                  // aktuelle Minute
uint8_t MinuteLetzte;                  // letzte Minute



void setup() 
{
  Serial.begin(9600);
  Wire.begin();
  

  // RTC
  if (! rtc.begin()) {
    Serial.println("Finde keine RTC");
    while (true);
  }

  //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));    // Zeit vom Compiler an RTC senden
  //rtc.adjust(DateTime(2025, 01, 15, 23, 59, 50));    // J, M, T, Std, Min, Sek => RTC-Zeit manuell setzen
  
  //DateTime jetzt = rtc.now();
  //MinuteLetzte = (jetzt.minute());
}

void loop() 
{
  DateTime jetzt = rtc.now();
  MinuteJetzt = (jetzt.minute());

  if (MinuteJetzt==MinuteLetzte)
  {
    
  }
  else
  {
    Serial.println(MinuteJetzt);
    MinuteLetzte = MinuteJetzt; 
  }


}

Hmm... vielleicht mal die RTC stellen?

Wie ich geschrieben habe.
Das passt schon alles - Nur passt Deine Zeit auf dem Controller nicht mit der Zeit auf Deinem rechner.
Der Versatz ist 15 Sekunden.

Wenn Du Dir die Uhrzeit des Controllers dauerhaft - (alle sekunde) - ausgeben lässt, wirst Du das merken.

#include <Arduino.h>
#include <Wire.h>
#include <RTClib.h>


RTC_DS3231 rtc;
DateTime jetzt;

uint8_t myLastSecond = 66;


void setup()
{
  Serial.begin(9600);
  Wire.begin();
  // RTC
  if (! rtc.begin())
  {
    Serial.println("Finde keine RTC");
    while (true);
  }
  //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));    // Zeit vom Compiler an RTC senden
  //rtc.adjust(DateTime(2025, 01, 15, 23, 59, 50));    // J, M, T, Std, Min, Sek => RTC-Zeit manuell setzen
  //DateTime jetzt = rtc.now();
  //MinuteLetzte = (jetzt.minute());
}

void loop()
{
  jetzt = rtc.now();
  if (myLastSecond != jetzt.second())
  {
    myLastSecond = jetzt.second();
    vornull(jetzt.hour());
    Serial.print(':');
    vornull(jetzt.minute());
    Serial.print(':');
    vornull(jetzt.second());
  }
}

void vornull(const byte number)
{
  if (number < 10)
  { Serial.print(0); }
  Serial.print(number);
}

Ich habs doch schon erklärt.
Hast Du es nicht verstanden?

Oh man, hin und wieder sieht man den Wald for lauter Bäumen nicht.

Sorry, klar ist das einfach der unterschied zwischen den beiden Uhren am Computer und vom RTC. Und ich hatte angst, dass er einen Unterschied erst nach 15sek (oder schlimmer nach 15 min) erkennt.

Danke, dass ihr mir die Augen geöffnet habt!
Josch

1 Like

Immer wieder gerne.
Du kannst aber fast genau rankommen, wenn Du die Zeit mit dem Versatz eingerechnet stellst
Alternativ: Schreib Dir ein Script auf dem Rechner, welches im laufendem Betrieb die Uhrzeit überträgt und frage die Schnittstelle im setup() draufhin ab.

Alles ist möglich...

Und wenn Du nett bist, stellst Du den Thread auf gelöst. Gelöste Threads können in der Forensuche explizit gesucht werden :slight_smile:

Was natürlich super genau ist...

Ich würde da Taster dran bauen. Dann kann man die Uhr auch stellen, wenn man gerade keinen Computer zum compilieren zur Hand hat.

Ja, die Taste kommen in einer späteren Ausbaustufe.

Vielen Dank für eure Hilfe. Gerne stelle ich auf "gelöst"
.... wenn ich den Button finde

Ja, ist es.
Du kannst nicht lesen und unterschlägst noch die Hälfte.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.