
Ziel des Projekts
Zunächst soll eine Stoppuhr programmiert werden, die nach jedem Tasterdruck die Stoppuhr neu startet und anschließend das Ergebnis anzeigt. Hier sollen die Sekunden noch in Minuten umgerechnet werden, wenn jeweils 60 Sekunden überschritten werden.

⇒ Stoppuhr Serieller Monitor
Benötigte Bauteile
- ⇒Taster
- ⇒4-zeiliges LCD mit I²C-Schnittstelle
- Leitungsdrähte
Der Schaltplan
(Fahre mit der Maus über das Bild, um die Bezeichnungen der Bauteile zu sehen)
Benötigte Bibliotheken
![]() | ![]() |
Das Programm
Stoppuhr
Binde die benötigten Bibliotheken ein und definiere die Variablen:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include "LiquidCrystal_I2C.h" #include "OneButton.h" int TASTER = 7; // Name des Tasters OneButton NameTaster(TASTER, true); // Name des LCDs LCDIC2 lcd(0x27, 20, 4); // Variablen der Zeit float StartZeit; float VerstricheneZeit; float Sekunden; bool Anzeige = true; // TasterStatus sorgt für Start/Neustart bool TasterStatus = true; |
Der setup-Teil startet das LCD und legt die benötigten Einstellungen für die Bibliothek OneButton fest.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
void setup() { lcd.init(); lcd.backlight(); lcd.setCursor(0, 0); lcd.print("Taste -> Start"); lcd.setCursor(0, 1); lcd.print("--------------------"); // Aktionen dem Modus des Tasters zuordnen NameTaster.attachClick(einKlick); // Standardwerte können anpasst werden // NameTaster.setPressTicks(500); // NameTaster.setClickTicks(200); // NameTaster.setDebounceTicks(50); } |
Der loop-Teil sorgt lediglich dafür, dass der Taster abgefragt wird:
|
1 2 3 4 5 6 |
void loop() { // Taster alle 10 Millisekunden abfragen NameTaster.tick(); delay(10); } |
Die Funktion einKlick() misst die Zeit und sorgt für die Ausgabe auf dem LCD:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
void einKlick() { if (TasterStatus) { StartZeit = millis(); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Taste - Stopp"); lcd.setCursor(0, 2); } else { // Zeit berechnen float Sekunden; VerstricheneZeit = millis() - StartZeit; Sekunden = VerstricheneZeit / 1000; String GesamtSekunden = String(Sekunden); // . durch , ersetzen GesamtSekunden.replace(".", ","); // Ausgabe im Seriellen Monitor Serial.println("Sekunden insgesamt: " + GesamtSekunden + " Sekunden"); // Minuten berechnen int Minute = int(Sekunden) / 60; // nur Ausgabe der Minuten wenn Minute > 0 if (Minute > 0) { // Ausgabe verschönern, wenn Minute > 1 -> Ausgabe "Minuten" // "Minute" if (Minute > 1) { lcd.setCursor(0, 2); lcd.print(String(Minute) + " Minuten "); } else { lcd.setCursor(0, 2); lcd.print(String(Minute) + " Minute "); } } // von Sekunden Anzahl der Minuten abziehen Sekunden = Sekunden - Minute * 60; // Sekunden in String umwandeln // damit . durch , ersetzt werden kann String AnzahlSekunden = String(Sekunden); // . durch , ersetzen AnzahlSekunden.replace(".", ","); // Ausgabe LCD lcd.setCursor(0, 0); lcd.print("Neustart -> Taste"); lcd.setCursor(0, 3); lcd.print(AnzahlSekunden + " Sekunden"); } // Tasterstatus umkehren TasterStatus = !TasterStatus; } |
Stoppuhr mit Rundenanzeige
Die Stoppuhr soll jetzt erweitert werden. Ein Druck auf den Taster startet die Stoppuhr, der nächste Druck stoppt sie. Es sollen vier Runden erfasst werden.
Ein Doppelklick auf den Taster zeigt die Ergebnisse der bisherigen Runden an, ein langer Druck startet die Stoppuhr wieder bei Runde eins.
Eine Stoppuhr für den Seriellen Monitor findest du ⇒hier.
Ergänze die Variablen:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#include "LiquidCrystal_I2C.h" #include "OneButton.h" int TASTER = 7; // Name des Tasters OneButton NameTaster(TASTER, true); // Name des LCDs LiquidCrystal_I2C lcd(0x27, 20, 4); // Variablen der Zeit float StartZeit; float VerstricheneZeit; float Sekunden; int AnzahlRunden = 1; // muss als Konstante definiert werden // -> Größe des Arrays darf nicht gändert werden const int RundenMax = 5; // Array Runden String RundenZeit[RundenMax]; // TasterStatus sorgt für Start/Neustart bool TasterStatus = true; bool Neustart = false; |
Im setup-Teil müssen die Aktionen für den Doppelklick und den langen Tasterdruck zusätzlich definiert werden:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
void setup() { lcd.init(); lcd.backlight(); lcd.setCursor(0, 0); lcd.print("Taste -> Start"); lcd.setCursor(0, 1); lcd.print("--------------------"); // Aktionen dem Modus des Tasters zuordnen NameTaster.attachClick(einKlick); NameTaster.attachDoubleClick(DoppelKlick); NameTaster.attachLongPressStop(langerDruckStopp); // Standardwerte können anpasst werden // NameTaster.setPressTicks(500); // NameTaster.setClickTicks(200); // NameTaster.setDebounceTicks(50); } |
Im loop-Teil gibt es keine Änderungen.
Die Funktion einKlick() wird ergänzt.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
void einKlick() { if (TasterStatus) { // beim Neustart Variablen auf Standard zurücksetzen // Rundenzeiten löschen if (Neustart) { AnzahlRunden = 1; // String leeren for (int i = 1; i < RundenMax; i++) { RundenZeit[i] = ""; } Neustart = false; } StartZeit = millis(); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Runde: " + String(AnzahlRunden)); lcd.setCursor(0, 1); lcd.print("Taste -> Stopp"); } else { // Zeit berechnen float Sekunden; VerstricheneZeit = millis() - StartZeit; Sekunden = VerstricheneZeit / 1000; // Sekunden in String umwandeln // damit . durch , ersetzt werden kann String AnzahlSekunden = String(Sekunden); // . durch , ersetzen AnzahlSekunden.replace(".", ","); // Ausgabe LCD lcd.clear(); lcd.print("Runde: " + String(AnzahlRunden)); lcd.setCursor(0, 1); lcd.print("Weiter -> Taste"); lcd.setCursor(0, 3); lcd.print(AnzahlSekunden + " Sekunden"); // letzte Runde -> Ergebnis anzeigen if (AnzahlRunden == RundenMax - 1) { RundenZeit[AnzahlRunden] = AnzahlSekunden; lcd.clear(); Neustart = true; DoppelKlick(); } else { RundenZeit[AnzahlRunden] = AnzahlSekunden; AnzahlRunden ++; } } // Tasterstatus umkehren TasterStatus = !TasterStatus; } |
Die Funktion DoppelKlick() zeigt das Ergebnis der Runden an, die Funktion langerDruckStopp() sorgt für den Neustart.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
void DoppelKlick() { lcd.clear(); int Zeile = 0; for (int i = 1; i <= RundenMax - 1; i++) { lcd.setCursor(0, Zeile); if (RundenZeit[i] != "") lcd.print(String(i) + ": " + RundenZeit[i] + " Sekunden"); Zeile ++; } } void langerDruckStopp() { AnzahlRunden = 1; TasterStatus = true; Neustart = true; lcd.clear(); lcd.setCursor(0, 0); lcd.print("Neustart: Runde 1"); } |
Ähnliche Projekte
- Analoge Uhr mit BME280 auf ESP32 mit 3,5 Zoll/4 Zoll TFT
- Analoge Uhr mit TFT 240×240 Pixeln und RTC-Modul
- Analoge Uhr mit TFT-Shield und BME280
- Datum und Zeit mit ESP und time.h anzeigen
- Datum und Zeit mit dem NTP-Protokoll auf einem OLED anzeigen
- DHT – Messdaten und Zeit auf TFT anzeigen
- Analoge Uhr mit TFT 240×240 Pixeln und WiFi
- Uhrzeit auf LED-Matrix anzeigen
- Zeit mit time.h auf einem TFT anzeigen
- Wecker mit RTC-Modul DS3231
Letzte Aktualisierung:




