Digitale Uhr mit Arduino & Endlicher Automat (State Machine)
Komponenten und Zubehör
| Arduino UNO (oder Mega, kompatibel zum LCD Shield) | × | 1 |
| LCD Keypad Shield (16×2, 5 Tasten + Reset) | × | 1 |
Software & Tools
- YAKINDU Statechart Tools (kostenlos für nicht-kommerzielle Nutzung)
- Eclipse C++ IDE für Arduino
Projektbeschreibung
Eine **digitale Armbanduhr** (wie in den 90ern) mit Arduino und LCD-Keypad-Shield umsetzen – modelliert als **endlicher Automat (Finite State Machine)** mit **YAKINDU Statechart Tools**. Das Original-Modell stammt von David Harel (Statecharts-Papier).
Funktionsumfang der Uhr
Eingaben: On/Off, Mode, Set, Light On, Light Off
Modi (per Mode-Taste durchschalten):
- Uhrzeit anzeigen (Clock)
- Datum anzeigen (Date)
- Wecker 1 / Wecker 2 einstellen (Alarm 1, Alarm 2)
- Stundenschlag ein/aus (Chime)
- Stoppuhr (Stop Watch) mit Rundenzähler
Im Menü: On/Off konfiguriert, Set stellt Werte ein. Stoppuhr: Light On/Off = Start/Stopp, Set = Runde.
Zusatz: Stundenschlag (Piepser) & steuerbare Hintergrundbeleuchtung (initial nicht verdrahtet).
Das Zustandsdiagramm (Statechart)
Das Modell besteht aus grafischer (Zustandsdiagramm) und textueller Ebene (Definitionen). Hauptbereiche:
- Hauptmodi (Clock, Date, Alarm1, Alarm2, Chime, Stopwatch)
- Sub-Diagramme für: Set Time, Stopwatch, Chime, Light
- Modellierungselemente: Composite States, History States, Exit Nodes, Sub-Diagramme
Interner Takt: every 100 ms / time += 1 → Zeitberechnung HH:MM:SS:
display.first = (time / 36000) % 24; // Stunden
display.second = (time / 600) % 60; // Minuten
display.third = (time / 10) % 60; // Sekunden
Anzeige-Update via Operation updateLCD(first, second, third, text) bei jedem Zyklus.
LCD Keypad Shield – Tasten auslesen
Alle 5 Tasten liegen an **A0** über Spannungsteiler. Gemessene Werte (können variieren):
| Keine Taste | 1023 |
| Select | 640 |
| Left | 411 |
| Down | 257 |
| Up | 100 |
| Right | 0 |
#define NONE 0
#define SELECT 1
#define LEFT 2
#define DOWN 3
#define UP 4
#define RIGHT 5
static int readButton() {
int result = analogRead(0);
if (result < 50) return RIGHT;
if (result < 150) return UP;
if (result < 300) return DOWN;
if (result < 550) return LEFT;
if (result < 850) return SELECT;
return NONE;
}
State Machine anbinden (Entprellung & Events)
Generierter C++-Code stellt Interfaces bereit. Tasten werden **entprellt** (fallende Flanke nach 80 ms) und Events an die State Machine gesendet:
int oldState = NONE;
static void raiseEvents() {
int buttonPressed = readButton();
delay(80);
oldState = buttonPressed;
if (oldState != NONE && readButton() == NONE) {
switch (oldState) {
case SELECT: stateMachine->getSCI_Button()->raise_mode(); break;
case LEFT: stateMachine->getSCI_Button()->raise_set(); break;
case DOWN: stateMachine->getSCI_Button()->raise_light(); break;
case UP: stateMachine->getSCI_Button()->raise_light_r(); break;
case RIGHT: stateMachine->getSCI_Button()->raise_onoff(); break;
}
}
}
Hauptprogramm (main loop)
DigitalWatch* stateMachine = new DigitalWatch();
CPPTimerInterface* timer_sct = new CPPTimerInterface();
DisplayHandler* displayHandler = new DisplayHandler();
void setup() {
stateMachine->setSCI_Display_OCB(displayHandler);
stateMachine->setTimer(timer_sct);
stateMachine->init();
stateMachine->enter();
}
long current_time = 0, last_cycle_time = 0;
void loop() {
raiseEvents();
last_cycle_time = current_time;
current_time = millis();
timer_sct->updateActiveTimer(stateMachine, current_time - last_cycle_time);
stateMachine->runCycle();
}
Beispiel ausführen
In YAKINDU IDE: File → New → Example → YAKINDU Statechart Examples → Next → Arduino - Digital Watch (C++)
30 Tage Testversion, danach kostenlose Lizenz für nicht-kommerzielle Nutzung.
Herstellungsprozess
- Endliche Zustandsautomaten designen: Vom Konzept zur Implementation
- Monitor-Ambilight selbst bauen mit Arduino Nano & WS2812B LEDs
- Arduino Digitaler Würfel: LCD-Würfel mit Zufallszahlen (1–6)
- Ultraschall-Schwebegerät mit Arduino bauen – Akustische Levitation Schritt für Schritt
- Intelligentes Voltmeter mit Arduino & Smartphone bauen – Einfaches DIY-Projekt
- Echtzeit-IoT-Herzfrequenzmonitor mit Arduino & MAX30100
- Arduino UNO WiFi Webserver: LED per Browser steuern
- Selbstbau-Tamagotchi: Digitales Haustier mit Arduino
- DIY Arduino Smartwatch: Eigene Apple-Watch-Alternative bauen
- Arduino-gesteuertes automatisiertes Chrome Dino-Spiel bauen