Ich möchte mit einer 4x7 Segment Anzeige einen 60 Minuten Timer Programmieren. Ich habe mir überlegt wie ich das anstellen könnt und habe versuch eine vierstellige Zahl (in dem Fall 6000) einfach langsam runter laufen zu lassen. Leider Zählt es aber dann immer 100 Sekunden für eine Minute und nicht wie normal 60. Leider weiß ich nicht wie ich das anders machen könnte.
Hallo
hier kommt eine Lösung für einen Rückwärtszähler. Der Sketch bleibt bei der Zeit=0 stehen und muss neugestartet werden. In der Zeile static unsigned long zeit = 2 * 60; wird die Startzeit in Minuten*Sekunden programmiert. Der Sketch läuft nicht blockadefrei, da die delay()-Funktion verwendet wird. Viel Spass beim Testen.
void loop() {
static unsigned long zeit = 2 * 60;
unsigned long minute;
unsigned long sekunde;
minute = zeit / 60;
sekunde = zeit % 60;
Serial.print(minute); Serial.print(":"); Serial.println(sekunde);
while (!zeit);
zeit--;
delay (1000);
}
combie:
Ich weiß jetzt nicht, wie dein Ticker reagiert, wenn die Anwendung ihn mal 3 Sekunden nicht aufruft...
Hmm ja, ist die Frage was man will. Derzeit ist es so, dass er die Pause überspringt um dann im richtigen Takt-Rhythmus zu bleiben - hier also immer die glatten Sekunden. Nach dem Motto: was vorbei ist, ist vorbei. Wobei dann natürlich Takte fehlen.
Edit: und der erste Takt nach der Pause passt dann allerdings auch nicht genau in den Rhythmus ..
Alternative wäre, die fehlenden Takte nach den 3 Sekunden möglichst schnell nachzuholen ( wenn wieder schnell genug aufgerufen wird ). Dann stimmt die Gesamtzahl der Takte ( was hier natürlich richtig wäre ), dafür wird aber zu falschen Tickerzeiten ausgelöst - u.U sehr schnell hintereinander, was auch Probleme machen könnte.
Vielleicht sollte man das noch einstellbar machen. Hängt eher von der Anwendung ab, was richtig(er) ist.
Edit: wirklich 'richtig' kann es nicht funktionieren, wenn die Anwendung falsch programmiert ist, und den Ticker nicht häufig genug aufruft.
Nochmal zum ersten Problem.
Zeit zählt in Minuten und Sekunden in 60-ger Schritten.
Zum Runterzählen (für die Restzeit-Anzeige) kann man eine von 2 Lösungen nehmen:
man wandelt die Minuten und Sekunden in Sekunden um und zählt diese herunter. Dann braucht man 2 Funktionen: die Sekunden in Minuten-Sekunden umrechen und zurück.
man schaut wenn ein Übertrag ansteht zB x100 auf x099 in x059. Am einfachsten ist da 2 Variablen zu haben und wenn die Sekunden 00 erreichen und 1 weggezählt werden soll dann die Minuten um 1 kleiner werden und die Sekunden 59.
sekunden --;
if (sekunden == 99)
{
sekunden = 59;
minuten --;
if ( minuten < 0)
Ende erreicht.
}
Man kann den Wink mit dem Zaunpfahl von combie beherzigen, dann muß man aus der Startzeit, dem Interval und den Millis die Restzeit errechnen und diese als Min - Sek darstellen. Dies hätte den Vorteil daß die Zeit keine Fehler durch nicht zeitgenaues Vermindern der Restzeit aufsummiert.
uwefed:
Dies hätte den Vorteil daß die Zeit keine Fehler durch nicht zeitgenaues Vermindern der Restzeit aufsummiert.
Da summiert sich bei meinem Ticker auch nichts auf, wenn er - in diesem Fall - häufiger als 1x pro Sekunde aufgerufen wird. Deinen Code könnte man da einfach in die tick() Funktion reinschreiben.