Zum Hauptinhalt springen

Aufgabe: Navigationslichter steuern

Jetzt wird’s dynamisch! In dieser Aufgabe lernst du, wie du verschiedene LED-Signale gleichzeitig und unabhängig voneinander steuern kannst – ganz wie bei echten Navigationslichtern an Fahrzeugen oder Flugobjekten. 🛸

🛠️ Ziel

  • Die LEDs sollen unterschiedliche Blinkmuster gleichzeitig zeigen.
  • Du verwendest dazu millis() statt delay(), damit dein Arduino mehrere Dinge gleichzeitig tun kann.

⚙️ Aufgabe: Navigationslichter mit millis() steuern

Wir unterteilen die Aufgabe in drei Schritte:

🔴 Teil 1: Zwei LEDs abwechselnd blinken lassen

Schreibe ein Programm, das zwei LEDs abwechselnd blinken lässt:

LED A an → LED B an → LED A an …

Das Blinken erfolgt im mit 2Hz, aber nicht gleichzeitig.

Auflösung
const int portLedPin = 5;
const int starboardLedPin = 6;

unsigned long previousMillis = 0;
const long interval = 500; // 0,5 Sekunden = 2Hz
bool ledAState = true;

void setup() {
pinMode(portLedPin, OUTPUT);
pinMode(starboardLedPin, OUTPUT);
}

void loop() {
unsigned long currentMillis = millis();

if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;

// LED-Zustände wechseln
ledAState = !ledAState;
digitalWrite(portLedPin, ledAState ? HIGH : LOW);
digitalWrite(starboardLedPin, ledAState ? LOW : HIGH);
}
}

🟡 Teil 2: Dritte LED mit eigener Frequenz (1 Hz) hinzufügen

Schreibe ein Programm, sodass eine dritte LED (LED C) unabhängig von A und B blinkt.

Sie blinkt mit einer Frequenz von 1 Hz (alle 1 Sekunde an/aus).

Auflösung
const int beaconLed = 3;

unsigned long previousMillisC = 0;
const long intervalC = 1000;
bool ledCState = false;

void setup() {
pinMode(beaconLed, OUTPUT);
}

void loop() {
unsigned long currentMillis = millis();

// Beacon LED steuern
if (currentMillis - previousMillisC >= intervalC) {
previousMillisC = currentMillis;
ledCState = !ledCState;
digitalWrite(beaconLed, ledCState ? HIGH : LOW);

// oder ganz elegant:
//digitalWrite(beaconLed, !digitalRead(beaconLed));
}

// (Hier kannst du zusätzlich Teil 1 einfügen, um alle drei LEDs gleichzeitig zu steuern.)
}

Hinweis: Wenn du Teil 1 und 2 kombinierst, füge den Code von Teil 1 in den gleichen loop() ein – sie stören sich nicht, solange sie eigene previousMillis-Variablen haben.

🟢 Teil 3: Pulsierende Beacon-LED mit analogWrite()

Schreibe ein Programm, sodass die Beacon LED sanft pulsiert, also heller und dunkler wird – als ob sie atmet.

Auflösung
const int beaconLed = 3;  // Muss PWM-fähig sein

int brightness = 0;
int fadeAmount = 5;

unsigned long previousMillisD = 0;
const long intervalD = 30;

void setup() {
pinMode(beaconLed, OUTPUT);
}

void loop() {
unsigned long currentMillis = millis();

if (currentMillis - previousMillisD >= intervalD) {
previousMillisD = currentMillis;

analogWrite(beaconLed, brightness);
brightness += fadeAmount;

if (brightness <= 0 || brightness >= 255) {
fadeAmount = -fadeAmount; // Richtung ändern
}
}
}

Bonus: Gesamtbeispiel

Natürlich kannst du alle drei Teile kombinieren!

Hier ist ein Beispiel, wie das aussehen könnte:
const int portLedPin = 5;       // z.B. rot
const int starboardLedPin = 6; // z.B. grün
const int beaconLedPin = 3; // PWM-fähig
const int strobeLedPin = BUILTIN_LED; // einfaches Blinken

// Port & Starboard (abwechselnd)
unsigned long previousMillisAB = 0;
const long intervalAB = 500;
bool ledAState = true;

// Strobe
unsigned long previousMillisStrobe = 0;
const long intervalStrobe = 1000;
bool strobeState = false;

// Beacon (pulsierend)
int brightness = 0;
int fadeAmount = 5;
unsigned long previousMillisBeacon = 0;
const long intervalBeacon = 30;

void setup() {
pinMode(portLedPin, OUTPUT);
pinMode(starboardLedPin, OUTPUT);
pinMode(strobeLedPin, OUTPUT);
pinMode(beaconLedPin, OUTPUT);
}

void loop() {
unsigned long currentMillis = millis();

// 🔴 Navigationslichter A/B (abwechselnd)
if (currentMillis - previousMillisAB >= intervalAB) {
previousMillisAB = currentMillis;
ledAState = !ledAState;
digitalWrite(portLedPin, ledAState ? HIGH : LOW);
digitalWrite(starboardLedPin, ledAState ? LOW : HIGH);
}

// 🟡 Strobe (1 Hz)
if (currentMillis - previousMillisStrobe >= intervalStrobe) {
previousMillisStrobe = currentMillis;
strobeState = !strobeState;
digitalWrite(strobeLedPin, strobeState ? HIGH : LOW);
}

// 🟢 Beacon (pulsierend)
if (currentMillis - previousMillisBeacon >= intervalBeacon) {
previousMillisBeacon = currentMillis;
analogWrite(beaconLedPin, brightness);
brightness += fadeAmount;
if (brightness <= 0 || brightness >= 255) {
fadeAmount = -fadeAmount;
}
}
}

✅ Checkliste

  • Nav Lights blinken abwechselnd
  • Beacon pulsiert sanft mit analogWrite()
  • Du verwendest millis() statt delay() für alle Timings
  • Alle LEDs laufen gleichzeitig, ohne sich zu stören

🧪 Bonus: Frequenzen anpassen

  • Ändere die interval-Werte, um die Blinkmuster anzupassen.
  • Lässt sich z.B. auf reale Verkehrslichter oder Flugzeuglichter übertragen.