Meine Kinder werden, wie alle Kinder auf dieser Welt, größer und gehen in die Schule, um Lesen und Schreiben zu lernen. Mein größtes Kind ist mittlerweile so weit, dass Spiele wie Galgenmännchen oder Scrabble durchaus Sinn machen, da es die Buchstaben und viele Wörter kennt. Daher kam mir die Idee, das Spiel Hangman, zu Deutsch Galgenmännchen, auf dem Arduino Nano zu programmieren. So ist für Knobelspaß in langweiligen Minuten gesorgt. Der Vorteil für dich: Es handelt sich um ein Projekt mit wenigen Bauteilen, die man aber in jedem Maker-Haushalt finden sollte.
Hinweis zu diesem Beitrag
Ich nutze für meine Mikrocontroller-Projekte Visual Studio Code mit PlatformIO. Beides ist kostenlos und für alle gängigen Betriebssysteme verfügbar. Da Visual Studio Code diverse Programmiersprachen beherrscht und sehr gut erweitert werden kann, bietet sich diese Entwicklungsumgebung durchaus an.
Den Quellcode findest du unter: https://github.com/M3taKn1ght/hangman/tree/main
Das Spielprinzip von Hangman
Ich glaube, das Prinzip von Hangman bzw. Galgenmännchen muss ich nicht wirklich erklären. Es wird ein Wort gesucht, wobei zunächst nur die Länge des Wortes durch Platzhalter, in diesem Projekt durch „_“, gezeigt wird. Durch das Raten von Buchstaben versucht der Spieler bzw. die Spielerin, das Wort aufzudecken. In diesem Projekt werden dabei nur die Buchstaben A bis Z verwendet, Sonderzeichen und Umlaute wie ä, ö, ü und ß sind nicht vorgesehen.
Für jeden falsch geratenen Buchstaben nimmt das Galgenmännchen weiter Gestalt an. Ziel ist es, das gesuchte Wort vollständig zu erraten, bevor das Galgenmännchen komplett dargestellt ist.
Die Auswahl des Buchstabens erfolgt über den Drehencoder. Durch Drehen wechselst du zwischen den Buchstaben, mit dem Taster bestätigst du deine Auswahl.
Die Hardware zu diesem Projekt
Die benötigte Hardware für dieses Projekt ist recht überschaubar. Tabelle 1 zeigt die wichtigsten Bauteile. Beim Drehencoder gibt es verschiedene Versionen. Häufig findet man beispielsweise das Modul KY-040, das neben den Anschlüssen für die Drehbewegung auch einen integrierten Drucktaster mit SW-Anschluss besitzt. Wird der Drehknopf gedrückt, funktioniert dieser wie ein einfacher Taster.
Einen guten Überblick über den Arduino Nano und seine wichtigsten Funktionen findest du in unserem Arduino Nano Guide.
| Pos. | Hardware | Link |
|---|---|---|
| 1 | Arduino Nano |
Arduino Nano
Alternative: Nano-kompatibles Board mit ATmega328P |
| 2 | Drehencoder | Drehimpulsgeber |
| 3 | I2C-LCD-Display | Alphanumerisches LCD 16×2 mit I2C-Backpack |
| 4 | Einfacher Taster | Taster |
| 5 | Jumperkabel | 40pin Jumper / Dupont Kabel Male–Male |
| 6 | Breadboard | Breadboard mit 400 Kontakten |
Tabelle 1: Benötigte Bauteile für das Projekt
Tipp: Falls der originale Arduino Nano gerade nicht verfügbar ist, kannst du für dieses Projekt auch ein Nano-kompatibles Board mit ATmega328P verwenden.
Da ich in meiner Sammlerbox noch einen Drehencoder hatte, bei dem der integrierte Taster nicht mehr funktioniert hat, habe ich in diesem Projekt einen separaten Taster verwendet. Im Prinzip kann der Code aber auch so angepasst werden, dass stattdessen der integrierte Taster des Drehencoders verwendet wird.
Zusätzlich benötigst du einen Computer mit Visual Studio Code und PlatformIO, um den Quellcode zu kompilieren und auf den Arduino Nano zu übertragen. Der Arduino wird dabei über USB mit dem Computer verbunden und darüber auch mit Strom versorgt.
Verdrahtung
Die Schaltung für dieses kleine Projekt ist recht einfach gehalten. Das LCD-Display muss über den I2C-Adapter an die I2C-Pins des Arduino angeschlossen werden. Für die I2C-Kommunikation werden die analogen Pins A4 (SDA) und A5 (SCL) benötigt.
Damit der Drehencoder funktioniert, wird der digitale Pin D9 mit CLK und D8 mit DT des Drehencoders verbunden. Die Stromversorgung erfolgt über 5 V an „+“ und GND an „GND“. Zuletzt wird der digitale Pin D2 mit dem Taster verbunden. Der zweite Kontakt des Tasters wird mit GND verbunden.
Die komplette Schaltung gibt es noch einmal in Abbildung 1.

