genau so ist das gemeint.
Alles klar, anbei mein Codevorschlag.
// Leuchtturm LEDs schalten by Jurs im Arduino-Forum Deutsch
//
// LED: Pin-Nummer der zu schaltenden LED
// gesamt= Gesamtlänge aller Timings zusammen für einen Zyklus des Leuchtturms
// n= Anzahl der nachfolgenden ein/aus Timings
// LED gesamt n ein aus ein aus ein aus ein aus
int Norderney_timing[]={ 2, 12000, 6, 200, 2800, 200, 2800, 200 , 5800};
int Pilsum_timing[] ={ 3, 20500, 4, 3000, 3000, 3000,11500};
int Campen_timing[] ={13, 15000, 8, 700, 2300, 700, 2300, 700, 2300, 700, 5300};
int Schillig_timing[] ={ 5, 12000, 2, 6000, 6000};
int Voslapp_timing[] ={ 6, 9000, 2, 6000, 3000};
int Tossens_timing[] ={ 7, 7000, 2, 6000, 1000};
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
// define OUTPUT pins
pinMode(Norderney_timing[0], OUTPUT);
pinMode(Pilsum_timing[0], OUTPUT);
pinMode(Campen_timing[0], OUTPUT);
pinMode(Schillig_timing[0], OUTPUT);
pinMode(Voslapp_timing[0], OUTPUT);
pinMode(Tossens_timing[0], OUTPUT);
}
void TurmStatus(int* Turmdata)
{
// Anfangs von eingeschaltetem Blinkstatus ausgehen
boolean blinkStatusOn=true;
// Zeit im Blinkzyklus per Modulo-Arithmetik
// aus millis() und der Gesamt-Zykluszeit des Turms errechnen
long inCycleTime=millis() % Turmdata[1];
int onoffCount=Turmdata[2]; // Anzahl der ein/aus Schaltungen
while (onoffCount>0 && inCycleTime-Turmdata[3+Turmdata[2]-onoffCount]>0)
{
// bereits abgelaufene Blinkzeit abziehen
inCycleTime-=Turmdata[3+Turmdata[2]-onoffCount];
onoffCount--; // Anzahl der ein/aus Schaltungen vermindert
blinkStatusOn=!blinkStatusOn; // Blinkstatus wechselt
}
// wenn alles durch, dann den errechneten Blinkstatus setzen
digitalWrite(Turmdata[0], blinkStatusOn);
}
void loop() {
TurmStatus(Norderney_timing);
TurmStatus(Pilsum_timing);
TurmStatus(Campen_timing);
TurmStatus(Schillig_timing);
TurmStatus(Voslapp_timing);
TurmStatus(Tossens_timing);
// put the rest of your loop code here
}
In das Daten-Array pro Leuchtturm habe ich nun noch drei weitere Werte gepackt, und zwar
- LED: die Pin-Nummer des zu schaltenden Arduino Digital-Pins
- gesamt: die Gesamt-Zykluslänge (alle ein/aus-Einzelzeiten zusammengezählt)
- n: die Anzahl der ein/aus Schaltungen an diesem Leuchtturm pro Zyklus
So konnte ich den Code kurz halten und trotz der einfachen Programmlogik ohne zusätzliche Libraries sollten die Schaltzeiten zwar nicht auf die Mikrosekunde genau, aber auf einem 16 MHz Arduino doch so ca. +/- zwei Millisekunden eingehalten werden.
Natürlich gibt es immer mehrere Möglichkeiten, so etwas zu programmieren.