/*
Spiel auf einer LED-Lichtleiste: "Pong"
- Drücke den Knopf, wenn der Ball in deiner Zone ist.
- Je näher du an den Rand kommst, desto schneller prallt der Ball ab.
- Drückst du nicht in deiner Zone oder verpasst den Ball - du verlierst.
*/
#include "FastLED.h" // Wir benutzen die FastLED-Bibliothek, um die LEDs zu steuern
// === Konstanten (Dinge, die sich nicht ändern) ===
#define LED_PIN 2 // Pin, an dem die LED-Leiste angeschlossen ist
#define LED_NUM 90 // Anzahl der LEDs auf der Leiste
#define LED_HELLIGKEIT 250 // Helligkeit der LEDs (0-255)
#define KNOPF1_PIN 3 // Pin für den Knopf des Spielers 1
#define KNOPF2_PIN 4 // Pin für den Knopf des Spielers 2
#define TON_PIN 5 // Pin für den Summer (macht Pieptöne)
#define ZONEN_GROESSE 20 // Größe der Zone für jeden Spieler (10 LEDs)
#define MIN_GESCHWINDIGKEIT 5 // Langsamste Ballgeschwindigkeit
#define MAX_GESCHWINDIGKEIT 20 // Schnellste Ballgeschwindigkeit
#define GEWINN_PUNKTE 5 // Punkte, die ein Spieler braucht, um zu gewinnen
// === Variablen (Dinge, die sich ändern) ===
CRGB leds[LED_NUM]; // Das ist die LED-Leiste, wir haben 90 LEDs
int ballPos = 0; // Die Position des Balls auf der Leiste (0 ist ganz links)
int ballGeschwindigkeit; // Wie schnell sich der Ball bewegt
int punkteSpieler1 = 0, punkteSpieler2 = 0; // Punkte der Spieler
unsigned long letzteZeit; // Zum Messen der Zeit, um den Ball zu bewegen
// === Setup-Funktion (diese startet einmal, wenn das Arduino eingeschaltet wird) ===
void setup() {
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, LED_NUM); // LEDs initialisieren
FastLED.setBrightness(LED_HELLIGKEIT); // Helligkeit setzen
pinMode(KNOPF1_PIN, INPUT_PULLUP); // Knopf 1 aktivieren (mit internem Widerstand)
pinMode(KNOPF2_PIN, INPUT_PULLUP); // Knopf 2 aktivieren
pinMode(TON_PIN, OUTPUT); // Summer aktivieren
neuesSpiel(); // Starten wir ein neues Spiel
}
// === Loop-Funktion (diese läuft immer wieder in einer Schleife) ===
void loop() {
knoepfePruefen(); // Schauen, ob einer der Knöpfe gedrückt wurde
ballBewegen(); // Den Ball bewegen
}
// === Prüfen, ob ein Spieler seinen Knopf drückt ===
void knoepfePruefen() {
// Prüfe, ob Spieler 1 den Knopf drückt
if (digitalRead(KNOPF1_PIN) == LOW) { // LOW bedeutet, der Knopf ist gedrückt
if (ballPos < ZONEN_GROESSE) { // Wenn der Ball in der Zone von Spieler 1 ist
ballGeschwindigkeit = map(ballPos, 0, ZONEN_GROESSE, MIN_GESCHWINDIGKEIT, MAX_GESCHWINDIGKEIT); // Geschwindigkeit anpassen
piepen(1200); // Kurzer Piepton
} else {
spielVerloren(1); // Spieler 1 hat den Ball verpasst
}
}
// Prüfe, ob Spieler 2 den Knopf drückt
if (digitalRead(KNOPF2_PIN) == LOW) {
if (ballPos >= LED_NUM - ZONEN_GROESSE) { // Wenn der Ball in der Zone von Spieler 2 ist
ballGeschwindigkeit = map(ballPos, LED_NUM - ZONEN_GROESSE, LED_NUM, -MIN_GESCHWINDIGKEIT, -MAX_GESCHWINDIGKEIT); // Geschwindigkeit anpassen
piepen(1200); // Kurzer Piepton
} else {
spielVerloren(2); // Spieler 2 hat den Ball verpasst
}
}
}
// === Den Ball auf der LED-Leiste bewegen ===
void ballBewegen() {
if (millis() - letzteZeit > 50) { // Alle 50 Millisekunden
letzteZeit = millis(); // Zeit merken
ballPos += ballGeschwindigkeit / MIN_GESCHWINDIGKEIT; // Position des Balls ändern
// Wenn der Ball links raus geht
if (ballPos < 0) {
spielVerloren(1); // Spieler 1 hat verloren
}
// Wenn der Ball rechts raus geht
if (ballPos >= LED_NUM) {
spielVerloren(2); // Spieler 2 hat verloren
}
// LEDs aktualisieren
FastLED.clear(); // Lösche alle LEDs
zonenZeichnen(); // Zonen der Spieler anzeigen
ballZeichnen(); // Den Ball zeichnen
FastLED.show(); // Zeige die LED-Leiste
}
}
// === Den Ball zeichnen, je nachdem, wo er sich befindet ===
void ballZeichnen() {
leds[ballPos] = CRGB::Cyan;
}
// === Zonen der Spieler anzeigen ===
void zonenZeichnen() {
for (int i = 0; i < ZONEN_GROESSE; i++) {
leds[i] = CRGB::Green; // Zone von Spieler 1 grün
leds[LED_NUM - i - 1] = CRGB::Red; // Zone von Spieler 2 rot
}
}
// === Piepton machen ===
void piepen(int frequenz) {
tone(TON_PIN, frequenz, 100); // Ton mit der angegebenen Frequenz für 100 ms
}
// === Wenn ein Spieler verliert ===
void spielVerloren(int spieler) {
if (spieler == 1) {
punkteSpieler2++; // Spieler 2 bekommt einen Punkt
} else {
punkteSpieler1++; // Spieler 1 bekommt einen Punkt
}
// Prüfen, ob jemand gewonnen hat
if (punkteSpieler1 == GEWINN_PUNKTE || punkteSpieler2 == GEWINN_PUNKTE) {
neuesSpiel(); // Neues Spiel starten, wenn jemand gewonnen hat
} else {
neueRunde(); // Neue Runde, wenn niemand gewonnen hat
}
}
// === Ein neues Spiel starten ===
void neuesSpiel() {
punkteSpieler1 = 0; // Punkte zurücksetzen
punkteSpieler2 = 0;
neueRunde(); // Starte eine neue Runde
}
// === Eine neue Runde starten ===
void neueRunde() {
ballPos = LED_NUM / 2; // Ball in die Mitte setzen
ballGeschwindigkeit = random(0, 2) == 0 ? MIN_GESCHWINDIGKEIT : -MIN_GESCHWINDIGKEIT; // Zufällige Richtung für den Ball
}