, kan ik de output voor de straatlantaarns een paar keer laten knipperen om hem dan constant te laten branden?
kan ik de output voor de straatlantaarns een paar keer laten knipperen om hem dan constant te laten branden?
Waarom wil je dat? Het is een misverstand dat straatlantaarns met TL knipperen bij het inschakelen. Die armaturen zijn starterloos, er zitten zelfstartende buizen in en die knipperen niet.
Je hebt vast gelijk Klaas maar voor het leuk is ook een reden Ronald. Aansturen kan ook via DCC. Relais zijn wat old school. Zelf gebruik is een (eigen) at mega ic op een print met connectoren en een DCC ingang. Namaken is een eitje..
Omdat ik dat leuk vind.Niet knipperen vind ik saai.
Ja het wordt waarschijnlijk aansturen via een DCC decoder.
// Flikkeren -> Halve helderheid -> Fade-up -> Pauze -> Herstartconst int pwmPin = 9; // PWM output pin voor Ledconst int enablePin = 2; // Enable pin met pull-up, start de sequentie bij schakelen naar 0// parametersconst int minBrightness = 60; // minimale helderheidconst int maxBrightness = 255; // maximale helderheidconst int warmupDuration = 5000; // flikkertijdconst int fullBrightnessPause = 3000; // Na flikkeren en fade up start de sequentie na de ingesteld tijd opnieuwint fadeDuration = 5000; // na flikkeleren start de Led op 50% helderheid en gaat in de ingeschakelde tijd naar max// Status variabelenenum LightState { OFF, FLICKER, HALF, FADE_UP, PAUSE };LightState currentState = OFF;unsigned long stateStartTime;int currentBrightness = 0;bool isEnabled = false;void setup() { pinMode(pwmPin, OUTPUT); pinMode(enablePin, INPUT_PULLUP); analogWrite(pwmPin, 0); randomSeed(analogRead(5));}void loop() { unsigned long currentTime = millis(); unsigned long stateTime = currentTime - stateStartTime; // Schakelaar logica if (!digitalRead(enablePin) && !isEnabled) { isEnabled = true; currentState = FLICKER; stateStartTime = currentTime; } else if (digitalRead(enablePin) && isEnabled) { isEnabled = false; currentState = OFF; analogWrite(pwmPin, 0); } if (!isEnabled) return; // State machine voor laslicht gedrag switch (currentState) { case FLICKER: if (stateTime < warmupDuration) { // *** fase currentBrightness = random(minBrightness, maxBrightness * 0.7); analogWrite(pwmPin, currentBrightness); delay(50); } else { currentState = HALF; stateStartTime = currentTime; currentBrightness = maxBrightness / 2; analogWrite(pwmPin, currentBrightness); } break; case HALF: if (stateTime >= 1000) { currentState = FADE_UP; stateStartTime = currentTime; } break; case FADE_UP: { float progress = min(1.0, (float)stateTime / fadeDuration); currentBrightness = maxBrightness / 2 + (maxBrightness / 2) * progress; analogWrite(pwmPin, currentBrightness); if (progress >= 1.0) { currentState = PAUSE; stateStartTime = currentTime; } break; } case PAUSE: if (stateTime >= fullBrightnessPause) { // Herstart de hele sequentie currentState = FLICKER; stateStartTime = currentTime; } break; }}
// next lines for randomLeds// Configuratieconst int numLeds = 5; // Aantal LED'sconst int ledPins[numLeds] = { 3, 4, 5, 6, 7 }; // Pinnen waar de LED's op aangesloten zijn, pins 2 & 9 reserved for LedFlash// Min en max aan-tijden in milliseconden voor elke LEDconst unsigned long minTimes[numLeds] = { 1000, 1000, 1000, 1000, 1000 }; // Minimale aan-tijd per LEDconst unsigned long maxTimes[numLeds] = { 3000, 3000, 3000, 3000, 3000 }; // Maximale aan-tijd per LED// Variabelen voor timingunsigned long previousTimes[numLeds]; // Laatste keer dat elke LED veranderdeunsigned long intervals[numLeds]; // Huidige interval voor elke LEDbool ledStates[numLeds]; // Huidige staat van elke LED// next lines for ledFlash// Flikkeren -> Halve helderheid -> Fade-up -> Pauze -> Herstartconst int pwmPin = 9; // PWM output pin voor Ledconst int enablePin = 2; // Enable pin met pull-up, start de sequentie bij schakelen naar 0// parametersconst int minBrightness = 60; // minimale helderheidconst int maxBrightness = 255; // maximale helderheidconst int warmupDuration = 5000; // flikkertijdconst int fullBrightnessPause = 3000; // Na flikkeren en fade up start de sequentie na de ingesteld tijd opnieuwint fadeDuration = 5000; // na flikkeren start de Led op 50% helderheid en gaat in de ingeschakelde tijd naar max// Status variabelenenum LightState { OFF, FLICKER, HALF, FADE_UP, PAUSE };LightState currentState = OFF;unsigned long stateStartTime;int currentBrightness = 0;bool isEnabled = false;void setup() { Serial.begin(9600); // next lines for randomLeds // Stel alle LED-pinnen in als OUTPUT // Initialiseer LED pinnen als OUTPUT for (int i = 0; i < numLeds; i++) { pinMode(ledPins[i], OUTPUT); ledStates[i] = LOW; // digitalWrite(ledPins[i], ledStates); digitalWrite(ledPins[i], LOW); previousTimes[i] = 0; intervals[i] = random(minTimes, maxTimes); } // next lines for ledFlash pinMode(pwmPin, OUTPUT); pinMode(enablePin, INPUT_PULLUP); analogWrite(pwmPin, 0);}void loop() { randomLeds(); // switch random leds on and off, put // in front of line to switch off ledFlash(); // switch led on with flikkering effect, put // in front of line to switch off}void randomLeds() { unsigned long currentTime = millis(); for (int i = 0; i < numLeds; i++) { // Controleer of het tijd is om de LED te schakelen if (currentTime - previousTimes[i] >= intervals[i]) { // Schakel de LED ledStates[i] = !ledStates[i]; digitalWrite(ledPins[i], ledStates[i]); // Update de vorige schakeltijd previousTimes[i] = currentTime; // Bepaal een nieuw random interval voor de volgende schakeling if (ledStates[i] == HIGH) { // LED gaat aan - gebruik aan-tijd interval intervals[i] = random(minTimes[i], maxTimes[i]); } else { // LED gaat uit - gebruik een korte uit-tijd (of pas aan-tijd aan) // Hier gebruiken we de helft van de minimale aan-tijd als uit-tijd intervals[i] = minTimes[i] / 2; } // Debug output (optioneel) Serial.print("ledPins "); Serial.print(ledPins[i]); Serial.print("LED "); Serial.print(i); Serial.print(": "); Serial.print(ledStates ? "AAN" : "UIT"); Serial.print(", Volgende schakeling in: "); Serial.println(intervals[i]); } }}void ledFlash() { unsigned long currentTime = millis(); unsigned long stateTime = currentTime - stateStartTime; // Schakelaar logica if (!digitalRead(enablePin) && !isEnabled) { isEnabled = true; currentState = FLICKER; stateStartTime = currentTime; } else if (digitalRead(enablePin) && isEnabled) { isEnabled = false; currentState = OFF; analogWrite(pwmPin, 0); } if (!isEnabled) return; // State machine voor laslicht gedrag switch (currentState) { case FLICKER: if (stateTime < warmupDuration) { // *** fase currentBrightness = random(minBrightness, maxBrightness * 0.7); analogWrite(pwmPin, currentBrightness); delay(50); } else { currentState = HALF; stateStartTime = currentTime; currentBrightness = maxBrightness / 2; analogWrite(pwmPin, currentBrightness); } break; case HALF: if (stateTime >= 1000) { currentState = FADE_UP; stateStartTime = currentTime; } break; case FADE_UP: { float progress = min(1.0, (float)stateTime / fadeDuration); currentBrightness = maxBrightness / 2 + (maxBrightness / 2) * progress; analogWrite(pwmPin, currentBrightness); if (progress >= 1.0) { currentState = PAUSE; stateStartTime = currentTime; } break; } case PAUSE: if (stateTime >= fullBrightnessPause) { // Herstart de hele sequentie currentState = FLICKER; stateStartTime = currentTime; } break; }}