Last Updated on 21. June 2019 by Suffocation
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 einen 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 seinen Zug fertig, drückt er einen Knopf, die eigenen 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, beleiben diese meist eine und werden nie umgesetzte. 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 SDD 1306 Display
- 2x Taster (beliebig)
- Ein paar Pinheader Kabel für den Prototypen
Nachfolgende eine kurze Beschreibung der Funktions:
- 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.
Preliminary work
Ich verwenden 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 um zu löte. Damit wird die Adresse des Displays von 0x3C auf 0x3D geändert:

Praktischer sind Displays mit Jumpern, da die SMD löterei ein ganzschönes „gefriemel“ ist.
Entwicklung
Hier müssen einige Komponenten und Bibliotheken zusammen arbeiten, deshalb bin ich in zwei Schritten vorgegangen. Als erstes wurde ein einfacher Versuchsaubau 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ücksetzten auf 0. Hier galt es heraus zu finden wie das Display die Analoge Uhr anzeigt und wie der Timer zu implementieren ist.
Libraries
Für die Display Ansteuerung werden die folgenden beiden Bibliotheken verwendet. Ich habe das SSD1306 Display schon einmal getestet den Beitrag findet ihr here.
https://github.com/adafruit/Adafruit-GFX-Library
https://github.com/adafruit/Adafruit_SSD1306/blob/master/Adafruit_SSD1306.cpp
Verkabelung

Programming
Nachfolgend der Link zum Download des fertigen Programms. Evtl. muss die Adresse des Displays angepasst werden.
This is what it looks like

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.
Libraries
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 Uno’s dafür nicht aus.
Verkabelung

Programming
Hier kann das Programm herunter geladen werden, ich habe es um den zweiten Taster sowie das zweite Display erweitert und hierfür die Funktionen noch etwas angepasst.


