#include <Adafruit_NeoPixel.h>
#define LED_PIN1 6 // Pin für den ersten LED-Strip
#define LED_PIN2 7 // Pin für den zweiten LED-Strip
#define BUTTON_PIN1 8 // Pin für den Taster des ersten Strips
#define BUTTON_PIN2_ON 9 // Pin für den Einschalt-Taster des zweiten Strips
#define BUTTON_PIN2_OFF 10 // Pin für den Ausschalt-Taster des zweiten Strips
#define NUM_LEDS1 40 // Anzahl der LEDs im ersten Strip
#define NUM_LEDS2 88 // Gesamtanzahl der LEDs im zweiten Strip
#define BRIGHTNESS 100 // Helligkeit für das Lauflicht im ersten Strip
#define FULL_BRIGHTNESS 255 // Maximale Helligkeit
Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(NUM_LEDS1, LED_PIN1, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strip2 = Adafruit_NeoPixel(NUM_LEDS2, LED_PIN2, NEO_GRB + NEO_KHZ800);
bool sequenceRunning = false; // Status der zweiten Sequenz
void setup() {
strip1.begin();
strip2.begin();
strip1.show(); // Initialisiere alle LEDs als "aus"
strip2.show();
strip1.setBrightness(BRIGHTNESS); // Setze die allgemeine Helligkeit für den ersten Strip
pinMode(BUTTON_PIN1, INPUT_PULLUP); // Taster-Pin als Eingang definieren
pinMode(BUTTON_PIN2_ON, INPUT_PULLUP); // Ein-Taster für den zweiten Strip
pinMode(BUTTON_PIN2_OFF, INPUT_PULLUP); // Aus-Taster für den zweiten Strip
randomSeed(analogRead(0)); // Initialisiere den Zufallsgenerator
}
void loop() {
// Erster LED-Strip: Animation bei Tasterdruck
if (digitalRead(BUTTON_PIN1) == LOW) {
int meetPoint = random(10, NUM_LEDS1 - 10); // Zufällige Position im Bereich der LEDs
runAnimation1(meetPoint);
delay(500); // Debounce für den Taster
}
// Zweiter LED-Strip: Sequenz bei Tasterdruck
if (digitalRead(BUTTON_PIN2_ON) == LOW && !sequenceRunning) {
sequenceRunning = true;
runSequence();
}
if (digitalRead(BUTTON_PIN2_OFF) == LOW && sequenceRunning) {
reverseSequence();
sequenceRunning = false;
}
}
// Funktion für den ersten LED-Strip (Animation)
void runAnimation1(int meetPoint) {
int left1 = 0, left2 = 1; // Startpositionen auf der linken Seite
int right1 = NUM_LEDS1 - 1, right2 = NUM_LEDS1 - 2; // Startpositionen auf der rechten Seite
bool leftReached = false;
bool rightReached = false;
// LEDs an den Enden langsam bis zur vollen Helligkeit aufleuchten lassen
for (int i = 0; i <= BRIGHTNESS; i += 5) {
strip1.setPixelColor(left1, strip1.Color(i, 0, 0)); // Linke erste LED rot
strip1.setPixelColor(left2, strip1.Color(i, 0, 0)); // Linke zweite LED rot
strip1.setPixelColor(right1, strip1.Color(i, 0, 0)); // Rechte erste LED rot
strip1.setPixelColor(right2, strip1.Color(i, 0, 0)); // Rechte zweite LED rot
strip1.show();
delay(20); // Verzögerung für das langsame Aufleuchten
}
// LEDs wandern in Richtung des zufälligen Treffpunkts
while (!leftReached || !rightReached) {
strip1.clear();
strip1.setPixelColor(left1, strip1.Color(255, 0, 0)); // Linke erste LED rot
strip1.setPixelColor(left2, strip1.Color(255, 0, 0)); // Linke zweite LED rot
strip1.setPixelColor(right1, strip1.Color(255, 0, 0)); // Rechte erste LED rot
strip1.setPixelColor(right2, strip1.Color(255, 0, 0)); // Rechte zweite LED rot
// LEDs stoppen am Treffpunkt
if (left1 < meetPoint - 1) {
left1++;
left2++;
} else {
leftReached = true;
}
if (right1 > meetPoint + 1) {
right1--;
right2--;
} else {
rightReached = true;
}
strip1.show();
delay(DELAY_TIME); // Geschwindigkeit des Lauflichts
}
// LEDs am Treffpunkt aufleuchten lassen, bis die anderen eintreffen
strip1.setPixelColor(left1, strip1.Color(255, 0, 0)); // Linke erste LED am Treffpunkt
strip1.setPixelColor(right1, strip1.Color(255, 0, 0)); // Rechte erste LED am Treffpunkt
strip1.show();
delay(500); // Kurzes Aufleuchten
// Beide LEDs an der Treffpunktstelle kurz aufleuchten lassen
strip1.clear();
strip1.setPixelColor(meetPoint, strip1.Color(255, 0, 0)); // LED am Treffpunkt
strip1.setPixelColor(meetPoint + 1, strip1.Color(255, 0, 0)); // LED am Treffpunkt
strip1.setBrightness(FULL_BRIGHTNESS); // Helligkeit auf Maximum setzen
strip1.show();
delay(500); // Kurzes Aufleuchten in voller Helligkeit
// LEDs ausschalten
strip1.clear();
strip1.show();
}
// Funktion für den zweiten LED-Strip (Sequenz bei Einschalten)
void runSequence() {
strip2.clear();
strip2.show();
// Beleuchtung "Kennzeichen"
strip2.setPixelColor(0, strip2.Color(255, 255, 255)); // Weiß, volle Helligkeit
strip2.show();
delay(2000);
// Beleuchtung "Deck 1"
for (int i = 1; i <= 9; i++) {
strip2.setPixelColor(i, strip2.Color(255, 140, 0)); // Warmweiß, halbe Helligkeit
}
strip2.show();
delay(1000);
// Beleuchtung "Deck 2"
for (int i = 10; i <= 27; i++) {
strip2.setPixelColor(i, strip2.Color(255, 140, 0)); // Warmweiß, halbe Helligkeit
}
strip2.show();
delay(3000);
// Beleuchtung "Primärhülle"
for (int i = 28; i <= 45; i++) {
strip2.setPixelColor(i, strip2.Color(255, 140, 0)); // Warmweiß, halbe Helligkeit
}
strip2.show();
delay(2000);
// Beleuchtung "Sekundärhülle"
for (int i = 46; i <= 63; i++) {
strip2.setPixelColor(i, strip2.Color(255, 140, 0)); // Warmweiß, halbe Helligkeit
}
strip2.show();
delay(2000);
// Beleuchtung "Deflektor"
for (int i = 64; i <= 71; i++) {
strip2.setPixelColor(i, strip2.Color(0, 0, 255)); // Blau, pulsierend
strip2.show();
delay(250); // Pulsieren, zeitversetzt
}
// Beleuchtung "Impulstriebwerk"
for (int i = 72; i <= 77; i++) {
strip2.setPixelColor(i, strip2.Color(255, 0, 0)); // Rot, pulsierend
strip2.show();
delay(250); // Pulsieren, zeitversetzt
}
// Beleuchtung "Navigation"
strip2.setPixelColor(78, strip2.Color(255, 0, 0)); // Rot, blinkend
strip2.setPixelColor(79, strip2.Color(0, 255, 0)); // Grün, blinkend
strip2.show();
delay(1000);
// Beleuchtung "Position"
for (int i = 80; i <= 85; i++) {
strip2.setPixelColor(i, strip2.Color(255, 255, 255)); // Weiß, blinkend
}
strip2.show();
delay(5000);
// Beleuchtung "Bussard"
for (int i = 86; i <= 91; i++) {
strip2.setPixelColor(i, strip2.Color(255, 0, 0)); // Rot, pulsierend
strip2.show();
delay(250); // Pulsieren, zeitversetzt
}
// Beleuchtung "Nacelles"
for (int i = 92; i <= 111; i++) {
strip2.setPixelColor(i, strip2.Color(0, 0, 255)); // Blau, pulsierend
strip2.show();
delay(250); // Pulsieren, zeitversetzt
}
}
// Funktion für den zweiten LED-Strip (Sequenz bei Ausschalten)
void reverseSequence() {
// Umgekehrte Reihenfolge der Beleuchtungen, mit entsprechenden Delays und Effekten
// Die Sequenz sollte hier entsprechend rückwärts ablaufen, bis alle LEDs aus sind.
// ...
strip2.clear();
strip2.show();
}