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.