MODE 2 — STOPWATCH
Easy · 45 min · Fast kostenlos
Ziel & Anwendung
Eine analoge Stoppuhr mit drei Servo-Zeigern: S1 zeigt Sekunden (0–60 s zyklisch), S2 Minuten (0–60 min) und S3 die gespeicherte Rundenzeit. JoystickButton startet/stoppt, EncoderButton speichert die Runden-Zeit. touch1 und touch2 gleichzeitig: Gesamt-Reset auf 0. Unbegrenzte Laufzeit.
- Millis-basierte Zeiterfassung mit Start/Stopp und Lap-Funktion aufbauen.
- Drei Servo-Zeiger für Sekunden, Minuten und Rundenzeit gleichzeitig steuern.
- Doppel-Touch-Reset (touch1+touch2 gleichzeitig) als sichere Reset-Geste implementieren.
Anschluss & Funktion
Motoren am Board
| Anschluss | Motor | Aufgabe |
|---|---|---|
| S1 | 180°-Servo | Sekunden-Zeiger (0–60 s zyklisch) |
| S2 | 180°-Servo | Minuten-Zeiger |
| S3 | 180°-Servo | Rundenzeit-Zeiger, hält bei Lap-Speicherung |
| S4 | 360°-Servo | Dreht durchgehend, solange die Uhr läuft |
| S5 | 360°-Servo | Gegenläufig zu S4, stoppt synchron |
| S6 | 180°-Servo | Fähnchen markiert gespeicherte Rundenzeit |
| STEPPER | Schrittmotor | Feine Zehntelsekunden-Anzeige |
| DC | DC-Motor | Kurze Vibration beim Speichern einer Runde |
Materialliste
- Kartonstreifen je ca. 10 × 2 cm als Zeiger (3 Stück)
- Rundes Zifferblatt aus Karton Ø 14 cm mit Sekunden- und Minutenmarkierungen
- Kleines Schildchen für Rundenzeit-Zeiger (S3)
- Filzstift für Skaleneinteilung (60 Striche für Sekunden/Minuten)
- Klebeband und Heißkleber
Step-by-Step Tutorial
Rundes Uhrenzifferblatt aufbauen
Runde Kartonscheibe (Ø 14 cm) mit 60 gleichmäßigen Strichen als Zifferblatt. S1 (Sekunden, langer Zeiger) zeigt zyklisch 0–60 s. S2 (Minuten, kurzer Zeiger) auf kleinerem Zifferblatt daneben: 0–60 min. S3 darunter als Rundenzeit-Zeiger.
Check: Runde Skala (Ø 14 cm) mit 60 Sekunden-Markierungen — S1 dreht einmal pro Minute durch
Tipp: 60 Sekundenstriche auf Halbkreis: alle 3° ein Strich. S1 überstreicht den vollen Hub in 60 Sekunden (1000 µs bei 0s, 2000 µs bei 60s, dann zurück).
Sekunden- und Minuten-Zeiger montieren
S1 und S2 mit Plastik-Horn bestücken. S1 langer Zeiger (10 cm), S2 kurzer Zeiger (7 cm). Beide auf rundem Zifferblatt. S3 (Rundenzeit) auf separatem kleinen Zifferblatt unten — zeigt gespeicherte Rundenzeit in Sekunden.
Check: S1 dreht bei 60 Sekunden einmal durch. S2 bewegt sich sichtbar nach 1 Minute.
Tipp: S1 Puls: map((int)sec % 60, 0, 60, 1000, 2000). S2 Puls: map(((int)sec / 60) % 60, 0, 60, 1000, 2000). Zyklisch mod 60.
Stepper als Zehntelsekunden-Zeiger aufbauen (optional)
Stepper mit kleinem Zeiger bestückt, der über eine feine Skala (0–99) fährt. Er zeigt Zehntelsekunden genauer an als die groben Servo-Zeiger — praktisch als 'Lupe' auf die laufende Zeit. S4 dreht durchgehend mit, solange die Stoppuhr läuft, S5 gegenläufig dazu — beide stoppen exakt synchron mit S1. S6 (kleines Fähnchen) markiert, ob überhaupt schon eine Rundenzeit gespeichert wurde.
Check: Stepper-Zeiger fährt eine feine Skala ab und zeigt genauer als die Servos, wie die Zeit gerade läuft
Tipp: Der Stepper fährt eine feste Position an statt sich frei zu drehen — wie ein Präzisions-Zeiger, der Zehntelsekunden auflöst.
Leichtgängigkeits-Test ohne Strom
S1 von Hand einmal vollständig durch drehen: keine Reibung? S2 und S3 frei? Stepper-Rädchen von Hand drehen: leicht? Erst dann einschalten.
Check: S1 dreht frei durch vollen Hub (einmal pro Minute). S2 und S3 drehen frei.
Tipp: S1-Zeiger muss sehr leichtgängig sein — er dreht jeden Minute einmal durch. Hebelarm maximal 10 cm, Papier-Zeiger.
MODE 2 aktivieren — Stoppuhr laufen lassen
Timer → MODE 2. JoystickButton: Start. S1 dreht Sekunden. Nach 60s: S1 zurück, S2 einen Schritt vor. EncoderButton: aktueller Zeit-Wert auf S3 eingefroren (Runde). JoystickButton erneut: Stopp (Zeit eingefroren). touch1+touch2: Reset.
Check: JoystickButton: Start. S1 dreht Sekunden. S2 dreht langsam Minuten. EncoderButton: Runde speichern.
Tipp: touch1+touch2 gleichzeitig: Reset auf 0. Display zeigt Sekunden, Lap-Zeit und Running-Status.
Rundenzeiten messen
Stoppuhr laufen lassen. EncoderButton beim Rundenwechsel drücken: S3 friert auf aktuelle Zeit ein. Weiter laufen lassen. EncoderButton erneut: neue Rundenzeit auf S3. Gesamtzeit läuft unbeeinflusst weiter.
Check: EncoderButton-Druck friert Rundenzeit ein. Nächste Runde: EncoderButton erneut für neue Rundenzeit.
Tipp: Rundenzeit S3 wird überschrieben bei jedem EncoderButton-Druck — nur letzter Wert gespeichert (kein Ringpuffer).
Troubleshooting
- S1 dreht nicht zyklisch — bleibt bei 2000 µs stehen nach 60 Sekunden — map((int)sec % 60, ...) muss Modulo-60-Berechnung nutzen. sec ist float — (int)sec konvertiert zu int für Modulo-Operation. Nach 60 Sekunden: sec=60, (int)60 % 60 = 0 → S1 springt zurück zu 1000 µs.
- Reset (touch1+touch2) wird ständig ausgelöst — touch1 und touch2 beide konstant aktiv? Touch-Pads prüfen ob sie dauerhaft leiten. Getrennte Pads sicherstellen — nicht zu nahe beieinander.
Modifikationen & Sicherheit
- Pro-Tipp: S3 als bestes Rundenzeit-Zeiger — nur aktualisieren wenn neue Runde schneller als gespeicherte (Bestzeit-Funktion).
- Erweiterung: Zwei Stoppuhren parallel: eine für gesamt, eine für Runde — per toggle zwischen zwei Zuständen.
- Sicherheit: Millis()-Überlauf nach ~49,7 Tagen (nicht relevant für normale Nutzung).
Wichtige Code-Teile
// JoystickButton: Start/Stopp
if(isButtonPressed(JoystickButton, lastJoyBtn1)) {
if(!swRunning) { swRunning = true; swStart = millis() - swElapsed; }
else { swRunning = false; swElapsed = millis() - swStart; }
}
if(swRunning) swElapsed = millis() - swStart;
// EncoderButton: Rundenzeit speichern
if(isButtonPressed(EncoderButton, lastEncBtn1)) lapTime = swElapsed;
// touch1+touch2: Reset
if(touch1 && touch2) { swElapsed = 0; swStart = millis(); lapTime = 0; }
float sec = swElapsed / 1000.0f;
// S1: Sekunden (zyklisch 0-60)
servocontroller.setServoPulse(1, map((int)sec % 60, 0, 60, 1000, 2000));
// S2: Minuten (zyklisch 0-60)
servocontroller.setServoPulse(2, map(((int)sec / 60) % 60, 0, 60, 1000, 2000));
// S3: Rundenzeit
servocontroller.setServoPulse(3, map((int)(lapTime/1000.0f) % 60, 0, 60, 1000, 2000));
// S4/S5: drehen synchron mit dem Lauf-Status
servocontroller.setServoPulse(4, swRunning ? 1700 : 1500);
servocontroller.setServoPulse(5, swRunning ? 1300 : 1500);
// S6: Fähnchen zeigt gespeicherte Runde, DC: kurze Vibration beim Speichern
servocontroller.setServoPulse(6, lapTime > 0 ? 2000 : 1000);
if(isButtonPressed(EncoderButton, lastEncBtn1)) setMotorspeed(40);Ähnliche Projekte
- MODE 1 — COUNTDOWN — Ein mechanischer Countdown-Timer: S1 zeigt die verbleibende Zeit als Zeiger, S2 dreht sich gegenläufig wie eine visülle Sanduhr. Encoder stellt die Zeit (5–600 Sekunden), JoystickButton startet oder stoppt. Bei Ablauf: S3 fährt auf Alarm-Fahne, Stepper vibriert als mechanischer Alarm und Buzzer ertönt dauerhaft.
- MODE 7 — SEQ DELAY — Drei Servo-Klappen öffnen sich nacheinander mit individuell einstellbaren Verzögerungen: d1, d2 und d3 können per Encoder und Touch-Auswahl frei konfiguriert werden. JoystickButton startet die Sequenz — perfekt als automatische Briefkasten-Sortierklappe, Staffelrennen-Startanlage oder Theatervorhang.
- MODE 9 — WORK/REST — Ein mechanischer Kurz-Pomodoro-Timer: S1 zeigt den Arbeitsphase-Fortschritt, S2 die Pause-Phase. Arbeitszeit (bis zu 2 Minuten) und Pausenzeit (bis zu 1 Minute) werden separat per Encoder und Touch eingestellt — DC-Motor läuft nur in der Arbeitsphase, BREATHING-Buzzer in der Pause für ruhiges Atemrhythmus-Signal.