kk logo

Suchst du nach einem perfekten Einsatzzweck für ein E-Ink (E-Paper) Display? Da diese Displays systembedingt eine träge Bildwiederholrate haben, fallen hektische Spiele komplett weg. Perfekt geeignet sind dagegen Logik- und Knobelspiele, bei denen du lange über einen Zug nachdenkst und das Display nur dann ein Update braucht, wenn du aktiv eine Zahl änderst.

In diesem Projekt bauen wir ein 3×3 Mini-Sudoku auf einem 4.2 Zoll E-Ink Display. Gesteuert wird das Ganze über einen einzigen Inkrementalgeber (Drehgeber) mit integriertem Taster. Drehen ändert die Zahl (1 bis 3 oder leer), ein kurzer Druck springt zum nächsten Feld, und ein langer Druck generiert ein völlig neues, zufälliges Rätsel.

Mini Sudoku auf dem E Ink Display Kniffliges Hardware Rätsel mit dem Arduino Uno R4 1

Damit das Spiel flüssig läuft und das Display nicht bei jedem Klick nervig flackert, stecken im C++ Code ein paar feine Programmiertricks. Hier erfährst du, wie es funktioniert und welches die drei wichtigsten Schlüsselstellen im Code sind.

Der Arduino Code für das Spiel

 Mini Sudoku auf dem E Ink Display Kniffliges Hardware Rätsel mit dem Arduino Uno R4 2

Die 3 wichtigsten Schlüsselstellen im Code

Der Code greift direkt auf die Hardware zu, ohne aufgeblähte Bibliotheken für die Sensorik zu nutzen. Um die Performance hochzuhalten und den RAM des Arduinos zu schonen, stecken die entscheidenden Kniffe in folgenden drei Bereichen:

1. Kontaktprellen per Software-Zustandsautomat (State-Machine) lösen

Mechanische Drehgeber haben eine hässliche Eigenschaft: Die internen Metallkontakte federn beim Rasten minimal nach. Der schnelle Mikroprozessor des Arduino Uno R4 registriert dieses "Prellen" als unkontrollierte Mehrfach-Drehungen. Das Ergebnis: Die Zahlen springen wild hin und her.

Anstatt das Signal zeitlich träge zu verzögern (Debouncing per Delay), nutzt dieser Code eine State-Machine über Hardware-Interrupts an Pin 2 und Pin 3.

void encoderISR() {
static uint8_t alterZustand = 0;
static const int8_t werteTabelle[] = {0, 1, -1, 0, -1, 0, 0, 1, 1, 0, 0, -1, 0, -1, 1, 0};

alterZustand <<= 2;
if (digitalRead(PIN_ENC_A)) alterZustand |= 0x02;
if (digitalRead(PIN_ENC_B)) alterZustand |= 0x01;
alterZustand &= 0x0F;

static int interneSchritte = 0;
interneSchritte += werteTabelle[alterZustand];

if (interneSchritte >= 4) { encoderWert++; interneSchritte = 0; }
else if (interneSchritte <= -4) { encoderWert--; interneSchritte = 0; }
}

2. Blitzschnelle Reaktion dank Partial Updates (Partielle Aktualisierung)

Standardmäßig baut die GxEPD2-Bibliothek ein E-Ink Display komplett neu auf. Dabei blitzt der gesamte Bildschirm mehrfach schwarz/weiß auf, was mehrere Sekunden dauert. Für ein Spiel unbrauchbar. Die Lösung heißt Partielles Zeichnen.

void drawSingleCell(uint8_t index) {
// ... Positionsberechnung der Zelle ...
display.setPartialWindow(xStart, yStart, cellWidth, cellHeight);
display.firstPage();
do {
display.fillRect(xStart, yStart, cellWidth, cellHeight, GxEPD_WHITE);
// ... Zeichne Gitter, Ecken und Zahl ...
} while (display.nextPage());
}

3. Logisches Überspringen gesperrter Felder

Ein gutes Sudoku lebt davon, dass einige Zahlen als feste Tipps vorgegeben sind. Diese dürfen logischerweise nicht vom Spieler überschrieben werden. Damit du beim Durchschalten der Felder nicht genervt über diese fixen Zahlen hinwegklicken musst, filtert die Taster-Auswertung das im Hintergrund.

else if (pressDuration > 50) {
oldField = currentField;

do {
currentField++;
if (currentField > 8) currentField = 0;
} while (locked[currentField]);

drawSingleCell(oldField);
drawSingleCell(currentField);
}

Das optische Highlight: Ecken statt Unterstriche

Damit du auf dem Display sofort erkennst, welche Zahlen vom System fest vorgegeben sind und welche du selbst eingetragen hast, nutzt das Spiel ein cleveres Design:

  • Deine Zahlen: Stehen komplett frei im Raum. Das aktuell angewählte Feld wird durch einen dicken, dreifachen Rahmen hervorgehoben.
  • Vorgegebene Zahlen: Erhalten vier eckige, präzise gezeichnete Winkel an den Außenrändern des Kästchens (erzeugt über drawFastHLine und drawFastVLine). Das verleiht dem Mini-Sudoku einen extrem sauberen, technischen Look im Stil eines Tresorschlosses.

Wenn du mal feststeckst oder eine neue Runde starten willst: Halte den Taster für 2 volle Sekunden gedrückt. Der Arduino Uno R4 mischt daraufhin die Zahlenreihen im Hintergrund komplett neu durch, leert das Feld, setzt 3 bis 4 neue Start-Tipps auf das Board und baut das Display einmal komplett frisch auf.

 

Viel Spaß beim Nachbauen und Knobeln!

Kontakt

visitenkarte

Ronnie

schwäbischer tüftler und bastler, kraftsportler, neurodivers, 45 Jahre, 1 Frau, 5 Kinder und 1003 Ideen. 

1.2 ronnie berzins