Sollte das Bild etwas undeutlich oder die Verdrahtung nicht ganz klar sein, hilft Tabelle 2 bestimmt weiter.
| Pin Hardware | Pin Arduino |
|---|---|
| 5V – I2C-LCD | 5V |
| GND – I2C-LCD | GND |
| SDA – I2C-LCD | A4 |
| SCL – I2C-LCD | A5 |
| CLK – Drehencoder | D9 |
| DT – Drehencoder | D8 |
| + – Drehencoder | 5V |
| GND – Drehencoder | GND |
| Taster | D2 |
| Taster | GND |
Tabelle 2: Tabellarische Verkabelung des Projekts
Solltest du andere Hardware als die von mir verwendete nutzen, muss die Verdrahtung natürlich entsprechend angepasst werden. Insbesondere bei anderen Displays oder Drehencodern solltest du vorher die jeweilige Pinbelegung prüfen.
Der Programmcode
Da ich mittlerweile die freie Entwicklungsumgebung Visual Studio Code mit PlatformIO bevorzuge, nicht zuletzt, weil diese Kombination einfach deutlich mehr Möglichkeiten bietet als die Arduino IDE, ist mein Programmcode damit geschrieben worden. Der Hauptteil der Konfiguration, wie der verwendete Mikrocontroller, die genutzten Pins und die Projektkonfiguration, befindet sich in der platformio.ini. Dadurch verlagern sich die meisten Definitionen von Zeiten und Pins dorthin, ohne den Quellcode mit #define-Anweisungen aufzublähen.
Gleichzeitig habe ich in diesem Projekt wieder zwei verschiedene Projektkonfigurationen:
- Debug: Eine spezielle Version, die über den seriellen Monitor Ausgaben erzeugen kann, um den Quellcode zu verstehen und mögliche Bugs zu finden.
- Release: Die offizielle Version für den Mikrocontroller, die keine zusätzlichen Debug-Ausgaben erzeugt und dadurch weniger Speicher benötigt.
Wichtig ist an dieser Stelle zu verstehen, dass beide Versionen auf dem Arduino laufen und im Prinzip genau das Gleiche im Spielablauf machen. Lediglich die erweiterten Debug-Ausgaben und die dafür benötigten Funktionen nehmen zusätzlichen Speicherplatz auf dem Arduino in Anspruch. Sofern der Programmcode fehlerfrei läuft, wird die Debug-Version also nicht benötigt.
Abbildung 2 zeigt die Projektkonfigurationsmöglichkeiten, die auch auf weitere Mikrocontroller erweitert werden können.

