Anzeige

Leuchtturm und Leuchttonnen mit Arduino

Ich hab eine Nutzerfrage von Falk bekommen. Wie kann man eine LED ein- und ausfaden, während gleichzeitig zwei andere LEDs in unterschiedlichen Geschwindigkeiten blinken? In diesem Projekt geht es darum, einen Leuchtturm und zwei Leuchttonnen für eine Modelleisenbahn zu betreiben. Man nennt diese Signale in der Seefahrt übrigens Befeuerung. Sehen wir uns das genauer an.

Bauteile

Schaltplan

Die Schaltung besteht aus der Teilschaltungen die sich jeweils aus einem Vorwiderstand von 220 Ohm (rot-rot-braun, bzw. rot-rot-schwarz-schwarz) und einer LED zusammensetzen.

Code: Leuchtturm und Leuchttonnen mit Arduino

Sehen wir uns erst einmal den Code für eine einzelne LED an. Zuerst müssen wir doch eine ganze Menge an Hilfsvariablen deklarieren. Neben dem Pin, an dem die LED angeschlossen ist, legen wir das Array led1Timeout an. Es speichert die Dauer der einzelnen Leuchtphasen. Die erste Phase soll 500, die zweite 1000 Millisekunden dauern. Die Phasen repräsentieren abwechselnd leuchten und nicht leuchten. Da es in der Arduino-Sprache C keine Methode gibt, um die Länge eines Arrays zuverlässig zu erfragen, legen wir eine Variable an, die die Länge des Arrays speichert: led1Phases.

Die Variable led1Phase speichert die aktuelle Phase der LED, d.h. also in diesem Fall entweder 0 oder 1. Die Variable led1State wird bei jedem Phasenwechsel umgekehrt und im späteren Programmverlauf verwendet, um die LED ein- oder auszuschalten. Als letzte Variable benötigen wir led1Timer. Sie wird für die Timer-Funktion benötigt. Was Timer funktionieren habe ich hier für dich zusammengefasst: Timer mit Arduino – Alternative zu Delays.

int led1Pin = 2;        // LED Pin für Tonne 1 (rote LED)
int led1Timeout[] = {500,1000};                  //  Phasendauer Led 1
int led1Phases = 2;     // speichert die Anzahl der Phasen
int led1Phase = 0;      // Aktuelle Phase der LED 
int led1State = 1;      // LED Zustand 1 = an, -1 = aus
long led1Timer = 0;     // LED timer 

In der setup()-Methode konfigurieren wir den led1Pin als OUTPUT und starten den Timer.

void setup() {
  pinMode(led1Pin, OUTPUT);   // Pin wird als Output deklariert
  led1Timer = millis();       // Start des Timers
}

Im Loop prüfen wir erstmal den Timer. Wenn er abgelaufen ist, wird die Phase der LED erhöht: led1Phase++ Nun müssen wir prüfen, ob es überhaupt so viele LED-Phasen gibt. Wenn nicht, wird led1Phase auf 0 gesetzt. Die Variable led1State wird mit -1 multipliziert, was zu einer Wertumkehrung führt. Diese nutzen wir um die LED ein- oder auszuschalten, je nachdem, ob led1State größer oder kleiner 0 ist.

void loop() {
  // LED 1 Handling
  if (millis()>led1Timer+led1Timeout[led1Phase]){     // prüft den Timer
      led1Phase++;                                    // erhöht die Leuchtphase um 1
      if (led1Phase>led1Phases-1){                    // falls Leuchtphasenmaximum überschritten
        led1Phase = 0;                                // Leuchtphase zurücksetzen
      }
      led1Timer = millis();                           // Timer resetten
      led1State *= (-1);                              // LED Zustand wird umgekehrt 
      if (led1State>0) digitalWrite(led1Pin, HIGH);   // wenn LED Zustand > 0, schalte LED ein
      else digitalWrite(led1Pin, LOW);                // wenn LED Zustand < 0, schalte LED aus
  }

  delay(20);                                          // kurze Pause
}

Hier nochmal der zusammenhängende Code für eine LED:

int led1Pin = 2;        // LED Pin für Tonne 1 (rote LED)
int led1Timeout[] = {500,1000};                  //  Phasendauer Led 1
int led1Phases = 2;     // speichert die Anzahl der Phasen
int led1Phase = 0;      // Aktuelle Phase der LED 
int led1State = 1;      // LED Zustand 1 = an, -1 = aus
long led1Timer = 0;     // LED timer 

void setup() {
  Serial.begin(115200);
  pinMode(led1Pin, OUTPUT);   // Pin wird als Output deklariert
  led1Timer = millis();       // Start des Timers
}

void loop() {
  // LED 1 Handling
  if (millis()>led1Timer+led1Timeout[led1Phase]){     // prüft den Timer
      led1Phase++;                                    // erhöht die Leuchtphase um 1
      if (led1Phase>led1Phases-1){                    // falls Leuchtphasenmaximum überschritten
        led1Phase = 0;                                // Leuchtphase zurücksetzen
      }
      led1Timer = millis();                           // Timer resetten
      led1State *= (-1);                              // LED Zustand wird umgekehrt 
      if (led1State>0) digitalWrite(led1Pin, HIGH);   // wenn LED Zustand > 0, schalte LED ein
      else digitalWrite(led1Pin, LOW);                // wenn LED Zustand < 0, schalte LED aus
  }

  delay(20);                                          // kurze Pause
}

