pussy123:
Ja, ich möchte die erste EIN-Schaltung gerne viel früher als 3 Minuten und 40 Sekunden, z.B. nach 10 Sekunden. Die Schaltlogik wäre mir erstmal egal.
Ich habe den Sketch mal so geändert, dass im setup() die bereits abgelaufene Taktzeit auf 90% der kompletten Taktzeit gesetzt werden kann.
ledtime[i]= -ledtakt[i]*9/10; // mit negativer Ablaufzeit initialisieren
Dadurch springen die LEDs nun das erste mal nach Ablauf von 10% der jeweiligen Taktzeit an.
Die Led mit einer Taktzeit von 220000L leuchtet also das erste mal nicht erst nach 220 Sekunden, sondern startet bereits nach 22 Sekunden. Danach geht es dann mit dem konfigurierten Schalttakt weiter.
Geänderter Code:
/* Simulation "belebtes Haus für die Modellbahn" by jurs */
/* Version "Flimmern nur wenn die Pin-13 LED an ist */
byte pwmFlimmerPin=10; // PWM Pin für das "analoge" Flimmern
unsigned long flimmerStart,flimmerEnd; // Anfangs- und Endzeiten für das Flimmern
// LED Pins für das normale Blinken deklarieren
byte leds[] ={ 9, 11, 12, 13};
// LED Blinktakt in Millisekunden für diese Pins
long ledtakt[]={220000L, 303330L, 500000L, 921000L};
// Variablen zum Merken von millis()-Zeiten beim Schalten/Blinken
unsigned long ledtime[sizeof(leds)];
void setup() {
// Serial.begin(9600);
// Alle verwendeten Pins auf OUTPUT setzen
pinMode(pwmFlimmerPin, OUTPUT);
for (int i=0;i<sizeof(leds);i++)
{
pinMode(leds[i], OUTPUT);
ledtime[i]= -ledtakt[i]*9/10; // mit negativer Ablaufzeit initialisieren
}
}
boolean milliSekundenTakt(long dauer, unsigned long &alterWert) {
// Parameter "dauer": Dauer einer Blinkphase (an bzw. aus)
// Parameter "alterWert": Variable zum Speichern des millis() Timers
// Rückgabewert: true wenn die Zeit bis zum nächsten Umschalten abgelaufen ist, sonst false
if (millis() - alterWert < dauer) return false;
while (millis() - alterWert >= dauer) alterWert+=dauer;
return true;
}
void blinkenImTakt() {
// Alle gleichmäßig blinkenden LEDs in ihrem eigenen Takt blinken lassen
for (int i=0;i<sizeof(leds);i++) // alle LEDs in einer Schleife durchgehen
{
if (milliSekundenTakt(ledtakt[i],ledtime[i])) // Takt für diese LED abgelaufen?
{
digitalWrite(leds[i],!digitalRead(leds[i])); // wenn ja ==> Umschalten
if (leds[i]==13 && digitalRead(leds[i])) // Pin-13 LED wurde gerade eingeschaltet
{
flimmerStart=ledtime[i]+4000; // Anfangszeit für das Flimmern setzen
flimmerEnd =ledtime[i]+ledtakt[i]-8000; // Endzeit für das Flimmern setzen
}
// Serial.print("Pin ");Serial.print(leds[i]);Serial.print(" = ");Serial.println(digitalRead(leds[i]));
}
}
}
void flimmernPwmPin() {
// Die flimmernde LED im Zufallsmodus flimmern lassen
static unsigned long alterWert;
static int flimmerDauer=200;
static byte flimmerHelligkeit;
if (milliSekundenTakt(flimmerDauer,alterWert)) // Takt abgelaufen?
{
flimmerDauer=1+random(200); // neue Flimmerdauer als Zufallswert
if (millis()>flimmerStart && millis()<flimmerEnd)
{
flimmerHelligkeit=random(256); // neue Flimmerhelligkeit als Zufallswert
// Serial.println(flimmerHelligkeit);
}
else
flimmerHelligkeit=0; // Flimmern aus wenn falsche Zeit zum Flimmern
analogWrite(pwmFlimmerPin, flimmerHelligkeit);
}
}
void loop() {
blinkenImTakt();
flimmernPwmPin();
}