Wer mein letztes Spiel „Pixeljäger“ nachgebaut hat, der wird auch dieses Mal wieder über eine State Machine in meinem Programmcode stolpern. Im Grunde wird in der Hauptfunktion loop() nur wenig gemacht, außer dass geprüft wird, ob der Taster gedrückt wurde und in welchem Status sich der Mikrocontroller bzw. das Programm gerade befindet. Damit wird die loop() nicht unnötig aufgebläht und die weitere Arbeit wird über zusätzliche Funktionen im jeweiligen Status erledigt.
Tabelle 3 erläutert die verschiedenen Zustände der Statusmaschine.
| Status | Erklärung |
|---|---|
stateNewGameScreen
|
Zeigt den Startbildschirm mit dem Hinweis, den Taster zum Start des Spiels zu drücken. |
statNewGame
|
Dieser Status wartet darauf, dass der Spieler den Taster zum Starten drückt. |
statInitGame
|
Sobald der Taster wieder losgelassen wird, wird der Grundbildschirm erzeugt, das zu suchende Wort zufällig aus der Liste gewählt, wichtige Variablen werden zurückgesetzt und die Buchstabenauswahl wird vorbereitet. |
statWaitLetter
|
Hier wird geprüft, ob der Drehencoder bewegt wird, um den ausgewählten Buchstaben anzupassen, und ob eine Buchstabenauswahl mit dem Taster erfolgt ist. |
statCheckLetter
|
Sobald der Taster wieder losgelassen wurde, wird geprüft, ob sich der Buchstabe im gesuchten Wort befindet. Ist das der Fall, wird er an der entsprechenden Stelle angezeigt. Ist die Auswahl falsch, nimmt das Galgenmännchen weiter Gestalt an. |
statWin
|
Der Bildschirm, der anzeigt, dass der Spieler gewonnen hat, wird angezeigt. |
statGameOver
|
Der Bildschirm, der anzeigt, dass der Spieler verloren hat, wird angezeigt. |
Tabelle 3: Die verschiedenen Zustände der Statusmaschine
An dieser Stelle sei direkt gesagt, dass der Quellcode des Spiels mit 362 Zeilen recht umfangreich aussieht und auch deutlich schlanker programmiert werden könnte. Jedoch möchte ich dir als Anfänger die Möglichkeit geben, dich schnell und leicht in den Programmcode einzuarbeiten, was mit diversen Profiprogrammiertechniken schwieriger geworden wäre.
Englisch ist aber auf jeden Fall hilfreich bei dem Code, da Variablen, Funktionen und Kommentare auf Englisch verfasst sind. An diversen Stellen habe ich noch einmal extra Kommentare eingefügt, damit deutlich wird, was genau passieren soll.
Der gesamte Code kann, sofern du dich an die Verdrahtung weiter oben gehalten hast und die benötigten Bibliotheken über PlatformIO eingebunden sind, kompiliert und auf den Arduino übertragen werden. Anschließend startet das Spiel auf dem LCD. Mit dem Taster startest du eine neue Runde, über den Drehencoder wählst du einen Buchstaben aus und mit dem Taster bestätigst du deine Auswahl.
Grundlegende Ideen für die Verbesserung
Wie du vielleicht im Programmcode gesehen hast, ist die Auswahl der zu erratenden Wörter stark begrenzt. Bei gerade einmal zehn Wörtern ist der Spielspaß allerdings schnell erschöpft. Daher muss eine Erweiterung her, die es ermöglicht, eine beliebige Anzahl von Wörtern zu verwenden. Da der Arduino Nano weder WLAN noch Bluetooth oder Ethernet hat, ist die einfachste Wahl ein externes Speichermedium.
Mit Wortlängen von maximal 10 Zeichen wird es auch schwierig, viele Wörter zu finden. Im Prinzip kann in der platformio.ini die maximale Länge auf 13 Zeichen erhöht werden, womit deutlich mehr Wörter möglich sind. Dabei muss natürlich berücksichtigt werden, dass auf dem verwendeten 16×2-LCD nur begrenzt Platz für die Darstellung zur Verfügung steht.
Abschließende Worte
Dieses Projekt ist für mein größeres Kind gedacht, damit es in der Freizeit einfach ein bisschen Spaß hat. Grundlegend kann so spielerisch das Lesen, Buchstabieren und Erkennen von Wörtern geübt werden, ohne dass sich das Ganze direkt wie Lernen anfühlt.
Da ich mit PlatformIO programmiere und es dir einige Vorteile beim Programmieren mit Arduino- und ESP-Mikrocontrollern bietet, empfehle ich den gut geschriebenen Artikel der c’t MAKE 01/2025.
Falls du den Hinweis oben nicht gesehen haben solltest: Du findest das vollständige Projekt auf GitHub unter https://github.com/M3taKn1ght/hangman/tree/main

































