# Problem mit Countdown Timer

**URL:** <https://forum.arduino.cc/t/problem-mit-countdown-timer/1351760>\
**Category:** Deutsch\
**Created:** [February 8, 2025, 3:47pm UTC](https://forum.arduino.cc/t/problem-mit-countdown-timer/1351760 "2025-02-08T15:47:03Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![laurin\_e](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/laurin_e/32/1110802_2.png) [@laurin\_e](https://forum.arduino.cc/u/laurin_e)\
**Post date:** [February 8, 2025, 3:47pm UTC](https://forum.arduino.cc/t/problem-mit-countdown-timer/1351760/1 "2025-02-08T15:47:03Z")

</div>

Hallo alle

Ich versuche einen Countdown Timer mit einem Arduino Mega zu realisieren. Ziel ist, dass ich mit einem Rotary Switch eine Anzahl Minuten setzen kann. Nach einem Tastendruck soll dann auf dem Display die Minuten und Sekunden abgezählt werden und bei 00:00 eine Aktion ausgeführt werden. Leider scheitere ich bereits bei dem millis(). Wieso zählt der nachfolgende Code von 26 Sekunden rückwärts? Vorgesehen wären 20 Minuten.

```arduino
unsigned long seconds;
unsigned long minutes;

void setup() {

Serial.begin(9600);
}

void loop() {

static unsigned long startTime = millis();
static unsigned long TargetTime = startTime + (20*60*1000); // plus 20 minutes

seconds = (TargetTime - millis()) / 1000;
minutes = seconds / 60;
seconds = seconds % 60;
minutes = minutes % 60;

Serial.println("minutes");
Serial.println(minutes);
Serial.println("seconds");
Serial.println(seconds);

}

```

---

<div class="post-metadata">

**Author:** ![combie](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/combie/32/217369_2.png) [@combie](https://forum.arduino.cc/u/combie)\
**Post date:** [February 8, 2025, 4:32pm UTC](https://forum.arduino.cc/t/problem-mit-countdown-timer/1351760/2 "2025-02-08T16:32:35Z")

</div>

> [@laurin\_e](#):
>
> ` (20*60*1000)`

Testprogramm:

```arduino
#include <Streaming.h> // die Lib findest du selber ;-)
Print &cout = Serial; // cout Emulation für "Arme"

void setup() 
{
  Serial.begin(9600);
  cout << F("Interval: ") << (20*60*1000) << endl;
}

void loop() 
{

}

```

Ausgabe:

```arduino
Interval: 20352

```

Ich nehme an, dass du was anderes beabsichtigt hast.

Ach ja eine Meldung kommt da auch noch:

```arduino
E:\Programme\arduino\portable\sketchbook\sketch_feb08d\sketch_feb08d.ino: In function 'void setup()':
E:\Programme\arduino\portable\sketchbook\sketch_feb08d\sketch_feb08d.ino:8:36: warning: integer overflow in expression of type 'int' results in '20352' [-Woverflow]
    8 | cout << F("Interval: ") << (20*60*1000) << endl;
      | ~~~~~^~~~~

```

---

<div class="post-metadata">

**Author:** ![Rentner](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/rentner/32/601027_2.png) [@Rentner](https://forum.arduino.cc/u/Rentner)\
**Post date:** [February 8, 2025, 4:53pm UTC](https://forum.arduino.cc/t/problem-mit-countdown-timer/1351760/3 "2025-02-08T16:53:47Z")

</div>

Hallo,  
@combie hat Dir ja bereits gezeigt woran es liegt. Du musst dafür sorgen das die Berechnung  
`(20*60*1000)`  
nicht als eine Integer Berechnung gemacht wird. Das kannst Du erreichen in dem Du mindestens einen Wert als 32 bit Wert angibst.

```arduino
static unsigned long TargetTime = startTime + (20*60*1000UL); 

```

---

<div class="post-metadata">

**Author:** ![combie](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/combie/32/217369_2.png) [@combie](https://forum.arduino.cc/u/combie)\
**Post date:** [February 8, 2025, 5:26pm UTC](https://forum.arduino.cc/t/problem-mit-countdown-timer/1351760/4 "2025-02-08T17:26:56Z")

</div>

Nicht nur das!  
Auch verursacht die Addition prinzipiell irgendwann einen Überlauf, welcher nicht kompensiert wird.

---

<div class="post-metadata">

**Author:** ![Doc\_Arduino](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/doc_arduino/32/215810_2.png) [@Doc\_Arduino](https://forum.arduino.cc/u/Doc_Arduino)\
**Post date:** [February 8, 2025, 5:55pm UTC](https://forum.arduino.cc/t/problem-mit-countdown-timer/1351760/5 "2025-02-08T17:55:30Z")

</div>

Hallo,

> [@Rentner](#):
>
> `static unsigned long TargetTime = startTime + (20*60*1000UL); `

Ich würde mir angewöhnen immer das erste Literal zu casten. Sonst gehts irgendwann doch wieder schief.

---

<div class="post-metadata">

**Author:** ![combie](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/combie/32/217369_2.png) [@combie](https://forum.arduino.cc/u/combie)\
**Post date:** [February 8, 2025, 6:06pm UTC](https://forum.arduino.cc/t/problem-mit-countdown-timer/1351760/6 "2025-02-08T18:06:15Z")

</div>

Oder alle mit dem Suffix versehen, denn kostet ja nix und sorgt dafür, dass man nicht auf die Operatoren Rangfolge achten muss.  
(ein + ist schnell übersehen)

---

<div class="post-metadata">

**Author:** ![laurin\_e](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/laurin_e/32/1110802_2.png) [@laurin\_e](https://forum.arduino.cc/u/laurin_e)\
**Post date:** [February 8, 2025, 6:48pm UTC](https://forum.arduino.cc/t/problem-mit-countdown-timer/1351760/7 "2025-02-08T18:48:07Z")

</div>

Irgendwie ist wirklich der Wurm drin. Wenn ich den Countdown auf z.B. 20Min stelle, zählt er in der Sekundenstelle jede zweite Minute in 10er Schritten von 100 runter, statt von 59 auf 0.

---

<div class="post-metadata">

**Author:** ![combie](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/combie/32/217369_2.png) [@combie](https://forum.arduino.cc/u/combie)\
**Post date:** [February 8, 2025, 7:07pm UTC](https://forum.arduino.cc/t/problem-mit-countdown-timer/1351760/8 "2025-02-08T19:07:43Z")

</div>

Der Kopf ist rund, damit....

```arduino
constexpr unsigned long interval = 20ul * 60ul * 1000ul;
unsigned long startTime;

void setup()
{
  Serial.begin(9600);
  unsigned long startTime = millis();
}

void loop()
{
  unsigned long difTime = millis() - startTime;
  if(difTime >= interval)
  {
    Serial.println("Zielzeit erreicht.");
    Serial.println("Restart");
    startTime = millis();
    difTime = 0;
  }

  unsigned long seconds = (interval - difTime) / 1000;
  unsigned long minutes = seconds / 60;
  seconds %= 60;
  minutes %= 60;

  Serial.print("minutes ");
  Serial.println(minutes);
  Serial.print("seconds ");
  Serial.println(seconds);
  Serial.println("..............");
  delay(500);
}

```

---

<div class="post-metadata">

**Author:** ![laurin\_e](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/laurin_e/32/1110802_2.png) [@laurin\_e](https://forum.arduino.cc/u/laurin_e)\
**Post date:** [February 8, 2025, 7:30pm UTC](https://forum.arduino.cc/t/problem-mit-countdown-timer/1351760/9 "2025-02-08T19:30:25Z")

</div>

Danke combie für deinen Code! Der Interval soll ja variabel sein. Wie kann ich einer unsigned long Variabel das Suffix "ul" anhängen? Also damit alle Werte 32 Bit haben.

---

<div class="post-metadata">

**Author:** ![combie](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/combie/32/217369_2.png) [@combie](https://forum.arduino.cc/u/combie)\
**Post date:** [February 8, 2025, 8:06pm UTC](https://forum.arduino.cc/t/problem-mit-countdown-timer/1351760/10 "2025-02-08T20:06:47Z")

</div>

> [@laurin\_e](#):
>
> Wie kann ich einer unsigned long Variabel das Suffix "ul" anhängen?

Gar nicht!  
Gibts auch keinen Grund für.

Das funktioniert nur an Literalen.  
So stehts im Grundlagen Buch!  
Und so ist es auch richtig.

---

<div class="post-metadata">

**Author:** ![Doc\_Arduino](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/doc_arduino/32/215810_2.png) [@Doc\_Arduino](https://forum.arduino.cc/u/Doc_Arduino)\
**Post date:** [February 8, 2025, 8:13pm UTC](https://forum.arduino.cc/t/problem-mit-countdown-timer/1351760/11 "2025-02-08T20:13:24Z")

</div>

Hallo,

> [@laurin\_e](#):
>
> Wie kann ich einer unsigned long Variabel das Suffix "ul" anhängen?

Geht nicht, sie ist ja schon **U** nsigned **L** ong.  
Literale sind default vom Datentyp _int_. Auf unseren 8Bit AVR Controllern int16\_t.  
Deswegen muss man aufpassen mit Formeln und Literalen nicht den Wertebereich zu überschreiten. Das Suffix legt den Datentyp vom Literal fest. Eben einen anderen als default _int_. Eine andere Möglichkeit sind cast Operatoren.

---

<div class="post-metadata">

**Author:** ![laurin\_e](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/laurin_e/32/1110802_2.png) [@laurin\_e](https://forum.arduino.cc/u/laurin_e)\
**Post date:** [February 8, 2025, 8:15pm UTC](https://forum.arduino.cc/t/problem-mit-countdown-timer/1351760/12 "2025-02-08T20:15:37Z")

</div>

Dann ersetze ich 20ul mit meiner Minuten-Variable vom Typ unsigned long. Muss das constexpr weg?

---

<div class="post-metadata">

**Author:** ![Doc\_Arduino](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/doc_arduino/32/215810_2.png) [@Doc\_Arduino](https://forum.arduino.cc/u/Doc_Arduino)\
**Post date:** [February 8, 2025, 8:25pm UTC](https://forum.arduino.cc/t/problem-mit-countdown-timer/1351760/13 "2025-02-08T20:25:57Z")

</div>

Hallo,

alles was veränderlich sein soll darf nicht konstant sein. 😉

Man könnte aus:  
`constexpr unsigned long interval = 20ul * 60ul * 1000ul;`

machen:  
`unsigned long factor {20};`  
`constexpr unsigned long konstanterAusdruck {60ul * 1000ul};`  
`unsigned long interval {factor * konstanterAusdruck};`

oder so ähnlich. _factor_ und _interval_ sind damit zur Laufzeit veränderlich.

---

<div class="post-metadata">

**Author:** ![laurin\_e](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/laurin_e/32/1110802_2.png) [@laurin\_e](https://forum.arduino.cc/u/laurin_e)\
**Post date:** [February 9, 2025, 10:10am UTC](https://forum.arduino.cc/t/problem-mit-countdown-timer/1351760/14 "2025-02-09T10:10:11Z")

</div>

Moin zusammen

Hab den Code entsprechend dem Vorschlag von combie geändert. Es funktioniert soweit, bis auf dass die Anzeige auf dem Display suboptimal ist. Die Minuten und Sekunden "rutschen", d.h. z.B. jeweils von 9 Sekunden bis 0 Sekunden werden 90, 80, 70 usw. angezeigt. Hab schon versucht das Ganze mit sprintf und einem Buffer zu printen, funktioniert aber irgendwie nicht.  
Hier die neue Funktion CountdownTime:

```arduino
void CountdownTime() {

  unsigned long factor{ newPos };
  constexpr unsigned long constExpression{ 60ul * 1000ul };
  unsigned long interval {factor* constExpression};
  
  unsigned long difTime = millis() - startTime;
  if (difTime >= interval) {
    Serial.println("Zielzeit erreicht.");
    Serial.println("Restart");
    tft.setCursor(240, 210);
    tft.print(" ");
    startTime = millis();
    difTime = 0;
    Countdown = false;
  }
  unsigned long seconds = (interval - difTime) / 1000;
  unsigned long minutes = seconds / 60;
  seconds %= 60;
  minutes %= 60;

  tft.setCursor(240, 210);
  Serial.println("Interval:");
  Serial.println(interval);
  Serial.println("Minutes");
  Serial.println(minutes);
  tft.print(minutes);
  tft.print(":");
  Serial.println("Seconds");
  Serial.println(seconds);
  tft.print(seconds);
  //tft.print(".................");
}

```

---

<div class="post-metadata">

**Author:** ![laurin\_e](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/laurin_e/32/1110802_2.png) [@laurin\_e](https://forum.arduino.cc/u/laurin_e)\
**Post date:** [February 9, 2025, 10:50am UTC](https://forum.arduino.cc/t/problem-mit-countdown-timer/1351760/15 "2025-02-09T10:50:01Z")

</div>

Ich konnts nun doch lösen mit sprintf. Sorry!

---

<div class="post-metadata">

**Author:** ![uwefed](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/uwefed/32/213736_2.png) [@uwefed](https://forum.arduino.cc/u/uwefed)\
**Post date:** [February 9, 2025, 11:46am UTC](https://forum.arduino.cc/t/problem-mit-countdown-timer/1351760/16 "2025-02-09T11:46:53Z")

</div>

> [@laurin\_e](#):
>
> Die Minuten und Sekunden "rutschen", d.h. z.B. jeweils von 9 Sekunden bis 0 Sekunden werden 90, 80, 70 usw. angezeigt.

Einfache Lösung ist bei zahlen kleiner 10 ein Leerzeichen vorher drucken.

```arduino
Serial.print("minutes ");
if(minutes < 10) Serial.println(" ");
Serial.println(minutes);

```

Grüße Uwe

---

<div class="post-metadata">

**Author:** ![combie](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/combie/32/217369_2.png) [@combie](https://forum.arduino.cc/u/combie)\
**Post date:** [February 9, 2025, 1:31pm UTC](https://forum.arduino.cc/t/problem-mit-countdown-timer/1351760/17 "2025-02-09T13:31:23Z")

</div>

> [@laurin\_e](#):
>
> konnts nun doch lösen

Schön, dass es jetzt tut!

Wichtig war die TargetTime Berechnung.  
Einmal die Addition dort, wg. dem drohnden den Überlauf, und die int Multiplikation mit ihrem eigenen Überlauf.

Weniger wichtig, und immer noch vorhanden, ist folgendes:  
Die Funktion tut zuviel.

Grundsätzlich sollte eine Funktion nur eine Sache machen.  
Dann sollte eine Funktion weder statische Variablen im Bauch haben, noch auf externe bzw. globale Daten zugreifen.  
Alles was die Funktion braucht sollte man als Parameter übergeben.  
Ergebnisse werden per return übergeben.  
Rückgabe über Referenzen ist halbwegs OK, da man das anhand der Funktionssignatur halbwegs gut erkennen kann.

Die Gründe sind:

1. Testbarkeit
2. Übersicht
3. Wartbarkeit
4. Wiederverwendung

---

<div class="post-metadata">

**Author:** ![laurin\_e](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/laurin_e/32/1110802_2.png) [@laurin\_e](https://forum.arduino.cc/u/laurin_e)\
**Post date:** [February 23, 2025, 2:11pm UTC](https://forum.arduino.cc/t/problem-mit-countdown-timer/1351760/18 "2025-02-23T14:11:32Z")

</div>

Hallo Leute  
Ich hab nun doch noch ein neues Problem. Wenn ich den rotary encoder von 0 rückwärts, also gegen den Uhrzeiger drehe, steht plötlich 429496 aufm Display. Und diese hinteren Zahlen gehen auch nicht mehr weg, wenn ich wieder über 0 hochdrehe..

---

<div class="post-metadata">

**Author:** ![my\_xy\_projekt](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/my_xy_projekt/32/810062_2.png) [@my\_xy\_projekt](https://forum.arduino.cc/u/my_xy_projekt)\
**Post date:** [February 23, 2025, 2:19pm UTC](https://forum.arduino.cc/t/problem-mit-countdown-timer/1351760/19 "2025-02-23T14:19:34Z")

</div>

42 ist immer die Lösung.

---

<div class="post-metadata">

**Author:** ![Doc\_Arduino](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/doc_arduino/32/215810_2.png) [@Doc\_Arduino](https://forum.arduino.cc/u/Doc_Arduino)\
**Post date:** [February 23, 2025, 2:33pm UTC](https://forum.arduino.cc/t/problem-mit-countdown-timer/1351760/20 "2025-02-23T14:33:27Z")

</div>

Hallo,

ganz pauschal, du hast eine Wertebereichsüberschreitung. Das ist erstmal etwas völlig normales. Du musst für dich den gültigen Wertebereich festlegen und alles was drunter oder drüber liegt korrigieren oder begrenzen. Je nachdem was du mit den Werten machen möchtest.

Display. Das Verhalten ist auch normal. Du musst alle Ziffern überschreiben. Du weißt wieviele Digits maximal angezeigt werden. Diese Anzahl musst du immer schreiben. Damit "löschen" sich alte Zahlen wie von selbst. Komme **nicht** auf die Idee jedesmal das gesamte Display zu löschen.

[Next page](https://forum.arduino.cc/t/problem-mit-countdown-timer/1351760.md?page=2)
