
Ziel des Projekts
Zwei Schnecken liefern sich ein Rennen. Sie laufen eine zufällig ermittelte Anzahl von Schritten. Wer als Erstes mit dem letzten Zug das Ziel überschreitet, hat gewonnen.
Die Hardware


Das LCD wird über die Pins SDA und SCL verbunden.

Die Helligkeit kann mit einem Potentiometer auf der Rückseite des LCDs eingestellt werden.
Benötigte Bauteile
- Taster
- 4-zeiliges LCD mit I²C-Schnittstelle
- Leitungsdrähte
Der Schaltplan
Benötigte Bibliotheken
Die Ansteuerung von Hardware kann sehr bequem über ⇒Bibliotheken erledigt werden. Das LCD wird mit der Bibliothek LCDIC2 angesteuert.
Die Bibliothek Bounce2 hilft das sogenannte ⇒Prellen des Tasters zu verhindern.


Das Programm
Bibliotheken und Variable
Im Kopf des Programms werden verschiedene ⇒Arrays und ⇒Variable verwendet, damit die Ausgabe möglichst flexibel gestaltet werden kann.
- das Array Schnecke[]: die Namen der Schnecken
- Zielvorgabe (16)
- Anzahl der Schritte: Minimum und Maximum
- das Array Schrittzeichen als Pfeil muss als ⇒Sonderzeichen dargestellt werden
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#include "LCDIC2.h" #include "Bounce2.h" // 4‑zeiliges LCD LCDIC2 lcd(0x27, 20, 4); // "Prallverhinderer" für den Taster starten Bounce TasteStart = Bounce(); int TASTER = 7; // Anzahl der Schritte Minimum/Maximum int Minimum = 1; int Maximum = 4; // Schritte bis zum Ziel int Ziel = 16; int Schritte = 0; int Runde = 1; // wenn Neustart = true -> Variable zurücksetzen bool Neustart = false; /* Arrays für die Schnecken BisherigeSchritte[] -> Anzahl zurückgelegter Schritte Schnecke[] -> Namen der Schnecken SchrittZeichen[] -> Zeichen für die zurückgelegten Schritte es können (fast) beliebige Zeichen verwendet werden */ int BisherigeSchritte[2]; String Schnecke[2] = {"Lisa", "Karl"}; String SchrittZeichen[2] = {"\176", "\176"}; |
Der setup-Teil
Im setup-Teil wird über die Entfernung zum Ziel, die beteiligten Schnecken informiert.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
void setup() { Serial.begin(9600); // auf serielle Verbindung warten while (!Serial) {;} // Info über das Spiel Serial.println("Schneckenrennen"); Serial.println("Schnecken: " + Schnecke[0] + " und " + Schnecke[1]); // \n = neue Zeile Serial.println("Ziel: " + String(Ziel)); Serial.println("Tasten:\nw -> weiter\nn -> Neustart"); Serial.println("-------------------------------------------"); // Zufallsgenerator starten randomSeed(analogRead(A0)); } |
Der loop-Teil
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
void loop() { while (Serial.available() > 0) { // Eingabe im Seriellen Monitor lesen char Zeichen = Serial.read(); // Enter/Senden gedrückt if (Zeichen == 'n') { Neustart = true; } if (Zeichen == 'w') { // beim Neustart -> alle Variablen zurücksetzen if (Neustart) { BisherigeSchritte[0] = 0; BisherigeSchritte[1] = 0; Runde = 1; Neustart = false; } Serial.println("Runde " + String(Runde)); // Schnecke 1 // Anzahl der Schritte zufällig ermitteln Schritte = ZufallsZahl(Minimum, Maximum); // Summe der Schritte berechnen BisherigeSchritte[0] = BisherigeSchritte[0] + Schritte; /* Variablen an die Funktion Bildschirmausgabe übergeben Name der Schnecke, Summe der Schritte, Zeichen für die zurückgelegten Schritte für das erste Element [0] -> die erste Schnecke */ Bildschirmausgabe(Schnecke[0], BisherigeSchritte[0], SchrittZeichen[0]); /* Variablen an die Funktion Bildschirmausgabe übergeben Name der Schnecke, Summe der Schritte, Zeichen für die zurückgelegten Schritte für das zweite Element [1] -> die zweite Schnecke */ Schritte = ZufallsZahl(Minimum, Maximum); BisherigeSchritte[1] = BisherigeSchritte[1] + Schritte; Bildschirmausgabe(Schnecke[1], BisherigeSchritte[1], SchrittZeichen[1]); Serial.println("-------------------------------------------"); // Runde hochzählen Runde ++; // Sieger Schnecke 1 if (BisherigeSchritte[0] > Ziel) { if (BisherigeSchritte[0] > BisherigeSchritte[1]) { Serial.println(Schnecke[0] + " hat gewonnen!"); Neustart = true; } } // Sieger Schnecke 2 if (BisherigeSchritte[1] > Ziel) { if (BisherigeSchritte[0] < BisherigeSchritte[1]) { Serial.println(Schnecke[1] + " hat gewonnen!"); Neustart = true; } } // unentschieden if (BisherigeSchritte[0] > Ziel && BisherigeSchritte[1] > Ziel) { if (BisherigeSchritte[0] == BisherigeSchritte[1]) { Serial.println("Unentschieden!"); Neustart = true; } } } } } |
Die Funktionen
Jetzt fehlen noch die ⇒Funktion ZufallsZahl() und die Funktion Bildschirmausgabe().
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
int ZufallsZahl(int Minimum, int Maximum) { int Zahl = random(Minimum, Maximum); return Zahl; } void Bildschirmausgabe(String Name, int Schritte, String SchrittZeichen, int Zeile) { lcd.setCursor(0, Zeile); // Name der Schnecke und Anzahl der Schritte anzeigen lcd.print(Name + " " + String(Schritte)); lcd.setCursor(0, Zeile + 1); // entsprechend der Anzahl der Schritte Zeichen anzeigen for (int i = 0; i < Schritte; i ++) { lcd.print(SchrittZeichen); } lcd.setCursor(Ziel, Zeile + 1); lcd.print("|"); } |
Ähnliche Projekte
- Grafische Temperaturanzeige mit der Bibliothek TFT_eSPI
- Countdown mit einer einstelligen 7-Segment-Anzeige
- Countdown mit einem OLED-Display
- DHT11/DHT22 – Durchschnittstemperatur berechnen und auf einem OLED-Display anzeigen
- ESP – DHT Messdaten auf Waveshare 1,54 Zoll E-Ink anzeigen
- Wetterdaten von Openweather mit der API 3.0 auf einem TFT anzeigen
- Farbenspiele mit einer RGB-Matrix
- Fotoschau mit ESP32, TFT und SD-Kartenleser
- Fotoschau mit TFT-Shield
- GFXcansas einsetzen
Letzte Aktualisierung:





