commit a6bc3a7ac47c62ad4da407a123d6b8ac223f91d5 Author: klaas Date: Mon Sep 9 17:27:36 2024 +0200 initial commit diff --git a/HotWire.ino b/HotWire.ino new file mode 100644 index 0000000..b939cb1 --- /dev/null +++ b/HotWire.ino @@ -0,0 +1,86 @@ +#include + +const byte startPin = 8, stopPin = 9, mistakePin = 10, buzzerPin = 7; +const byte penaltyTimePin = A0; // Falls du ein Potentiometer für die Strafzeit verwendest +const byte minPenaltyTime = 1, maxPenaltyTime = 15; // [t] = 1 s +LiquidCrystal lcd(12, 11, 5, 4, 3, 2); + +long millisStart, millisEnd; + +int mistakes, penaltyTime, lastPenaltyTime; + +void setup() { + Serial.begin(9600); + lcd.begin(16, 2); // Initialisiere das LCD mit 16 Zeichen und 2 Zeilen + pinMode(startPin, INPUT_PULLUP); + pinMode(stopPin, INPUT_PULLUP); + pinMode(mistakePin, INPUT_PULLUP); + pinMode(buzzerPin, OUTPUT); + digitalWrite(buzzerPin, LOW); + pinMode(LED_BUILTIN, OUTPUT); + // Pinbelegungen für das LCD (RS, E, D4, D5, D6, D7) + lcd.clear(); + lcd.print("Gehe zu Start"); + +} + +void loop() { + + if (digitalRead(startPin) == LOW) { + lcd.clear(); + lcd.print("Los Geht's"); + while (digitalRead(startPin) == LOW) { + delay(200); + } + startGame(); + while (digitalRead(startPin) == HIGH) { + // wait for return to Start + delay(500); + } + resetGame(); + } +} + +void startGame() { + lcd.clear(); + lcd.print("Start"); + Serial.println("Start"); + mistakes = 0; // Fehlerzähler zurücksetzen + millisStart = millis(); // Startzeit speichern + while (digitalRead(stopPin) == HIGH && digitalRead(startPin) == HIGH) { + if (digitalRead(mistakePin) == LOW) { + mistakes++; + Serial.println("Fehler: " + String(mistakes)); + lcd.setCursor(0, 0); + lcd.print("Fehler: " + String(mistakes) + " "); + digitalWrite(LED_BUILTIN, HIGH); + digitalWrite(buzzerPin, HIGH); + delay(500); // Wartezeit nach einem Fehler + digitalWrite(LED_BUILTIN, LOW); + digitalWrite(buzzerPin, LOW); + while (digitalRead(mistakePin) == LOW) { + // Warte, bis der Kontakt zu mistakePin unterbrochen wird + delay(10); + } + } + lcd.setCursor(0,1); + lcd.print(String((millis() - millisStart) / 1000) + "s "); + delay(10); // Reduziere die Abfrageverzögerung für eine bessere Reaktionszeit + } + millisEnd = millis(); // Endzeit speichern + Serial.println("Gewonnen"); + Serial.println("Gesamtzeit: " + String((millisEnd - millisStart) / 1000) + " Sekunden"); + Serial.println("Fehler gesamt: " + String(mistakes)); + lcd.clear(); + lcd.print("Gewonnen in " + String((millisEnd - millisStart) / 1000) + "s "); + lcd.setCursor(0, 1); + lcd.print("mit " + String(mistakes) + " Fehlern"); +} + +void resetGame() { + Serial.println("Reset"); + lcd.clear(); + lcd.print("reset"); + + mistakes = 0; +} diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..b491aa7 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +# The MIT License (MIT) + +Copyright (c) 2015-2022 Vladimir Iakovlev + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..a0c0784 --- /dev/null +++ b/README.md @@ -0,0 +1,62 @@ +# Geschicklichkeitsspiel mit Arduino und LCD-Anzeige + +## Projektübersicht + +Dieses Projekt implementiert ein einfaches Geschicklichkeitsspiel mit einem Arduino-Mikrocontroller, bei dem die Zeit gemessen wird, die benötigt wird, um das Spiel abzuschließen. Das Spiel zeichnet Fehler auf, die während des Spiels gemacht werden, und zeigt die Ergebnisse auf einem LCD-Display an. Zusätzliche visuelle und akustische Signale werden bei Fehlern ausgegeben. + +## Komponenten + +- **Arduino Nano oder kompatibles Board** +- **LCD-Display** (16x2) mit HD44780-Treiber +- **Buzzer** (zur akustischen Signalisierung von Fehlern) +- **Widerstände** (Pull-up Widerstände für die Taster) +- **Verbindungskabel und Steckbrett** (für die Schaltung) + +## Funktionen + +- **Start- und Stopp-Taster:** Das Spiel beginnt, wenn der Start-Taster gedrückt wird, und endet, wenn der Stopp-Taster betätigt wird. +- **Fehlererkennung:** Ein Fehler wird registriert, wenn der Fehler-Taster während des Spiels gedrückt wird. Jeder Fehler wird auf dem LCD-Display angezeigt, und ein Buzzer ertönt. +- **Zeitmessung:** Die Zeit, die benötigt wird, um das Spiel abzuschließen, wird in Sekunden gemessen und angezeigt. +- **Ergebnisanzeige:** Nach Beendigung des Spiels wird die Gesamtzeit und die Anzahl der Fehler auf dem LCD angezeigt. + +## Schaltung + +1. **LCD-Anzeige:** Verbinde das LCD-Display wie folgt mit dem Arduino: + - RS -> Pin 12 + - E -> Pin 11 + - D4 -> Pin 5 + - D5 -> Pin 4 + - D6 -> Pin 3 + - D7 -> Pin 2 + +2. **Verbindungen:** + - **Griff:** Verbinde die Drahtöse mit GND. + - **Start:** Verbinde die Startplatte mit Pin 8. + - **Stopp:** Verbinde die Endplatte mit Pin 9 + - **Fehler:** Verbinde den Draht mit Pin 10. + +3. **Buzzer:** Verbinde den Buzzer mit Pin 7 und GND. + +## Code-Erklärung + +- **Setup:** Initialisiert das LCD-Display und konfiguriert die Pins für die Taster und den Buzzer. +- **Loop:** Wartet auf den Start-Taster, um das Spiel zu beginnen. Während des Spiels werden Fehler gezählt und die Zeit gemessen. Bei Spielende wird die Gesamtzeit und die Anzahl der Fehler angezeigt. +- **startGame():** Startet den Timer und überwacht die Fehlererkennung. Die aktuelle Spielzeit und die Fehleranzahl werden auf dem LCD angezeigt. +- **resetGame():** Setzt das Spiel zurück und bereitet es auf einen neuen Start vor. + +## Verwendung + +1. **Vorbereitung:** Schließe die Schaltung gemäß der obigen Beschreibung an. +2. **Upload:** Lade den Code auf dein Arduino-Board hoch. +3. **Start:** Drücke den Start-Taster, um das Spiel zu beginnen. +4. **Spielverlauf:** Versuche, das Spiel so schnell wie möglich abzuschließen, ohne Fehler zu machen. Jeder Fehler wird registriert und akustisch signalisiert. +5. **Ende:** Drücke den Stopp-Taster, um das Spiel zu beenden. Die Zeit und die Anzahl der Fehler werden auf dem LCD angezeigt. + +## Anpassungen + +- **Strafzeit:** Du kannst den Bereich der Strafzeit durch Ändern der Variablen `minPenaltyTime` und `maxPenaltyTime` anpassen. +- **Buzzer-Signal:** Die Dauer des akustischen Signals bei einem Fehler kann durch Ändern des Wertes in der `delay()`-Funktion innerhalb der Fehlererkennungsschleife angepasst werden. + +## Lizenz + +Dieses Projekt steht unter der MIT-Lizenz – weitere Informationen findest du in der [LICENSE](LICENSE) Datei.