Damit haben wir erstmal eine sehr komplizierte Version des Arduino-Blink-Beispiels erschaffen. Es ermöglicht uns aber, durch copy&paste mehr LEDs in unterschiedlichen Intervallen blinken zu lassen. Der folgende Code umfasst zwei unterschiedlich blinkende LEDs und eine ein- und ausfadende LED. Die fadende LED ist das Signalfeuer des Leuchtturms, die beiden blinkenden LEDs die der Tonnen.

int led1Pin = 2;        // LED Pin für Tonne 1 (rote LED)
int led2Pin = 3;        // LED Pin für Tonne 2 (grüne LED)
int led3Pin = 5;        // LED Pin für Leuchtturm

int led1Timeout[] = {500,1000};                  //  Phasendauer Led 1
int led2Timeout[] = {100,200,100,1500};          //  Phasendauer Led 2
int led3Timeout[] = {500,500,1500};              //  Phasendauer Led 3

int led1Phases = 2;     // speichert die Anzahl der Phasen
int led2Phases = 4;     // speichert die Anzahl der Phasen
int led3Phases = 3;     // speichert die Anzahl der Phasen

int led1Phase = 0;      // Aktuelle Phase der LED 
int led2Phase = 0;      // Aktuelle Phase der LED 
int led3Phase = 0;      // Aktuelle Phase der LED 

int led1State = 1;      // LED Zustand 1 = an, -1 = aus
int led2State = 1;      // LED Zustand 1 = an, -1 = aus
int led3State = 0;      // LED Zustand von 0 - 255 = Leuchtstärke

long led1Timer = 0;     // LED timer 
long led2Timer = 0;     // LED timer 
long led3Timer = 0;     // LED timer 

void setup() {
  Serial.begin(115200);
  pinMode(led1Pin, OUTPUT);   // Pin wird als Output deklariert
  pinMode(led2Pin, OUTPUT);   // Pin wird als Output deklariert
  led1Timer = millis();       // Start des Timers
  led2Timer = millis();       // Start des Timers
}

void loop() {
  // LED 1 Handling
  if (millis()>led1Timer+led1Timeout[led1Phase]){     // prüft den Timer
      led1Phase++;                                    // erhöht die Leuchtphase um 1
      if (led1Phase>led1Phases-1){                    // falls Leuchtphasenmaximum überschritten
        led1Phase = 0;                                // Leuchtphase zurücksetzen
      }
      led1Timer = millis();                           // Timer resetten
      led1State *= (-1);                              // LED Zustand wird umgekehrt 
      if (led1State>0) digitalWrite(led1Pin, HIGH);   // wenn LED Zustand > 0, schalte LED ein
      else digitalWrite(led1Pin, LOW);                // wenn LED Zustand < 0, schalte LED aus
  }

  // LED 2 Handling
  if (millis()>led2Timer+led2Timeout[led2Phase]){     // prüft den Timer
      led2Phase++;                                    // erhöht die Leuchtphase um 1
      if (led2Phase>led2Phases-1){                    // falls Leuchtphasenmaximum überschritten
        led2Phase = 0;                                // Leuchtphase zurücksetzen
      }
      led2Timer = millis();                           // Timer resetten
      led2State *= (-1);                              // LED Zustand wird umgekehrt 
      if (led2State>0) digitalWrite(led2Pin, HIGH);   // wenn LED Zustand > 0, schalte LED ein
      else digitalWrite(led2Pin, LOW);                // wenn LED Zustand < 0, schalte LED aus
  }

  // LED 3 Handling Fading
  if (millis()>led3Timer+led3Timeout[led3Phase]){     // prüft den Timer
      led3Phase++;                                    // erhöht die Leuchtphase um 1
      if (led3Phase>led3Phases-1){                    // falls Leuchtphasenmaximum überschritten
        led3Phase = 0;                                // Leuchtphase zurücksetzen
      }
      led3Timer = millis();                           // Timer resetten
  }

  if (led3Phase==0) {                                 // wenn led3State == 0, dann einfaden
    analogWrite(led3Pin, map(millis()-led3Timer,0,led3Timeout[0],0,255));
  } else if (led3Phase==1) {                          // wenn led3State == 1, dann ausfaden
    analogWrite(led3Pin, 255-map(millis()-led3Timer,0,led3Timeout[0],0,255));
  } else if (led3Phase==2){                           // wenn led3State == 1, dann ausschalten
    analogWrite(led3Pin, 0);  
  }

  delay(20);                                          // kurze Pause
}


Wenn dir das Projekt gefallen hat und du von weiteren interessanten Projekten inspiriert werden willst, sieh dir doch mal mein neues E-Book an!

Darin findest du die beliebtesten Arduino-Projekte von StartHardware. Jedes Projekt umfasst Schaltplan, Bauteile, Beschreibung und Code. Für Einsteiger gibt es ein Arduino-Schnellstart-Kapitel und einen kompakten Programmierkurs. Zusätzlich findest du Zwischenkapitel mit Expertenwissen zu den Komponenten, die verwendet werden. Alle Code-Beispiele gibt es natürlich als Download.

Weitere Informationen findest du auf der Produktseite. Klicke jetzt auf den Button, um Details anzusehen.


Welches Projekt würdest du gern auf dieser Seite finden? Worüber soll ich schreiben? *


Stefan Hermann

Ich bin Stefan und arbeite seit 2007 mit Arduino. Als Designer und Produktmanager setze ich das Board in erster Linie zum Bau von Prototypen ein. Hier teile ich meine Faszination und Erfahrung mit dir!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

 

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.