Echtzeituhr

Hallo,

Ich möchte gerne mit der Echtzeituhr DS3231 einen Zähler schalten lassen. Dieser soll immer um eine bestimmte Uhrzeit um 1 erhöht werden z.B. 23:59:59 Uhr und dient als Tage zähler
Dieser Zähler soll mir dann den Jahresdurchschnitt mitteilen

Durchschnitt = Packete / Tage

Kann mir jemand einen Tipp geben wie man das Programmiert. Mein Programm jetzt rechnet das nicht aus wenn es um einen Tag erhöht wird

Serial.print(t.hour);
Serial.print(t.min);
Serial.print(t.sec);

if (t.hour == Thour && t.min == Tmin && t.sec == Tsec)
{
tag= +1;

}
schnitt = count / tag;

Grundsätzlich:
Bis zur Untestbarkeit verstümmelter Code, dann keine konkrete Hilfe möglich.

uint32_t startzeitpunkt = rtc.unixtime();


uint32_t vergangeneTage = (rtc.unixtime() - startzeitpunkt) / sekundenProTag;

Hallo,

ich würde mir den Tag auslesen und bei jeder Änderungen dessen den Tageszähler inkrementieren.

Bedenke bitte, daß während einer Sekunde ganz viele Durchläufe von loop erfolgen. Du brauchst also noch einen Vergleich der alten mit der neuen Sekunde. Nur wenn beide gleich sind, zählst Du einen rauf.

Hallo agmue,

meinst du mich? Wenn ja, deswegen schrieb ich "bei jeder Änderung". :wink:

Der Code bzw. die Funktion ist nur größer wie die Rechnung von combie.
Ist "nur" eine andere Lösung der gestellten Aufgabe.

Hallo,

vorgestellt hatte ich mir das wie folgt, wie gesagt macht etwas mehr Aufwand ...

void loop(void)
{
  unsigned long var = tagesZaehler(t.day)
}


unsigned long tagesZaehler(const byte wochentag)
{
  static byte wochentagAlt = 0;
  static unsigned long zaehler = 0;

  if (wochentagAlt != wochentag)
  {
    zaehler++;
    wochentagAlt = wochentag;
  }

  return zaehler;
}

Ich würde den alarm vom ds3231 nutzen.
"Wecker" auf 2359 oder 0000 stellen und zählen.

wenn du kein Datum stellst und nur die Uhrzeit hast, dann halt einmal, wenn von 23 auf 0 gewechselt wird.

if (t.hour == 0 && lastHour == 23)
{
tag++;
}
lastHour = t.hour.

... jetzt lese ich Doc's antworten und stelle fest ... die Grundidee dahinter ist die gleiche ...

noiasca:
if (t.hour == 0 && lastHour == 23)
{
tag++;
lastHour = t.hour.

}

Wie wird aus "lastHour = t.hour" dann wieder "lastHour == 23" ??

Gruß Fips

durch andere Teile im sonst geheimen Code oder durch eine andere Klammersetzung ^^

noiasca:
durch andere Teile im sonst geheimen Code oder durch eine andere Klammersetzung ^^

Mir ist klar, das du das anpassen kannst.
Für Anfänger ist dein Schnipsel aber nicht geeignet.

Doc_Arduino:
Hallo agmue,

meinst du mich?

Nein, war wohl nicht eindeutig, sorry!

agmue:
Nein, war wohl nicht eindeutig, sorry!

Jetzt hab ich das geschnallt. Mein Fehler.

Bei langen Zeiträumen macht es u.U. Sinn den Startzeitpunkt im EEPROM zu speichern.

Das inkremenieren eines Tageszählers hat den Nachteil, dass eben dieser bei einem (WDT)Reset/Stromausfall oder öffnen der seriellen Konsole verloren geht.

Was ich in der ganzen Beschreibung vermisse:

Was soll eigentlich wie pro Tag gezählt werden?
Wie lange sollen die Tageswerte vorgehalten werden bzw. soll nur immer der kummulierte Zähler/Tage ausgegeben werden?
Wie langzeitstabil/ausfallsicher sollen die Werte sein?
Soll das irgendwann mal wieder genullt werden?

Dann eben EEPROM oder bei jeden Zählimpuls eher FRAM.

Gruß Tommy