
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.
So soll es aussehen:

⇒ Stoppuhr Serieller Monitor
Schließe das LCD an:


⇒LCD
Normalerweise wäre eine komplexe Verkabelung zum Betrieb eines LCDs nötig. Der ⇒I2C-Bus regelt über einen eigenen Mikroprozessor die Kommunikation der Datenleitungen untereinander. Es werden deshalb nur vier Anschlüsse benötigt.

Die Helligkeit kann mit einem Potentiometer auf der Rückseite des LCDs eingestellt werden.
Benötigte Bauteile:
- Taster
- 4‑zeiliges LCD mit I²C-Schnittstelle
- Leitungsdrähte
Baue die Schaltung auf.
(Fahre mit der Maus über das Bild, um die Bezeichnungen der Bauteile zu sehen)
Benötigte Bibliotheken:
![]() | ![]() |
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; } |
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.
So soll es aussehen:
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. Beachte die Kommentare.
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”); } |
Verwandte Anleitungen:
- Datum und Zeit mit ESP und time.h anzeigen
- Datum und Zeit mit dem NTP-Protokoll anzeigen
- DHT — Messdaten und Zeit auf TFT anzeigen
- Uhr mit TFT 240x240 Pixeln
- Zeit mit time.h auf einem TFT anzeigen
- Wecker mit einem RTC-Modul
- Zeit im Seriellen Monitor mit ESP-Mikrocontroller anzeigen
- Datum, Uhrzeit und Temperatur auf einem LCD mit einem RTC-Modul anzeigen
- Uhrzeit und Temperatur auf einem 4‑stelligen 7‑Segment-Modul anzeigen
- Zeit mit time.h auf einer 4‑stelligen 7‑Segment-Anzeige darstellen
Letzte Aktualisierung:









