Einfacher Arduino-Stoppuhr: Taster-gesteuerter Chronometer
Benötigte Komponenten
| Arduino UNO (oder kompatibel) | 1 |
| Taster (nicht rastend) mit Pull-Down-Widerstand (1 kΩ) | 1 |
| Widerstand 10 kΩ | 1 |
Software
- Arduino IDE
Projektbeschreibung
Für ein spaßiges Projekt benötigte ich einen Arduino-Chronometer, der startet, sobald ein Taster gedrückt wird, und stoppt, wenn er losgelassen wird. Keine komplexe Sache, aber der Code spart anderen vielleicht eine Stunde Entwicklungszeit.
Besonderheiten: Nutzung des EEPROM (nicht-flüchtiger Speicher) zum Speichern der letzten gemessenen Zeit und Interrupts für präzise Taster-Erkennung ohne Polling.
EEPROM

Der EEPROM behält Daten auch nach Stromausfall oder Reset. Die Bibliothek #include <EEPROM.h> ist standardmäßig installiert. Ich nutze Adresse 0 (Float = 4 Bytes) – der Uno bietet 1024 Bytes (ATmega328).
Interrupts

Interrupts unterbrechen den Hauptprogrammfluss, wenn ein Pin seinen Pegel ändert (z. B. LOW → HIGH). Keine zusätzliche Bibliothek nötig. Der Taster ist an Pin 2 (Interrupt-fähig) angeschlossen, mit Pull-Down-Widerstand auf LOW gehalten.

Projekt-Code
Definitionen & Includes
#include <EEPROM.h>
#define interruptPin 2
#define eeAddress 0 // EEPROM-Adresse für Zeit-Speicherung
float starttime = 0;
float endtime = 0;
float resulttime = 0, oldresulttime = 0;
setup()
void setup() { Serial.begin(9600); while (!Serial) { ; } // Warten auf Serial (nur bei nativem USB) Serial.println("Serial comms ready!"); attachInterrupt(digitalPinToInterrupt(interruptPin), refreshTime, CHANGE); }
attachInterrupt(..., CHANGE)löst bei jeder Flanke aus: Drücken (LOW→HIGH) und Loslassen (HIGH→LOW).loop()
void loop() { // Hier Platz für eigenen Code // In 'resulttime' (bzw. EEPROM) steht die letzte gemessene Zeit in ms }Interrupt-Service-Routine: refreshTime()
void refreshTime() { if (digitalRead(interruptPin)) { // Rising Edge: Taster gedrückt starttime = millis(); Serial.print("Start time: "); Serial.println(starttime); } else { // Falling Edge: Taster losgelassen endtime = millis(); resulttime = endtime - starttime; Serial.print("End time: "); Serial.println(endtime); Serial.print("Result time: "); Serial.println(resulttime); WhatsNewEeprom(); // In EEPROM speichern } }EEPROM-Prüfung & Speichern
void WhatsNewEeprom() { Serial.println("--- checking eeprom"); EEPROM.get(eeAddress, oldresulttime); Serial.print("old: "); Serial.println(oldresulttime); Serial.print("new: "); Serial.println(resulttime); if (resulttime != oldresulttime) { EEPROM.put(eeAddress, resulttime); Serial.print("--- Ding! New time stored: "); Serial.println(resulttime); } else { Serial.println("No change, eeprom untouched"); } }Entprellen des Tasters (Debouncing)
Menschen sind für Arduino langsam: Ein Tastendruck erzeugt mehrfaches Prellen (HIGH-LOW-HIGH...). Lösungen:
- Software: Wartezeit nach Flanke (z. B. 50 ms)
- Hardware: Kondensator (z. B. 220 nF) parallel vom Sense-Pin nach GND – „frisst“ schnelle Spannungsschwankungen.

Ich nutze die Hardware-Lösung mit 220 nF.
Kompletter Code
// coded by Javier Muñoz 23/10/2017
// questions to javimusama@gmail.com
#include <EEPROM.h>
#define interruptPin 2
#define eeAddress 0
float starttime = 0, endtime = 0, resulttime = 0, oldresulttime = 0;
void setup() {
Serial.begin(9600);
while (!Serial) { ; }
Serial.println("Serial comms are ready sir!:.. bip bip");
attachInterrupt(digitalPinToInterrupt(interruptPin), refreshTime, CHANGE);
}
void loop() {
// your stuff here
}
void refreshTime() {
if (digitalRead(interruptPin)) {
starttime = millis();
Serial.print("Start time: "); Serial.println(starttime);
} else {
endtime = millis();
resulttime = endtime - starttime;
Serial.print("End time: "); Serial.println(endtime);
Serial.print("Result time: "); Serial.println(resulttime);
WhatsNewEeprom();
}
}
void WhatsNewEeprom() {
Serial.println("-----------checking eeprom");
EEPROM.get(eeAddress, oldresulttime);
Serial.print("oldresulttime"); Serial.println(oldresulttime);
Serial.print("resulttime"); Serial.println(resulttime);
if (resulttime != oldresulttime) {
EEPROM.put(eeAddress, resulttime);
Serial.print("-----Ding! New time recorded: "); Serial.println(resulttime);
} else {
Serial.println("No new time found, eeprom was not disturbed");
}
}
Schaltplan
Einfache Taster-Schaltung mit Pull-Down-Widerstand (1 kΩ) an Pin 2.

Herstellungsprozess
- Stilvolle Wanduhr mit Adafruit 60-LED Neopixel-Ring & Arduino
- DIY Arduino Word Clock – Elegante Wortuhr mit RTC & Schieberegistern
- 20-kHz-Arduino-Oszilloskop mit Nokia 5110 LCD – Einfacher DIY-Bau
- Bluetooth-gesteuerter Arduino-Spybot bauen – Überwachungsroboter mit IP-Kamera
- FlickMote: Gestensteuerung per Ultraschall & IR für Smart Home (Arduino 101)
- DIY Arduino TV-B-Gone: Universelle TV-Aus-Fernbedienung
- Einen eigenen LED-Master-Clock mit Alarm bauen – aus 12 Metern Entfernung ablesbar
- Einfachen Hindernissensor mit Arduino bauen – IR-LED & Photodiode Tutorial
- Find Me: Smarter Gegenstands-Finder mit Arduino und Bluetooth
- Zuverlässigen Wecker mit DS1302 RTC und Arduino UNO bauen
