Sekunden seit Programmstart mit 0 anfangen zu zählen

Hallo,

hoffe ihr könnt mir weiterhelfen.

Ich möchte die Sekunden seit den Programmstart zählen und wiederkehrend etwas tun. Diese soll nicht fortlaufend zählen, sondern bei 59 Sekunden wieder auf 0 springen. Eine RTC ist installiert.

Beispiel:Das Programm startet um 22:25:21. D.h. bis 22:25:59 ist es einfach, da über normale Subtraktion machbar und "42 Sekunden" vergangen. Ab 22:26:00 bis 22:26:20 fällt mir keine Lösung ein, die eben von 43 bis 59 Sekunden vergangen sagt.

Irgendwie sehe ich gerade den Wald vor lauter Bäumen nicht:-(

Hoffe ich konnte mein Problem so schildern, das es halbwegs verständlich ist.

Danke für Eure Hilfe.

Hallo,
hast Du millis() in Erwägung gezogen?

Ja schon, dachte nur das ich eben mit der RTC synchron halte und nur eben den Offset habe. Es soll eben nach 55 Sekunden vom Programmstart etwas passieren und nicht wenn die RTC 55 Sekunden ausgibt.

55 oder 59 Sekunden?

Uhrzeit + 55 bei den Minuten, dann Ergebnis mit modulo 55 als Übertrag. Nur mal so theoretisch. jurs hätte bestimmt ein fertiges Programm :slight_smile:

hi,

die meisten RTCs haben einen einstellbaren "takter". stell den auf 1 sekunde, zähle vom programmstart an mit.
mit dem modulo-operator %

if (mitgezählte_sekunden % gewünschter_sekundenabstand == 0)

kommst Du auf's gewünschte ergebnis.

nicht vergessen, ein flag zu setzen, damit es nicht mehrmals in dieser sekunde passiert.

gruß stefan

Die 55 Sekunden waren ein Beispiel für den Zeitpunkt nach dem Programmstart wo etwas passieren soll.

Benutze folgenden RTC RTC

Wie wäre "long secondstime() const; // 32-bit times as seconds since 1/1/2000" als einfach zu handhabende Zahl? Dann die Berechnung von Stefan.

Erst mal vielen Dank für Eure Hilfe!

Dachte nur das ich eine Zeit direkt an die RTC binden kann und das über den I2C mitbekomme. Auch wenn es darum geht, das Aktionen immer alle 10 min ausgeführt werden oder eben alle 2 Stunden.

Toni14:
Auch wenn es darum geht, das Aktionen immer alle 10 min ausgeführt werden oder eben alle 2 Stunden.

Du kannst wie gesagt den Takt-Ausgang der RTC an einen Interrupt hängen und dann die Pulse zählen

Du brauchst aber eine Library die dessen Konfiguration unterstützt oder du machst es per Hand.

Bei Interrupts hören die Kenntnisse leider auf und wie ich in der Dokumentation gelesen habe kann ich am Pin A3(Taktausgang meiner RTC) auch nicht Pulse zählen.

hi,

in der beschreibung Deiner RTC ist auf seite 8 beschrieben, wie man SQW einstellt. stelle es auf 1 hertz. dann kommt bei A3 vom shield (k. A. ob das auch A3 vom arduino ist), jede sekunde ein HIGH. das zählst Du mit.

wenn Du jetzt alle 123 sekunden etwas machen willst, dann nimmst Du den mitgezählten wert % 123. wenn bei dieser rechnung null rauskommt, ist Dein mitgezählter wert ohne rest durch 123 teilbar:

100 % 123 = 100
123 % 123 = 0
124 % 123 = 1
246 % 123 = 0

wenn das ergebnis 0 ist, führst Du Deine funktion aus.

interrupts brauchst Du nicht zu bemühen, der takt ist jeweils eine halbe sekunde HIGH und LOW. das versäumst Du schon nicht...

gruß stefan

EDIT:

wie ich in der Dokumentation gelesen habe kann ich am Pin A3(Taktausgang meiner RTC) auch nicht Pulse zählen

wo steht das?

A3 ist auch der Pin vom Arduino Uno, also einer der analogen Eingänge. Hatte in der Doku gelesen, das nur die Pins 2 und 3 Interrupt Pins sind aber wenn du sagst ich brauche kein Interrupt ist das ja positiv.

Pulse zählen dann mit der Funktion Pulseln()?

hi,

pulseIn ist eher zum messen der länge einen pulses. einfach mit digitalRead.

lies es mal ein und wenn HIGH, dann setze die LED13 auf dem UNO auf HIGH, ansonsten auf LOW. so mal als anfang.

dann probier den modulo-operator mit verschiedenen werten aus.

auf die hürde mit dem nötigen flag kommst Du dann, wenn's soweit ist.

gruß stefan

EDIT: jumper für SQW setzen nicht vergessen

Schau dir das Beispiel StateChangeDetection unter Digital an. Ist da mit einem Taster gemacht, aber das ist genau das gleiche

Wirklich vielen lieben Dank.

Werde es morgen versuchen umzusetzen und gebe Feedback wie es gelaufen ist.

hi,

...und gebe Feedback wie es gelaufen ist.

darauf bestehen wir auch...

gute nacht und gruß stefan

Hallo,

Du baust Dir die Uhrzeit zu einer Sekundenzahl zusammen. Bsp. 22:21:30 Uhr
22 * 60 * 60 = 79200 Sekunden
plus
21 * 60 = 1260 Sekunden
plus
30
kommste auf 80490 Sekunden

Das machste noch mit der anderen Vergleichsuhrzeit und hast Deine Differenz in Sekunden.
Dann ziehste immer die letzte Uhrzeit als neue Rechenreferenz nach, so wie man das mit millis() auch machen würde.

Wenn Du einen Sekunden oder Minutenzähler brauchst der von der RTC kommt, mußte Bescheid sagen. Was haste denn für eine RTC? Es würde aber mit obiger Methode auch ausreichend sein, wenn Du halbwegs regelmäßig die RTC ausliest und dann die neue Sekundendifferenz bildest.

Hallo, benutze folgende RTC:

Toni14:
Benutze folgenden RTC RTC

Wie gesagt ist Punkt 8 auf Seite 6 relevant. Jumper 1 muss dafür gesetzt sein. Und auf Seite 8 steht auch wie man in der Library die Frequenz einstellt.

Was Doc_Arduino sagt stimmt aber auch. Man kann auch die RTC ständig auslesen und schauen ob sich die Sekunden geändert haben :slight_smile:
Braucht mehr Rechenzeit, aber das ist hier nicht so schlimm

Hallo,

okay, er hat eine DS1307.

Kommt eben immer darauf an was man für einen Aufwand betreiben möchte und ob man Rechenzeit frei hat.
Ein auslesen aller einer Sekunde, aller 1000 millis(), sollte keine Rolle spielen, denke ich auch. :wink:
Hat man höchstens eine Ungenauigkeit von einer Sekunde.
Ansonsten muß man mit mehr Aufwand die RTC für sich arbeiten lassen. :wink: