Zum Hauptinhalt springen

Aufgabe: Beacon-LED blinken lassen

In dieser Aufgabe bringst du deine Beacon-LED zum Blinken – so wie ein echtes Warnlicht 🚨
Du lernst, wie man mit Zeitsteuerung arbeitet und den Arduino nicht unnötig blockiert, sondern weiterarbeiten lässt.


🛠️ Ziel

  • Die Beacon-LED soll in einem regelmäßigen Rhythmus blinken (an – aus – an – aus …)
  • Der Arduino soll währenddessen noch andere Aufgaben übernehmen.

🧠 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 beaconLedPin = 3;

2. Setup: Pin als Ausgang

void setup() {
pinMode(beaconLedPin, 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(beaconLedPin, !digitalRead(beaconLedPin)); // 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 LED und setzen den previousMillis-Wert zurück.

💡 Blinkfrequenz in Hertz

  • Die Blinkfrequenz gibt an, wie oft die LED in einer Sekunde blinkt.
  • 1 Hertz (Hz) bedeutet, dass die LED einmal pro Sekunde blinken soll.
  • 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.


✅ Checkliste

  • Die LED blinkt in regelmäßigen Intervallen
  • Du hast millis() verwendet, um die LED zu steuern
  • Die Blinkfrequenz lässt sich durch das Intervall in Millisekunden steuern

🔥 Bonus-Idee: Das Beacon-Licht pulsieren lassen

Nun lassen wir das Beacon-Licht sanft pulsieren, als ob es in einem Rhythmus "atmend" an- und ausgeht.

  • Wir werden die Helligkeit der Beacon-LED 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 beaconLedPin = 3;

2. Loop: LED pulsieren lassen

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

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

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

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

analogWrite(beaconLedPin, 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.


✅ Checkliste Pulsieren

  • Die LED wird sanft heller und dunkler
  • Du verwendest analogWrite() zur Steuerung der Helligkeit
  • Die LED verändert ihre Helligkeit in beide Richtungen (auf und ab)