Untitled

 avatar
unknown
c_cpp
a month ago
6.0 kB
1
Indexable
#include <arduino.h>

const int buttonPins[] = {23, 22, 21, 19, 18, 5, 17, 16};  // Taster 1-8 auf ESP32
const int ledPins[] = {12, 13, 14, 27, 26, 25, 33, 32, 35};  // Lampen für 8 Spieler auf ESP32
const int trueButtonPin = 4;  // True-Button (Startet das Spiel / Nächste Frage)
const int falseButtonPin = 0;  // False-Button (Falsche Antwort)
const int nextButtonPin = 2;  // Next-Button (Nächste Frage)
const int resetButtonPin = 15;  // Reset-Button (Zurücksetzen des Spiels)

int buttonState[8];  // Speichert die Zustände der Taster
int lastButtonState[8];  // Verfolgt die vorherigen Zustände der Taster
int currentPlayer = -1;  // Zeigt den aktuellen Spieler (der als erstes gedrückt hat)
bool gameStarted = false;  // Gibt an, ob das Spiel gestartet wurde
bool roundStarted = false;  // Gibt an, ob die aktuelle Runde gestartet ist
int pressOrder[8];  // Speichert die Reihenfolge der Tastendrücke
int pressCount = 0;  // Zählt die Anzahl der Tastendrücke
void handleButtonPress(int player);
void handleFalseButton();
void handleNextButton();
void handleResetButton();
void handleTrueButton();
void setup() {
  // Initialisieren der Taster-Pins als Eingänge mit Pull-Down-Widerständen aktiviert
  for (int i = 0; i < 8; i++) {
    pinMode(buttonPins[i], INPUT_PULLDOWN);  // Pull-Down aktiviert
    pinMode(ledPins[i], OUTPUT);    // Lampen als Ausgänge
  }

  // Initialisieren der Steuer-Buttons (True, False, Next, Reset) mit Pull-Down
  pinMode(trueButtonPin, INPUT_PULLDOWN);  // Pull-Down aktiviert
  pinMode(falseButtonPin, INPUT_PULLDOWN);  // Pull-Down aktiviert
  pinMode(nextButtonPin, INPUT_PULLDOWN);  // Pull-Down aktiviert
  pinMode(resetButtonPin, INPUT_PULLDOWN);  // Pull-Down aktiviert

  // Serielle Kommunikation starten
  Serial.begin(9600);

  // Alle Lampen zu Beginn ausschalten
  for (int i = 0; i < 8; i++) {
    digitalWrite(ledPins[i], LOW);
  }
}

void loop() {
  // Überprüfen des Status der Buttons
  for (int i = 0; i < 8; i++) {
    // Lese den Zustand des Tasters und prüfe auf Änderung
    buttonState[i] = digitalRead(buttonPins[i]);

    // Wenn der Taster gedrückt wurde (hoch), und der letzte Zustand war niedrig
    if (buttonState[i] == HIGH && lastButtonState[i] == LOW) {  
      handleButtonPress(i);  // Drücke den entsprechenden Button
    }

    // Speichere den aktuellen Zustand für die nächste Schleife
    lastButtonState[i] = buttonState[i];
  }

  // Überprüfen der Steuer-Buttons
  if (digitalRead(trueButtonPin) == HIGH) {
    handleTrueButton();
  }
  if (digitalRead(falseButtonPin) == HIGH) {
    handleFalseButton();
  }
  if (digitalRead(nextButtonPin) == HIGH) {
    handleNextButton();
  }
  if (digitalRead(resetButtonPin) == HIGH) {
    handleResetButton();
  }
}

void handleButtonPress(int player) {
  if (!gameStarted) {
    // Aktivierungsphase - Wenn das Spiel nicht gestartet wurde
    digitalWrite(ledPins[player], HIGH);  // Lampe für den Spieler an
    Serial.print(player + 1);  // Sendet die Spieler-ID
    Serial.println("L");  // "L" für Lampe an (Spieler aktiv)
  } else {
    // Spielphase - Wenn das Spiel läuft
    if (roundStarted) {
      pressOrder[pressCount] = player;  // Speichern der Reihenfolge der Tastendrücke
      pressCount++;

      // Markiere den ersten Spieler, der gedrückt hat
      if (pressCount == 1) {
        currentPlayer = player;
        digitalWrite(ledPins[player], HIGH);  // Lampe für den ersten Spieler an
        Serial.print(player + 1);  // Spieler-ID senden
        Serial.println("L");  // "L" für Lampe an (Spieler aktiviert)
      }
    }
  }
}

void handleTrueButton() {
  if (!gameStarted) {
    // Wenn der True-Button während der Aktivierungsphase gedrückt wird
    gameStarted = true;
    roundStarted = true;
    // Alle Lampen aus
    for (int i = 0; i < 8; i++) {
      digitalWrite(ledPins[i], LOW);
    }
    Serial.println("0N");  // "0N" für die nächste Frage (das Spiel startet)
  } else {
    // Wenn das Spiel läuft und der True-Button gedrückt wird (richtige Antwort)
    // Setze alle Lampen zurück, markiere den nächsten Spieler
    digitalWrite(ledPins[currentPlayer], LOW);  // Licht des aktuellen Spielers ausschalten
    Serial.print(currentPlayer + 1);  // Spieler-ID senden
    Serial.println("R");  // "R" für richtige Antwort
    currentPlayer = -1;  // Setze den aktuellen Spieler zurück
    pressCount = 0;  // Setze die Reihenfolge der Tasten zurück
  }
}

void handleFalseButton() {
  if (roundStarted && currentPlayer != -1) {
    // Wenn das Spiel läuft und ein falscher Spieler ausgewählt wurde
    // Markiere den nächsten Spieler in der Reihenfolge
    if (pressCount > 1) {
      int nextPlayer = pressOrder[1];  // Zweitschnellster Spieler
      digitalWrite(ledPins[currentPlayer], LOW);  // Licht des aktuellen Spielers ausschalten
      digitalWrite(ledPins[nextPlayer], HIGH);  // Lampe für den zweiten Spieler an
      Serial.print(nextPlayer + 1);  // Spieler-ID senden
      Serial.println("F");  // "F" für falsche Antwort
      currentPlayer = nextPlayer;  // Wechsle den aktuellen Spieler
    }
  }
}

void handleNextButton() {
  if (roundStarted) {
    // Nächste Frage, setzte alle Lampen aus
    for (int i = 0; i < 8; i++) {
      digitalWrite(ledPins[i], LOW);
    }
    Serial.println("0N");  // "0N" für die nächste Frage
    currentPlayer = -1;  // Setze den aktuellen Spieler zurück
    pressCount = 0;  // Setze die Reihenfolge der Tasten zurück
  }
}

void handleResetButton() {
  // Reset-Button, setze das gesamte Spiel zurück
  gameStarted = false;
  roundStarted = false;
  currentPlayer = -1;
  pressCount = 0;
  // Schalte alle Lampen aus
  for (int i = 0; i < 8; i++) {
    digitalWrite(ledPins[i], LOW);
  }
  Serial.println("0E");  // "0E" für Spiel zurücksetzen
}
Editor is loading...
Leave a Comment