Countdown für Tage, Stunden, Minuten und MAX7219 7 Segment Anzeige

Hallo, da meine Bauteile für mein anderes Projekt noch etwas dauern, versuche ich mich aktuell an einem Countdown für verschiedene Events.

Als nächstes steht der Urlaub an und deshalb würde ich gern meiner Tochter einen Counter für die restlichen Tage und Stunden bauen.

Vorhanden sind:

Arduino Nano MAX7219 7 Segmentanzeige mit 8 Ziffern

Beide sind auch miteinander verkabelt und verrichten ihre Dinge als Counter bis 24 Stunden. Als Vorlage diente hier ein englisches Video auf YT. Leider kann ich den Code hier aber nicht so abändern, um ihn für meine verbleibenden Tage Countdown zu nutzen.

Da ich keine RTC verwende und der Counter auch ohne PC laufen soll, kann ich leider nur im Programm hinterlegen, wann der Startzeitpunkt ist und entsprechend bei jedem Neustart ab eingestellten Wert laufen lassen.

Da der Counter aber eh durchlaufen soll, wäre das jetzt nicht das Problem.

Ich hätte mir jetzt folgends überlegt für die Berechnung.

Unix Timestamp der beiden Tage ausrechnen lassen. Danach dieses Ergebnis subtrahieren und ich erhalte die Zeit in Sekunden zwischen den beiden Tagen

Wenn ich in Mathe halbwegs aufgepasst habe, könnte ich jetzt jetzt z.B folgende Rechnung machen.

Umrechnung in Tage
5806800 Sekunden / 86400 = 67,20833333333333 Tage

Die übrigen Sekunden
0,20833333333333 x 86400 = 17999,99999712 Sekunden

Umrechnung in Stunden
17999,99999712 / 3600 = 4,9999999992 Stunden

Die übrigen Sekunden
0,9999999992 x 3600 = 3599,99999964 Sekunden

Umrechnung in Minuten
3599 / 60 = 59,999999994 Minuten 

Die übrigen Sekunden
0,999999994 x 60 = 59.99999 Sekunden

Mein Problem hier ist, wie komme ich an die Nachkommastellen der Ergebisse zum weiterrechnen.

Wenn ein Programmdurchlauf geschehen ist, müsste ich von meinem Startwert eine Sekunde abziehen. Hier bräuchte ich dann eine Zeit, welche für den Rechenschritt bzw. Schritte benötigt werden.

Die Genauigkeit spielt jetzt hier in erster Linie mal keine große Rolle. So lange ich mich in Minutenbereich auf 99 Tage befinde.

Denke ich evtl auch viel zu kompliziert? Ich habe auf Google und YT mit jede Menge Suchbegriffe um mich geworfen, aber leider keinen Countdown mit Tage gefunden, welcher mit dem MAX7219 umsetzbar wäre, bzw die meisten Counter waren nur für Sekunden, Minuten und Stunden angedacht.

Danke schon mal und Grüße aus Oberfranken. Christian

Hallo,

dir fehlt der Modulo-Operator %. Er gibt den Rest einer Division zurück: https://www.arduino.cc/reference/en/language/structure/arithmetic-operators/modulo/

Du solltest mit Ganz-Zahl-Datentypen rechnen. Die Fließkommazahlen sind alles andere genau. Leicht holt man sich größere Rundungsfehler hinein. Die normale Division gibt den ganzzahligen Ergebnisteil vorm Komma, mit % bekommst du den Rest zum weiteren Rechnen.

Theseus hat es eh schon angesprochen, modulo soll dich weiterbringen. Auf die schnelle habe ich nur etwas Code aus einem webserver, - der Code kommentiert sich über das HTML von selbst :wink: - das System sollte aber klar sein …

ss = Laufzeit in Sekunden

 message += "<div class='infodaten'><p>";
  if (ss > 604800)
  {
    message += "<span id='week'>";
    message +=  ((ss / 604800) % 52);
    message +=  "</span> Wochen ";
  }
  if (ss > 86400)
  {
    message += "<span id='day'>";
    message += ((ss / 86400) % 7);
    message +=  "</span> Tage ";
  }
  if (ss > 3600)
  {
    message += "<span id='hour'>";
    message += ((ss / 3600) % 24);
    message += "</span> Stunden ";
  }
  //if (ss > 60)
  //{
  message += F("<span id='min'>");
  message +=  ((ss / 60) % 60);
  message += F("</span> Minuten ");
  //}
  message += F("<span id='sec'>");
  message +=  (ss % 60);
  message += F("</span> Sekunden seit Start 
 Version " VERSION " " __DATE__ " " __TIME__ " </p></div>\n"
               "</div>\n</body>\n</html>");

Super, ihr seid ja schneller wie der Wind!

Ich versuche mal mein Glück mit eurem Link und schau mir das Beispiel aus der HTML etwas genauer an.

Hoffentlich komm ich dann weiter.

;-)

Grüße aus Oberfranken Chris

Zur Veranschaulichung (hoffentlich) die Rechnung mit ganzen Zahlen:

Umrechnung in Tage 5806888 Sekunden / (24*60*60) = 67 Tage Restliche Sekunden 5806888 - ((24*60*60) * 67) = 18088

Umrechnung in Stunden 18088 / (60*60) = 5 Stunden Restliche Sekunden 18088 - ((60*60) * 5) = 88

Umrechnung in Minuten 88 / 60 = 1 Restliche Sekunden 88 - (60 * 1) = 28

Noch ein Tipp: Die aktuelle Zeit plus etwas Sicherheit in das Programm schreiben, dann Programm übertragen. Da diese Übertragungszeit varieren kann, Reset drücken und erst loslassen, wenn Zeit im Programm mit der aktuellen übereinstimmt. Das sollte man so auf die Sekunde schaffen, auch wenn der Bootloader da noch mit reinspielt, also ggf. etwas früher loslassen.

Hi

Egal, wie genau Du den Reset-Knopf los lassen wirst - der Arduino wird Dir wohl in eine der Richtungen abhauen - Er ist ja auch nicht für eine präzise Zeit gebaut, sondern eher als Arbeitstier.

Wenn alle Stricke reißen, schreibe Dir den Sketch direkt für 'in 30 Tagen' und 'für in 7 Tagen' - dann kannst Du den Arduino 'schnell Mal' neu brennen und die Restzeit ist auch wieder halbwegs genau.

Müsste jetzt suchen, meine aber, daß der Sprut auch eine Pillendose für Seine Tochter baute, Die, halt quarzgenau und mit PIC (statt AVR/Arduino), auch nur am Vorabend beim Zubettgehen 'gestellt' (oder 1x beim Zubettgehen, schon etwas her) wird und am nächsten Morgen, nach dem Aufstehen, an die rechtzeitige Medikamenten-Einnahme erinnert.

MfG

Oh man!!!! Manchmal sollte man nicht zu lange am Problem kämpfen. Gestern 5 Stunden trotz eurer Hilfe an dem Modulo mich verbissen. Immer wieder probiert! Kein Erfolg gehabt, obwohl ich anfangs auf der richtigen Spur war.

Eine Nacht und ein fränkisches Bier später, war die Sache innerhalb von 5 Minuten jetzt zumindest in der Grundfunktion geschrieben!!!!

Danke alle die mitgeholfen haben!!!!

Grüße aus Oberfranken Chris