Last Updated on 4. Oktober 2026 by sfambachLink-Status: OK
Beim Mittagessen mit den Kollegen ist mir eine Idee gekommen. Die beiden spielen Schach während der Mittagspause und um das Ganze etwas spannender zu gestalten, habe ich eine Schachuhr vorgeschlagen.
Somit ist die Idee entstanden, eine Schachuhr bestehend aus zwei Anzeigen für die jeweilige Uhrzeit, zwei Knöpfen zum Starten und Stoppen der Uhrzeit sowie einem Arduino für die Steuerung zu bauen.
Funktionsweise der Uhr
Eine Schachuhr besteht meist aus zwei Uhrwerken, die gegeneinander verriegelt sind. Jedes Uhrwerk zählt die Zeit, die ein Spieler braucht, um seinen Zug zu machen. Ist ein Spieler mit seinem Zug fertig, drückt er einen Knopf, die eigene Uhr stoppt und die des Gegners zählt weiter.
Ich hatte gleich viele zusätzliche Ideen für solch eine Uhr und wie das mit großen Mengen an Ideen so ist, bleiben diese meist eine und werden nie umgesetzt. Also habe ich mich entschlossen, einen möglichst einfachen Aufbau zu wählen und die „Features“ auf später zu verschieben. Für die Schachuhr benötige ich folgende Bestandteile:
- Arduino Uno oder ähnlich
- Prototyp Platine
- 2x SSD 1306 Display
- 2x Taster (beliebig)
- Ein paar Pinheader Kabel für den Prototypen
Nachfolgend eine kurze Beschreibung der Funktion:
- Ein Spieler muss als erstes seine Taste drücken, um zu starten (Sagen wir Spieler 1 fängt an).
- Ist Spieler 1 mit seinem Zug fertig, drückt er seinen Knopf (Taster 1)
- Die Uhr von Spieler 1 hält an und die von Spieler 2 läuft los.
- Ist Spieler 2 mit seinem Zug fertig, drückt er seinen Knopf (Taster 2).
- Die Uhr von Spieler 2 hält an und die von Spieler 1 läuft weiter
- … usw. Ein langes Drücken (5 sec) beider Tasten setzt beide Uhren auf den Start (12:00 Uhr) zurück.
Vorarbeiten
Ich verwende zwei SSD 1306 128×64 Pixel Displays. Wenn man keine Displays mit unterschiedlicher Adresse besitzt, ist ein kleiner Umbau des 2. Displays nötig. In meinem Fall war es nötig, einen SMD Widerstand auf der Rückseite umzulöten. Damit wird die Adresse des Displays von 0x3C auf 0x3D geändert:

Praktischer sind Displays mit Jumpern, da die SMD-Löterei ein ganz schönes „Gefriemel“ ist.
Entwicklung
Hier müssen einige Komponenten und Bibliotheken zusammenarbeiten, deshalb bin ich in zwei Schritten vorgegangen. Als erstes wurde ein einfacher Versuchsaufbau mit einem Display realisiert. Dieser wurde dann im zweiten Schritt auf die beschriebene Gesamtfunktionalität erweitert.
Erster Display-Test
Im ersten Schritt wird über einen Timer das Display angesteuert, ein Taster ermöglicht das Zurücksetzen auf 0. Hier galt es herauszufinden, wie das Display die analoge Uhr anzeigt und wie der Timer zu implementieren ist.
Bibliotheken
Für die Display Ansteuerung werden die folgenden beiden Bibliotheken verwendet. Ich habe das SSD1306 Display schon einmal getestet, den Beitrag findet ihr hierLink-Status: OK.
https://github.com/adafruit/Adafruit-GFX-LibraryLink-Status: OK
https://github.com/adafruit/Adafruit_SSD1306/blob/master/Adafruit_SSD1306.cppLink-Status: OK
Verkabelung

Programmierung
Nachfolgend der Link zum Download des fertigen Programms. Evtl. muss die Adresse des Displays angepasst werden.
So sieht es aus

Mit zwei Displays
Es folgt die Ansteuerung des 2. Displays. Der zweite Taster vervollständigt die Schachuhr. Zusätzlich kommt der Wechsel der beiden Timer und die Reset-Funktion hinzu.
Bibliotheken
Die Bibliotheken sind die gleichen. Ich musste jedoch die Adafruit_SSD1206.h anpassen. Damit für beide Displays nur einmal der Speicher für den Bildschirm reserviert wird, habe ich die buffer Variable auf static gesetzt. Der Grund hierfür ist, ich hatte versucht, die Bibliothek so zu verwenden, wie sie ist, allerdings reichte der Speicher meines Arduino Unos dafür nicht aus.
Verkabelung

