Leuchtturmkarte Deutsche Bucht mit original getakteten Leuchtfeuern

Hallo, ich habe für eine Seekarte meinen Arduino Duemilenova gem. nachstehendem Sketch mit den original Taktfrequenzen der wesentlichen Leuchttürme konfiguriert.

/*
 0 1 gr. Leuchtturm Borkum 1       Taktung: Fl (2) 12s
 1 2 Fischerbalje 4                Taktung: Oc (2) 16s
 2 3 Juister Memmertfeuer          Taktung: Oc (2) 14s
 3 4 Campen                        Taktung: Fl 5s, Fl(4) 15s
 4 8 Norderney-Seefeuer            Taktung: Fl (3) 12s
 5 9 Helgoland                     Taktung: Fl 5s w
 6 10 Helgoland-Düne               Taktung: Iso 4s
 7 11 Wooge neuer LT 2             Taktung: Fl 5s r
 8 13 Arngast                      Taktung: Fl (2) 9s/Ubr. 6s
 9 14 Tegeler Plate                Taktung: Oc (3) 12s
 10 16 Robbenplate                 Taktung: Oc 6s
 11 17 Kleiner Preuße              Taktung: Iso 5s
 12 19 Neuwerk                     Taktung: LFl (3) 20s
 13 20 Großerpater                 Taktung: Iso 4s
 14 22 BHV Unterfeuer Minarett 2   Taktung: Iso 4s
 15 23 BHV Oberfeuer Loschenturm 3 Taktung: Iso 4s
*/




#include <MsTimer2.h>


uint8_t setOutput(uint8_t pin) {
   pinMode(pin, OUTPUT);
   return 0;
   }

template <uint8_t led, uint32_t d1, uint32_t d2, uint32_t d3, uint32_t d4,
                      uint32_t d5, uint32_t d6, uint32_t d7, uint32_t d8>
void light_my_fire() {
   static uint32_t phase = setOutput(led);
    
   phase = phase < d1+d2+d3+d4+d5+d6+d7+d8-1? phase+1: 0;

   digitalWrite(led, phase < d1                     ? HIGH:
                     phase < d1+d2                  ? LOW:
                     phase < d1+d2+d3               ? HIGH:
                     phase < d1+d2+d3+d4            ? LOW:
                     phase < d1+d2+d3+d4+d5         ? HIGH:
                     phase < d1+d2+d3+d4+d5+d6      ? LOW:
                     phase < d1+d2+d3+d4+d5+d6+d7   ? HIGH:
                                                      LOW); 
                                                                      
} 

// Schaltfolge:    LED ein   aus   ein  aus    ein  aus   ein   aus  
void blink() {
   light_my_fire< 0,  200, 2800,  200, 8800,      0,  0,    0,    0>();  // gr. LT Borkum Fl (2) 12s
   light_my_fire< 1,    0, 1000,  5000, 1000,  9000,  0,    0,    0>();  // Fischerbalje 4 Oc (2) 16s
   light_my_fire< 2,    0, 1000,  4000, 1000,  8000,  0,    0,    0>();  // Juister Memmertfeuer Oc (2) 14s
   light_my_fire< 3,  700, 2300,  700, 2300,  700, 2300,  700, 5300>();  // Campen Fl(4) 15s
   light_my_fire< 4,  200, 2800,  200, 2800,  200, 5800,    0,    0>();  // Norderney Fl (3) 12s
   light_my_fire< 5,  400, 4600,    0,    0,    0,    0,    0,    0>();  // Helgoland Fl 5s
   light_my_fire< 6, 2000, 2000,    0,    0,    0,    0,    0,    0>();  // Helgoland-Düne Iso 4s
   light_my_fire< 7,  400, 4600,    0,    0,    0,    0,    0,    0>();  // Wooge neuer LT Fl 5s, r
   light_my_fire< 8,  200, 2800,  200, 7800, 4000,    0,    0,    0>();  // Arngast Fl (2) 9s/Ubr. 6s
   light_my_fire< 9,    0, 1000, 2000, 1000, 2000, 1000, 5000,    0>();  // Tegeler Plate Oc (3) 12s
   light_my_fire<10,    0, 2000, 4000,    0,    0,    0,    0,    0>();  // Robbenplate Oc 6s
   light_my_fire<11, 2500, 2500,    0,    0,    0,    0,    0,    0>();  // Kleiner Preuße Iso 5s
   light_my_fire<12, 2000, 4000, 2000, 4000, 2000, 6000,    0,    0>();  // Neuwerk LFl (3) 20s
   light_my_fire<13, 2000, 2000,    0,    0,    0,    0,    0,    0>();  // Großpater Iso 4s
   light_my_fire<14, 2000, 2000,    0,    0,    0,    0,    0,    0>();  // BHV Unterfeuer Minarett 2  Iso 4s
   light_my_fire<15, 2000, 2000,    0,    0,    0,    0,    0,    0>();  // BHV Oberfeuer Loschenturm 3  Iso 4s
}

void setup() {
   MsTimer2::set(1, blink);
   MsTimer2::start();
  }

void loop() {  
 }

Da bei den Drehfeuern der Leuchttürme, das Licht für den Beobachter an- und abschwillt, möchte ich diesen Effekt z.B. mit dem nachstehenden Sketch Fade nachbilden: 
s. Link [url=https://www.arduino.cc/en/Tutorial/AnalogWriteMega]https://www.arduino.cc/en/Tutorial/AnalogWriteMega[/url]

Ich habe die entsprechenden Codes vom AnalogWriteMega in meinen o.g. Sketch wie folgt eingebunden:

[code]
/*
 0 1 gr. Leuchtturm Borkum 1       Taktung: Fl (2) 12s
 1 2 Fischerbalje 4                Taktung: Oc (2) 16s
 2 3 Juister Memmertfeuer          Taktung: Oc (2) 14s
 3 4 Campen                        Taktung: Fl 5s, Fl(4) 15s
 4 8 Norderney-Seefeuer            Taktung: Fl (3) 12s
 5 9 Helgoland                     Taktung: Fl 5s w
 6 10 Helgoland-Düne               Taktung: Iso 4s
 7 11 Wooge neuer LT 2             Taktung: Fl 5s r
 8 13 Arngast                      Taktung: Fl (2) 9s/Ubr. 6s
 9 14 Tegeler Plate                Taktung: Oc (3) 12s
 10 16 Robbenplate                 Taktung: Oc 6s
 11 17 Kleiner Preuße              Taktung: Iso 5s
 12 19 Neuwerk                     Taktung: LFl (3) 20s
 13 20 Großerpater                 Taktung: Iso 4s
 14 22 BHV Unterfeuer Minarett 2   Taktung: Iso 4s
 15 23 BHV Oberfeuer Loschenturm 3 Taktung: Iso 4s
*/




#include <MsTimer2.h>

const int lowestPin = 0;
const int highestPin = 13;
    
uint8_t setOutput(uint8_t pin) {
   pinMode(pin, OUTPUT);
   return 0;
   }

template <uint8_t led, uint32_t d1, uint32_t d2, uint32_t d3, uint32_t d4,
                      uint32_t d5, uint32_t d6, uint32_t d7, uint32_t d8>
void light_my_fire() {
   static uint32_t phase = setOutput(led);
    
   phase = phase < d1+d2+d3+d4+d5+d6+d7+d8-1? phase+1: 0;

   digitalWrite(led, phase < d1                     ? HIGH:
                     phase < d1+d2                  ? LOW:
                     phase < d1+d2+d3               ? HIGH:
                     phase < d1+d2+d3+d4            ? LOW:
                     phase < d1+d2+d3+d4+d5         ? HIGH:
                     phase < d1+d2+d3+d4+d5+d6      ? LOW:
                     phase < d1+d2+d3+d4+d5+d6+d7   ? HIGH:
                                                      LOW); 
                                                                      
} 

// Schaltfolge:    LED ein   aus   ein  aus    ein  aus   ein   aus  
void blink() {
   light_my_fire< 0,  200, 2800,  200, 8800,      0,  0,    0,    0>();  // gr. LT Borkum Fl (2) 12s
   light_my_fire< 1,    0, 1000,  5000, 1000,  9000,  0,    0,    0>();  // Fischerbalje 4 Oc (2) 16s
   light_my_fire< 2,    0, 1000,  4000, 1000,  8000,  0,    0,    0>();  // Juister Memmertfeuer Oc (2) 14s
   light_my_fire< 3,  700, 2300,  700, 2300,  700, 2300,  700, 5300>();  // Campen Fl(4) 15s
   light_my_fire< 4,  200, 2800,  200, 2800,  200, 5800,    0,    0>();  // Norderney Fl (3) 12s
   light_my_fire< 5,  400, 4600,    0,    0,    0,    0,    0,    0>();  // Helgoland Fl 5s
   light_my_fire< 6, 2000, 2000,    0,    0,    0,    0,    0,    0>();  // Helgoland-Düne Iso 4s
   light_my_fire< 7,  400, 4600,    0,    0,    0,    0,    0,    0>();  // Wooge neuer LT Fl 5s, r
   light_my_fire< 8,  200, 2800,  200, 7800, 4000,    0,    0,    0>();  // Arngast Fl (2) 9s/Ubr. 6s
   light_my_fire< 9,    0, 1000, 2000, 1000, 2000, 1000, 5000,    0>();  // Tegeler Plate Oc (3) 12s
   light_my_fire<10,    0, 2000, 4000,    0,    0,    0,    0,    0>();  // Robbenplate Oc 6s
   light_my_fire<11, 2500, 2500,    0,    0,    0,    0,    0,    0>();  // Kleiner Preuße Iso 5s
   light_my_fire<12, 2000, 4000, 2000, 4000, 2000, 6000,    0,    0>();  // Neuwerk LFl (3) 20s
   light_my_fire<13, 2000, 2000,    0,    0,    0,    0,    0,    0>();  // Großpater Iso 4s
   light_my_fire<14, 2000, 2000,    0,    0,    0,    0,    0,    0>();  // BHV Unterfeuer Minarett 2  Iso 4s
}

void setup() {
   MsTimer2::set(1, blink);
   MsTimer2::start();
   for (int thisPin = lowestPin; thisPin <= highestPin; thisPin++) {
   pinMode(thisPin, OUTPUT);
   }  
}

void loop() {  
 // iterate over the pins:
 for (int thisPin = lowestPin; thisPin <= highestPin; thisPin++) {
   // fade the LED on thisPin from off to brightest:
   for (int brightness = 0; brightness < 255; brightness++) {
     analogWrite(thisPin, brightness);
     delay(5);
   }
   // fade the LED on thisPin from brithstest to off:
   for (int brightness = 255; brightness >= 0; brightness--) {
     analogWrite(thisPin, brightness);
     delay(5);
   }
   // pause between LEDs:
   delay(1000);
 }
}

Der Sketch läuft zwar auf meinem Arduino, aber dieses Fading springt von einer LED zur nächsten und ist nur sehr schwach als flackerndes Aufglimmen zusehen. Leider kann ich kein Video anhängen.

Da ich blutjunger Anfänger bzgl. Compiler-Programmierung bin, habe ich keine Ahnung, wie ich dieses Fading so in meinen Leuchtturmsketch einbinden muss, damit jede im Takt blinkende LED diesen Fade-Effekt aufnimmt.

Für hilfreiche Infos wäre ich sehr dankbar!

LG Umcharly

Fotos?
Video?
Aufbau?
Schaltplan?
Doku?

Mindestens zwei der oberen Punkte wäre schön.

Gruß
DerDani

Ich denke er hat eine Frage dazu die am Ende im Code steht wegen fehlendem Tag

Der Sketch läuft zwar auf meinem Arduino, aber dieses Fading springt von einer LED zur nächsten und ist nur sehr schwach als flackerndes Aufglimmen zusehen. Leider kann ich kein Video anhängen.

Da ich blutjunger Anfänger bzgl. Compiler-Programmierung bin, habe ich keine Ahnung, wie ich dieses Fading so in meinen Leuchtturmsketch einbinden muss, damit jede im Takt blinkende LED diesen Fade-Effekt aufnimmt.

Für hilfreiche Infos wäre ich sehr dankbar!

LG Umcharly

Hallo Dani,

bisher habe ich nur den Programmcode für die Leuchttürme auf einem Arduino-Board Duemilanove mit 20 integrierten LED's installiert, um zu sehen, ob dass was ich vorhabe softwaremäßig funktioniert. Sie anliegendes Foto. Video kann ich leider nicht anhängen (66MB).

Bevor ich mit dem Aufbau der Leuchtseekarte beginne, möchte ich sicher sein, dass das Programm auch so funkioniert, wie ich es mir vorstelle.

Das Problem besteht lediglich noch in der programmtechnischen Realisierung des Fade-Effektes für die Leuchttürme.

LG Umcharly

Das Problem besteht lediglich noch in der programmtechnischen Realisierung des Fade-Effektes für die Leuchttürme.

Dann schau dir mal analogWrite an, und bemerke, dass PWM längst nicht für alle Pins eines Duemilanove ( atmega168 / atmega328 ) geht.
Schade.
Such mal "SoftPWM Arduino"

Umcharly:
bisher habe ich nur den Programmcode für die Leuchttürme auf einem Arduino-Board Duemilanove mit 20 integrierten LED's installiert, um zu sehen, ob dass was ich vorhabe softwaremäßig funktioniert.

Dir ist aber schon klar, dass ein Atmega328 von seinen 20 Pins insgesamt nur an 6 Pins überhaupt ein PWM-Signal per analogWrite ausgeben kann: 3, 5, 6, 9, 10, und 11?

Aus Deinem Code geht eher hervor, dass Du mindestens von Pin-D0 bis Pin-D13 durchgängig PWM-Signale ausgeben möchtest:

// iterate over the pins:
 for (int thisPin = lowestPin; thisPin <= highestPin; thisPin++) {
   // fade the LED on thisPin from off to brightest:
   for (int brightness = 0; brightness < 255; brightness++) {
     analogWrite(thisPin, brightness);
     delay(5);
   }

Umcharly:
Das Problem besteht lediglich noch in der programmtechnischen Realisierung des Fade-Effektes für die Leuchttürme.

Träume ruhig weiter! So viele Pins wie Du per PWM ansteuern möchtest, hat ein Atmega328 überhaupt nicht als PWM-Pins verfügbar! Dein Vorhaben hapert mitnichten "nur noch in der programmtechnischen Realisierung", sondern es hapert bereits bei der Atmega328-Hardware, dass diese nur 6 PWM-Ausgänge bereitstellt.

Wenn Du nicht mit der verfügbaren Anzahl PWM-Ausgänge in Schwierigkeiten geraten möchtest, könntest Du ggf. WS2812 LEDs mit eigenem PWM-LED-Controller verwenden, und alle 20 LEDs (oder auch noch viel mehr) über nur einen einzigen Arduino-Ausgang ansteuern (mit der FastLED oder NeoPixel Library), und das bei Bedarf sogar bunt und in Farbe.

In einem Sketch der Pins blinken lässt, diese plötzlich einfach per analogWrite() anzusteuern ist generell etwas abwegig. Der Trick in dem Sketch von Udo besteht darin die Blink-Zeiten besonders kreativ zu verwalten.

Ich bin gerade über diese Thema gestolpert, da ich den Borkumer Leuchtturm mit 7 PWM-LEDs am Arduino MICRO nachgebildet habe, um das Auf- und Abblenden etwas sanfter zu gestalten.

Anregungen: