Zum Hauptinhalt springen

💥 Navigationslichte


💎 Ziel​

  • Die Navigationslichter programmieren
  • Die Navigationslichter blinken lassen
  • Die Navigationslichter pulsieren lassen
  • Die Navigationslichter mit unterschiedlichen Frequenzen blinken lassen

⭐ Allgmein​

  1. Öffne die Arduino IDE
  2. Erstelle ein neues Projekt

✨ Grundlagen Ein- und Ausschalten​

1. Anschluss​

Was für ein Anschluss es ist: Eingang oder Ausgang? → pinMode(PIN, INPUT/OUTPUT)

🔌 pinMode(pin, mode)

Damit sagst du: „Hey Arduino, dieser Pin ist ein Ausgang, ich will da Strom rausschicken!“

Beispiel:

pinMode(3, OUTPUT);

→ Pin 3 ist jetzt ein Ausgang, z.B. für eine LED.


2. Strom an oder aus​

Was an diesem Pin passieren soll: Strom an oder aus? → digitalWrite(PIN, HIGH/LOW)

💡 digitalWrite(pin, value)

Damit machst du den Pin an oder aus.

Beispiel:

digitalWrite(3, HIGH);  // LED an
digitalWrite(3, LOW); // LED aus

3. Helligkeit regeln​

Wie stark der Strom sein soll (optional): Helligkeit regeln → analogWrite(PIN, VALUE)

🌗 analogWrite(pin, value)

Hier kannst du die Helligkeit regeln. value ist eine Zahl zwischen 0 und 255:

  • 0 = ganz aus
  • 255 = volle Helligkeit
  • 127 = halb hell

Beispiel:

analogWrite(5, 200); // ziemlich hell

✨ Aufgabe Ein- und Ausschalten​

Zwar können wir immer direkt die Nummer des Pins hinschreiben, jedoch macht das die Entwicklung viel schwieriger. Deshalb vergeben wir echte Namen dafür, dies nennen wir eine Konstante.

Eine Konstante wird durch const erzeugt. Danach folgt der Typ, wir wollen eine Ganzzahl speichern, im Computer heißt das "integer" und wird hier als int angezeigt. Dann folgt noch der Name und die Zuweisung des Wertes.


1. Pin-Nummern festlegen​

const int portLedPin = 7;
const int starboardLedPin = 8;

Hier haben wir jetzt also dem Pin 7 hört auf portLedPin und Pin 8 auf starboardLedPin. Port und Starboard sind englisch für Backbord und Steuerbord.


2. Pins als Ausgänge festlegen​

Schreib das in die setup()-Funktion:

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

3. LEDs einschalten​

Schalte sie in der loop() ein:

void loop() {
analogWrite(portLedPin, 255); // Navigation links an
analogWrite(starboardLedPin, 255); // Navigation rechts an
}

🌟 Aufgabe LED Blinken lassen​

In dieser Aufgabe bringst du deine Navigationslichter zum Blinken
Du lernst, wie man mit Zeitsteuerung arbeitet und den Arduino nicht unnötig blockiert, sondern weiterarbeiten lässt.

Neue Konzepte: delay() und millis()


delay(ms)​

Mit delay() kannst du dem Arduino sagen, er soll für eine bestimmte Zeit einfach warten und nichts tun.
Die Zahl in Klammern gibt die Wartezeit in Millisekunden an.
Beispiel:

delay(1000); // warte 1 Sekunde
delay(500); // warte 0,5 Sekunden

Problem: Während der Arduino wartet, kann er nichts anderes tun. Deshalb verwenden wir später millis().


millis()​

millis() ist eine Funktion, die die verstrichene Zeit seit dem Start des Programms in Millisekunden zurückgibt. So kannst du Ereignisse steuern, ohne den Arduino zu blockieren.

Beispiel:

unsigned long lastTime = 0;  // Zeitpunkt des letzten Ereignisses
unsigned long interval = 1000; // 1 Sekunde (1000 Millisekunden)

void loop() {
unsigned long currentTime = millis(); // aktuelle Zeit

if (currentTime - lastTime >= interval) {
lastTime = currentTime; // speichere den Zeitpunkt
// Führe etwas aus
}
}

💫 Aufgabe: LED mit millis() blinken lassen​

1. Pin festlegen​

Falls du das noch nicht getan hast:

const int portLedPin = 7;
const int starboardLedPin = 8;

2. Setup: Pin als Ausgang​

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

3. Loop: LED blinken mit millis()​

Jetzt wird die LED alle 0,5 Sekunden blinken, aber ohne den Arduino zu blockieren.

unsigned long previousMillis = 0;  // Zeitpunkt des letzten Wechsels
const long interval = 500; // 0,5 Sekunden (500 Millisekunden)

void loop() {
unsigned long currentMillis = millis(); // aktuelle Zeit

if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis; // speichere den Zeitpunkt des Wechsels
digitalWrite(portLedPin, !digitalRead(portLedPin)); // toggle LED
digitalWrite(starboardLedPin, !digitalRead(starboardLedPin)); // toggle LED
}
}

Erklärung:

  • millis() gibt die verstrichene Zeit seit dem Start des Programms zurück.
  • Wir verwenden currentMillis - previousMillis, um den Unterschied zwischen der aktuellen Zeit und dem letzten Blinkzeitpunkt zu berechnen.
  • Wenn dieser Unterschied größer als das Intervall (500 ms) ist, blinken wir die LEDs und setzen den previousMillis-Wert zurück.

💡 Blinkfrequenz in Hertz​

  • Die Blinkfrequenz gibt an, wie oft die LEDs in einer Sekunde blinken.
  • 1 Hertz (Hz) bedeutet, dass die LEDs einmal pro Sekunde blinken sollen.
  • Wenn du die Häufigkeit des Blinkens ändern möchtest, musst du das Intervall anpassen:

Beispiel für eine Blinkfrequenz von 1 Hz (1 mal pro Sekunde):

const long interval = 1000;  // 1 Sekunde

Für eine Häufigkeit von 2 Hz (2 mal pro Sekunde) verwendest du ein Intervall von 500 ms.


🔥 Bonus-Idee: Die Lichter pulsieren lassen​

Nun lassen wir die Navigationslichter sanft pulsieren, als ob sie in einem Rhythmus "atmend" an- und ausgeht.

  • Wir werden die Helligkeit der Navigationslichter mit analogWrite() steuern, um einen sanften Übergang zwischen "an" und "aus" zu erzielen.

Aufgabe: Pulsierende LED​

Details

Musterlösung zum Pulsieren der LED 1. Setup: Pin als Ausgang

Falls noch nicht geschehen:

const int portLedPin = 7;
const int starboardLedPin = 8;

2. Loop: LED pulsieren lassen

int brightness = 0;  // Anfangshelligkeit
int fadeAmount = 5; // Wie schnell die LEDs heller/dunkler werden
unsigned long previousMillis = 0; // Zeitpunkt des letzten Wechsels
const long interval = 30; // Intervall für den Helligkeitswechsel

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

void loop() {
unsigned long currentMillis = millis(); // aktuelle Zeit

if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis; // speichere den Zeitpunkt des Wechsels

analogWrite(portLedPin, brightness); // Setze Helligkeit der LED
analogWrite(starboardLedPin, brightness); // Setze Helligkeit der LED

brightness += fadeAmount; // Erhöhe/verminde Helligkeit

if (brightness <= 0 || brightness >= 255) {
fadeAmount = -fadeAmount; // Ändere Richtung (heller/dunkler)
}
}
}

  • Erkennst du eine Schwachstelle an der millis()-Lösung? Nach welcher Zeit tritt sie auf? Ein Integer hat einen maximalen Wert 2 147 483 647.
Räsel-Auflösung

Es gibt ein Problem mit Integer Overflow, das passiert dann, wenn der Integer-Wert größer als der zulässige Wert ist, dann springt die Variable stark ins Negative. Dies passiert auch in echten Flugzeug-Computern und deshalb müssen die Flugzeuge regelmäßig neu gestartet werden.

Hier passiert es nach etwa 24 Tagen Dauerbetrieb.


☄️ Unterschidliche Blinkfrequenzen für die Navigationslichter​

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. 🛸

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 = 7;
const int starboardLedPin = 8;

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);
}
}