Programmierung
Hier kann das Programm heruntergeladen werden, ich habe es um den zweiten Taster sowie das zweite Display erweitert und hierfür die Funktionen noch etwas angepasst.
So sieht es aus
Serienreife 😉
Nach prototypischen Tests mit den Kollegen habe ich alles mal in ein Gehäuse gepackt. Bei den Tests hat sich herausgestellt, dass eine Stop Taste von Vorteil wäre. Diese plus einen An/Aus Schalter habe ich hinzugefügt. Zusätzlich gibts ein Batteriefach.
Da die Taster manchmal nur zögerlich reagieren, hätte ich diese gerne per Interrupt abgefragt. Der Arduino bietet nur zwei Interrupts, diese liegen auf Pin 2 und 3. Leider habe ich die Kabel für die Taster schon angelötet und das Gehäuse verklebt, so dass ich zur Besserung nur das Delay von 200 Millisekunden rausgenommen habe.
So sieht es nun aus
Hier der endgültige Code:
Fazit
Die Uhr funktioniert, auch wenn es sicherlich besser geht. Nachdem ich sie in ein Gehäuse eingebaut habe, sieht sie auch etwas besser aus ;).
Ausblick
Hier noch ein paar Ideen, die ich hatte, aber wegen Zeitmangel nicht umgesetzt habe:
- Man kann eine maximale Zeit vorgeben
- Ausprägung 1 ab dann gibt es Minuspunkte
- Ausprägung 2 der Zug ist um
- Zusatz: Die jeweilige Uhr warnt n Minuten vor Ablauf der Zeit
- ein Bildschirm flackert
- es erklingt ein Ton
- Ticken der Sekunden auf Buzzer/Lautsprecher ausgeben
- Umsetzung mit einem ESP anstatt eines Arduinos und einer Statistik Website, welche die Zeiten auswertet. Per Handy (WLAN) ist diese anzeigbar.
- …
Probleme
Reset löst selbst aus
Ich hatte das Problem bei pinMode(RESET1, INPUT), dass der Reset manchmal einfach so ausgelöst hat. Deshalb habe ich den Code auf pinMode(RESET1, INPUT_PULLUP) umgestellt und frage den Taster mit !digitalRead(RESET1) ab. Dies funktioniert bis jetzt ohne Fehler.
2. Display zeigt nichts an oder Init schlägt fehl
Der Arduino Uno hat nicht genügend Speicher, um beide Displays zu betreiben. Ich habe in Adafruit SSD1306 Lib in den Projekt Ordnern ein paar Änderungen vorgenommen, so dass der Bildschirmbuffer nur einmal initialisiert wird (static uint8_t *buffer). Dies hat bei mir gereicht, um das zweite Display zu betreiben.
Verwandte Beiträge
- Rundes 1,28″-TFT GC9A01 an ESP8266, ESP32 und ESP32-C3Link-Status: OK
- Ulanzi TC001 Smart Pixel ClockLink-Status: OK
- ESP8266 Bunte Wetterstation AZSMZ V1.8Link-Status: OK
- D1 Mini Shield – RGB LED (Einzeln)Link-Status: OK
- Preview – Heltec Cube Cell Board mit LoRa WanLink-Status: OK
- D1 Mini Shield – RGB LEDLink-Status: OK
- D1 Mini Shield – I2C ConnectorLink-Status: OK
- D1 Mini Shield – Matrix LED ShieldLink-Status: OK
- D1 Mini Shield – Oled 64×48Link-Status: OK
- D1 Mini Shield – Buzzer (Pipser)Link-Status: OK
Quellen
https://forum.arduino.cc/index.php?topic=248603.0Link-Status: Unbekannt
https://github.com/adafruit/Adafruit_SSD1306Link-Status: Unbekannt
https://github.com/adafruit/Adafruit-GFX-LibraryLink-Status: OK
https://michaelsarduino.blogspot.com/2016/02/oled-analog-uhr.htmlLink-Status: Unbekannt
https://github.com/bitbank2/Multi_OLEDLink-Status: Unbekannt
| Datum | Änderung | Autor |
|---|---|---|
| 04.10.2026 | Rechtschreibung korrigiert: Tippfehler, Kommas, Grammatik | sfambach |
| 03.10.2026 | Log-Liste eingefügt | sfambach |
| 04.06.2019 | Beitrag erstellt | sfambach |


