Doel:€250.00
Donaties:€88.00

Per saldo:€-162.00

Steun ons nu!

Laatst bijgewerkt
op 03-06-2025

Vacature: secretaris bestuur
Algemeen

De stichting

Recente berichten

24e smalspoormodelbouwdagen 30 en 31 augustus 2025 bij Stoomtrein Katwijk Leiden door MOVisser
Vandaag om 19:28:31
Wat was jullie allereerste loc? door Marcel112
Vandaag om 19:25:04
Vijfhuis (v.h. Frotterdam) door Nebenbahn Ep3
Vandaag om 19:18:59
Fleischmann Anna ombouw. door Erwin 054
Vandaag om 19:15:10
NS 9500 scratch build uit Fleischmann BR94 door Erwin 054
Vandaag om 19:10:57
Mijn eerste H0-modeltreinbaan in aanbouw door Frank 123
Vandaag om 19:06:40
Module vliegveld Jan van Mourik door Modellbahnwagen
Vandaag om 18:56:12
Antislipband vervangen van Fleischmann 4065 door Albert de Heer
Vandaag om 18:47:08
De bouw van mijn modelbaan in Thailand door Flevodienst 1976
Vandaag om 18:30:14
Yamorc:loconet goes loco door Dirk
Vandaag om 18:24:44
Dordrechtse Dwarsliggerwagens door marco
Vandaag om 18:06:22
Nederlandse trams in HO tijdperk 3 door Bart van der Meer
Vandaag om 17:17:10
lampjes in huizen willekeurig schakelen door Ronald Schreuder
Vandaag om 17:13:17
US diorama in H0 door puntenglijder
Vandaag om 16:33:32
Aanbrengen van (kleine) nummerplaten en dergelijke door FransW
Vandaag om 16:19:29
Aanbrengen nummerschildjes, maar met welke lijm? door FransW
Vandaag om 16:17:23
Toon hier je nieuwe (model-) spooraanwinst(en)... door MarcNL
Vandaag om 15:21:46
BNLS-Module: "Rvbr-Btk, Ringvaartbrug Haarlemmermeer nabij Buitenkaag" NS H0 door NS264
Vandaag om 14:49:58
Vitrinekast door Hasenwald
Vandaag om 14:34:01
Verwijderen van het nummer op Roco 1631 – tips gezocht door Ben
Vandaag om 13:15:07
Mooi weer om buiten te spelen door Eric B
Vandaag om 13:02:12
Da's Daz 2 door Keska
Vandaag om 12:53:48
Sounddecoder in Roco BR101 door bellejt
Vandaag om 12:29:42
Ombouw/Pimpen Bolle neuzen door Eric B
Vandaag om 11:37:31
Van British Railways Class 58 naar ACTS 5814 in 0 door RobbertJan
Vandaag om 10:55:10
Allereerste lok(je) door henk
Vandaag om 10:39:29
Bentheimer Eisenbahn, gisteren, vandaag en morgen. door Hans Reints
Vandaag om 10:37:30
Noorwegen - interessante spoorzaken langs vakantieroute door martijnhaman
Vandaag om 10:34:01
Bauarbeiten im gange door puntenglijder
Vandaag om 09:32:05
Aachenau West door puntenglijder
Vandaag om 07:48:44
  

Auteur Topic: lampjes in huizen willekeurig schakelen  (gelezen 8005 keer)

Ronald Schreuder

  • Offline Offline
  • Berichten: 65
Re: lampjes in huizen willekeurig schakelen
« Reactie #60 Gepost op: 26 July 2025, 11:12:49 »
Goedemorgen Bert,

Ben vanmorgen met je eerste sketch bezig geweest, voor de lantaarns.
Leuk, leuk, nog leuker!
Het werkt goed, heb 4 lantaarns in serie aangesloten op 12 V, en dat gaat goed! Beetje knipperen, beetje faden en dan vol aan, perfect!
Ik kan geen video uploaden, maar ben heel tevreden.
Alleen de herhaling mag eruit, als ik opstart kan hij gewoon aanblijven totdat de 'enablepin' wordt uitgezet. Dat doe ik dan met een on/off contact op een schakeldecoder.
Ik vindt dit zo leuk, wist niet dat dit allemaal mogelijk was, en met heel weinig middelen. nu nog dieper induiken op het zelf programmeren, want ik heb nog veel meer ideeën! (ophaalbrug met brugseinen en stappenmotor) Dat gaat allemaal goed komen.
Ik moet zo werken, late dienst, maar ga morgen of overmorgen verder met de tweede sketch, om het totaal te testen, maar ben nu al heel erg tevreden.
Bedankt (Bas ook) dat jullie mij hiermee zo goed helpen.


« Laatst bewerkt op: 26 July 2025, 11:17:53 door Ronald Schreuder »

Bert55

  • Offline Offline
  • Berichten: 915
Re: lampjes in huizen willekeurig schakelen
« Reactie #61 Gepost op: 26 July 2025, 12:40:29 »
Graag gedaan, leuk dat het inspireert.
De herhaling haal ik er vanavond of morgen voor je uit.
Met vriendelijke groet, Bert
Märklin, DCCnext, ECOS
Witmoosdorf afgebroken, Witmoos 2 wordt opgestart na de verhuizing

Bert55

  • Offline Offline
  • Berichten: 915
Re: lampjes in huizen willekeurig schakelen
« Reactie #62 Gepost op: 26 July 2025, 19:04:24 »
Hierbij de aangepaste sketch.

Nog even over nagedacht, om de loop er helemaal uit te laten lijkt me voor testdoeleinden niet handig maar je kunt best van mening verschillen.
Ik heb een flag toegevoegd die je zelf op 0 (geen loop) of 1 (wel loop) kunt zetten.
Zie regel 18:
const int enableLoop = 1;  // enables the restart, set to 1 to enable loop, 0 to disable loop.


// next lines for randomLeds
// Configuratie
const int numLeds = 5;                           // Aantal LED's
const 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 LED
const unsigned long minTimes[numLeds] = { 10000, 20000, 30000, 40000, 50000 };   // Minimale aan-tijd per LED
const unsigned long maxTimes[numLeds] = { 20000, 40000, 60000, 80000, 100000 };  // Maximale aan-tijd per LED

// Variabelen voor timing
unsigned long previousTimes[numLeds];  // Laatste keer dat elke LED veranderde
unsigned long intervals[numLeds];      // Huidige interval voor elke LED
bool ledStates[numLeds];               // Huidige staat van elke LED

// next lines for ledFlash
// Flikkeren -> Halve helderheid -> Fade-up -> Pauze -> Herstart (depending on enable loop)
const int pwmPin = 9;      // PWM output pin voor Led
const int enablePin = 2;   // Enable pin met pull-up, start de sequentie bij schakelen naar 0
const int enableLoop = 1;  // enables the restart, set to 1 to enable loop, 0 to disable loop

//  parameters
const int minBrightness = 10;          // minimale helderheid
const int maxBrightness = 255;         // maximale helderheid
const int warmupDuration = 5000;       // flikkertijd
const int fullBrightnessPause = 3000;  // Na flikkeren en fade up start de sequentie na de ingesteld tijd opnieuw
int fadeDuration = 5000;               // na flikkeren start de Led op 50% helderheid en gaat in de ingeschakelde tijd naar max

// Status variabelen
enum 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
      digitalWrite(ledPins[i], ledStates[i]);  // write current Ledstate
      ledStates[i] = !ledStates[i];            // change Ledstate


      // 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;
        intervals[i] = minTimes[i];
      }

      // 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); // origineel
        currentBrightness = random(minBrightness, maxBrightness);
        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 & enableLoop == 1) {
        // Herstart de hele sequentie
        currentState = FLICKER;
        stateStartTime = currentTime;
      }
      break;
  }
}

Uiteraard kun je ook de loop in zijn geheeld inactief maken of verwijderen.
Dat zijn deze regels:
case PAUSE:
    //   if (stateTime >= fullBrightnessPause & enableLoop == 1) {
    //     // Herstart de hele sequentie
    //     currentState = FLICKER;
    //     stateStartTime = currentTime;
    //   }
    //   break;

Er was nog iets wat mij niet zinde. Bij opstarten gaan alle random leds meteen aan, ik heb zelf liever dat de uitgangspositie allemaal uit is.

Dit heb ik gedaan door de volgende regels met elkaar te wisselen. Naar wens kun je dat terug draaien:
      digitalWrite(ledPins, ledStates);  // write current Ledstate
      ledStates = !ledStates;            // change Ledstate
Met vriendelijke groet, Bert
Märklin, DCCnext, ECOS
Witmoosdorf afgebroken, Witmoos 2 wordt opgestart na de verhuizing

Bert55

  • Offline Offline
  • Berichten: 915
Re: lampjes in huizen willekeurig schakelen
« Reactie #63 Gepost op: 27 July 2025, 12:17:17 »
Nu ik toch bezig ben, ik had nog een delay in de sketch staan, vaak niet zo'n probleem, maar ben er toch wat allergisch voor indien er meerdere processen tegelijk lopen.
Het delay vervangen door millis.

Hierbij de recente sketch, het deel met de // ervoor kun je wissen. Regel 119 ™ 133.

// next lines for randomLeds
// Configuratie
const int numLeds = 5;                           // Aantal LED's
const 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 LED
const unsigned long minTimes[numLeds] = { 10000, 20000, 30000, 40000, 50000 };   // Minimale aan-tijd per LED
const unsigned long maxTimes[numLeds] = { 20000, 40000, 60000, 80000, 100000 };  // Maximale aan-tijd per LED

// Variabelen voor timing
unsigned long previousTimes[numLeds];  // Laatste keer dat elke LED veranderde
unsigned long intervals[numLeds];      // Huidige interval voor elke LED
unsigned long lastFlickerTime;         // vertraging in FlickterTime
bool ledStates[numLeds];               // Huidige staat van elke LED

// next lines for ledFlash
// Flikkeren -> Halve helderheid -> Fade-up -> Pauze -> Herstart (depending on enable loop)
const int pwmPin = 9;      // PWM output pin voor Led
const int enablePin = 2;   // Enable pin met pull-up, start de sequentie bij schakelen naar 0
const int enableLoop = 1;  // enables the restart, set to 1 to enable loop, 0 to disable loop

//  parameters
const int minBrightness = 10;          // minimale helderheid
const int maxBrightness = 255;         // maximale helderheid
const int warmupDuration = 5000;       // flikkertijd
const int fullBrightnessPause = 3000;  // Na flikkeren en fade up start de sequentie na de ingesteld tijd opnieuw
int fadeDuration = 5000;               // na flikkeren start de Led op 50% helderheid en gaat in de ingeschakelde tijd naar max

// Status variabelen
enum 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
      digitalWrite(ledPins[i], ledStates[i]);  // write current Ledstate
      ledStates[i] = !ledStates[i];            // change Ledstate


      // 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;
        intervals[i] = minTimes[i];
      }

      // 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); // origineel
  //       currentBrightness = random(minBrightness, maxBrightness);
  //       analogWrite(pwmPin, currentBrightness);
  //       delay(50);
  //     } else {
  //       currentState = HALF;
  //       stateStartTime = currentTime;
  //       currentBrightness = maxBrightness / 2;
  //       analogWrite(pwmPin, currentBrightness);
  //     }
  //     break;

  switch (currentState) {
    case FLICKER:
      if (stateTime < warmupDuration) {
        // *** fase
        if (currentTime - lastFlickerTime >= 50) {  // Replaces delay(50)
          lastFlickerTime = currentTime;
          // currentBrightness = random(minBrightness, maxBrightness * 0.7); // origineel
          currentBrightness = random(minBrightness, maxBrightness);
          analogWrite(pwmPin, currentBrightness);
        }
      } 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;
      }
  }
}
Met vriendelijke groet, Bert
Märklin, DCCnext, ECOS
Witmoosdorf afgebroken, Witmoos 2 wordt opgestart na de verhuizing

Ronald Schreuder

  • Offline Offline
  • Berichten: 65
Re: lampjes in huizen willekeurig schakelen
« Reactie #64 Gepost op: 29 July 2025, 17:46:55 »
Bert, ik heb de laatste sketch getest, en ik ben uitermate tevreden. Ontzettend bedankt (Bas ook) voor alle moeite en tijd die jullie in mij hebben gestoken.
Ik ga er zeker verder mee, want ik vind het niet alleen leuk, maar ik leer hier ook veel van.
Volgende project is een ophaalbrug besturen, dat doe ik nu nog met een servo (schokkerig) met brugseinen erbij. Ben al aan het kijken voor een stappenmotor.

Nogmaals bedankt!
Gr Ronald
« Laatst bewerkt op: 29 July 2025, 18:39:12 door Ronald Schreuder »

Ronald Schreuder

  • Offline Offline
  • Berichten: 65
Re: lampjes in huizen willekeurig schakelen
« Reactie #65 Gepost op: 01 August 2025, 18:43:41 »
Bert, als je nog een keer tijd hebt, zou jij nog 1 ding voor mij willen doen?
De sketch in tweeën splitsen?
Dus 1 sketch met 7 outputs voor random aan/uit
en 1 sketch met 7 outputs voor de straatlantaarns?

Heeft geen haast, en als je er geen zin in hebt ook prima, maar als je wel zin en tijd hebt....

Gr Ronald

Bert55

  • Offline Offline
  • Berichten: 915
Re: lampjes in huizen willekeurig schakelen
« Reactie #66 Gepost op: 01 August 2025, 19:38:41 »
Geen probleem Ronald, doe ik 1 dezer dagen.
Met vriendelijke groet, Bert
Märklin, DCCnext, ECOS
Witmoosdorf afgebroken, Witmoos 2 wordt opgestart na de verhuizing

Bert55

  • Offline Offline
  • Berichten: 915
Re: lampjes in huizen willekeurig schakelen
« Reactie #67 Gepost op: 02 August 2025, 18:09:34 »
Ronald, alvast de eerste voor de random leds, de tijden kun je vast zelf aanpassen?

// Configuratie
const int numLeds = 7;              // Aantal LED's
const int ledPins[numLeds] = {2, 3, 4, 5, 6, 7, 8}; // Pinnen waar de LED's op aangesloten zijn
// Min en max aan-tijden in milliseconden voor elke LED
const unsigned long minTimes[numLeds] = {1000, 1000, 1000, 1000, 1000, 1000, 1000};  // Minimale aan-tijd per LED
const unsigned long maxTimes[numLeds] = {3000, 3000, 3000,3000, 3000, 3000, 3000 }; // Maximale aan-tijd per LED

// Variabelen voor timing
unsigned long previousTimes[numLeds]; // Laatste keer dat elke LED veranderde
unsigned long intervals[numLeds];     // Huidige interval voor elke LED
bool ledStates[numLeds];              // Huidige staat van elke LED

void setup() {
  // Initialiseer seriële communicatie (optioneel voor debugging)
  Serial.begin(9600);
 
  // Initialiseer LED pinnen als OUTPUT
  for (int i = 0; i < numLeds; i++) {
    pinMode(ledPins[i], OUTPUT);
    ledStates[i] = LOW;
    digitalWrite(ledPins[i], ledStates);
    previousTimes[i] = 0;
    intervals[i] = random(minTimes, maxTimes);
  }
}

Met vriendelijke groet, Bert
Märklin, DCCnext, ECOS
Witmoosdorf afgebroken, Witmoos 2 wordt opgestart na de verhuizing

Ronald Schreuder

  • Offline Offline
  • Berichten: 65
Re: lampjes in huizen willekeurig schakelen
« Reactie #68 Gepost op: 02 August 2025, 22:11:47 »
Hoi Bert, ja dat lukt!
Fijn, bedankt!

Bert55

  • Offline Offline
  • Berichten: 915
Re: lampjes in huizen willekeurig schakelen
« Reactie #69 Gepost op: Vandaag om 11:19:41 »
Hier dan de sketch voor de 7 uitgangen, "TL" met inschakel verschijnsel.

Paar opmerkingen:
Led 7 kan niet faden, de Nano's en ook Uno's hebben 6 PWM uitgangen. In de sketch gaat led 7 van 0 naar max en omgekeerd.
Je kunt led 7 verwijderen door het laatste getal in de arrays te verwijderen.
Vervang dan regel 5 door 6, 9 door 10 en 13/14 door 17/18.

// 7 LEDs met flikkeren -> halve helderheid -> fade-up -> pauze -> herstart (afhankelijk van enableLoop)
const int numLeds = 7;

// PWM output pins voor LEDs
const int pwmPins[] = { 3, 5, 6, 9, 10, 11, 13 };  // 7 outputs
//const int pwmPins[] = { 3, 5, 6, 9, 10, 11 };    // 6 outputs

// Enable pins met pull-up, start de sequentie bij schakelen naar GND
const int enablePins[] = { 2, 4, 7, 8, 12, A0, A1 };  // 7 outputs
// const int enablePins[] = { 2, 4, 7, 8, 12, A0, };  // 6  outputs

// Enables de restart voor elke LED (0 = geen loop, 1 = loop)     // 7 outputs
const int enableLoop[] = { 1, 1, 1, 1, 1, 1, 1 };  // Loop enabled. Pas aan per LED indien nodig
// const int enableLoop[] = { 0, 0, 0, 0, 0, 0, 0 };  // Loop disabled. Pas aan per LED indien nodig

// Enables de restart voor elke LED (0 = geen loop, 1 = loop)     // 6 outputs
// const int enableLoop[] = { 1, 1, 1, 1, 1, 1 };  // Loop enabled. Pas aan per LED indien nodig
// const int enableLoop[] = { 0, 0, 0, 0, 0, 0 };  // Loop disabled. Pas aan per LED indien nodig

// Parameters voor alle LEDs (kan per LED verschillend gemaakt worden)
const int minBrightness = 10;          // minimale helderheid
const int maxBrightness = 255;         // maximale helderheid
const int warmupDuration = 5000;       // flikkertijd
const int fullBrightnessPause = 3000;  // Pauze na fade-up
const int fadeDuration = 5000;         // duur van fade-up

// Status variabelen per LED
enum LightState { OFF,
                  FLICKER,
                  HALF,
                  FADE_UP,
                  PAUSE };
LightState currentState[numLeds] = { OFF };
unsigned long stateStartTime[numLeds];
unsigned long lastFlickerTime[numLeds];
int currentBrightness[numLeds] = { 0 };
bool isEnabled[numLeds] = { false };

void setup() {
  Serial.begin(9600);

  // Initialiseer alle pins
  for (int i = 0; i < numLeds; i++) {
    pinMode(pwmPins[i], OUTPUT);
    pinMode(enablePins[i], INPUT_PULLUP);
    analogWrite(pwmPins[i], 0);
  }
}

void loop() {
  for (int i = 0; i < numLeds; i++) {
    ledFlash(i);  // Verwerk elke LED afzonderlijk
  }
}

void ledFlash(int ledIndex) {
  unsigned long currentTime = millis();
  unsigned long stateTime = currentTime - stateStartTime[ledIndex];

  // Schakelaar logica
  if (!digitalRead(enablePins[ledIndex]) && !isEnabled[ledIndex]) {
    isEnabled[ledIndex] = true;
    currentState[ledIndex] = FLICKER;
    stateStartTime[ledIndex] = currentTime;
    Serial.print("LED ");
    Serial.print(ledIndex);
    Serial.println(" geactiveerd");
  } else {
    if (digitalRead(enablePins[ledIndex])) {
      isEnabled[ledIndex] = false;
      currentState[ledIndex] = OFF;
      analogWrite(pwmPins[ledIndex], 0);
    }
  }

  if (!isEnabled[ledIndex]) return;

  switch (currentState[ledIndex]) {
    case FLICKER:
      if (stateTime < warmupDuration) {
        // *** fase
        if (currentTime - lastFlickerTime[ledIndex] >= 50) {
          lastFlickerTime[ledIndex] = currentTime;
          currentBrightness[ledIndex] = random(minBrightness, maxBrightness);
          analogWrite(pwmPins[ledIndex], currentBrightness[ledIndex]);
        }
      } else {
        currentState[ledIndex] = HALF;
        stateStartTime[ledIndex] = currentTime;
        currentBrightness[ledIndex] = maxBrightness / 2;
        analogWrite(pwmPins[ledIndex], currentBrightness[ledIndex]);
        Serial.print("LED ");
        Serial.print(ledIndex);
        Serial.println(" halve helderheid");
      }
      break;

    case HALF:
      if (stateTime >= 1000) {
        currentState[ledIndex] = FADE_UP;
        stateStartTime[ledIndex] = currentTime;
        Serial.print("LED ");
        Serial.print(ledIndex);
        Serial.println(" start fade-up");
      }
      break;

    case FADE_UP:
      float progress = min(1.0, (float)stateTime / fadeDuration);
      currentBrightness[ledIndex] = maxBrightness / 2 + (maxBrightness / 2) * progress;
      analogWrite(pwmPins[ledIndex], currentBrightness[ledIndex]);

      if (progress >= 1.0) {
        currentState[ledIndex] = PAUSE;
        stateStartTime[ledIndex] = currentTime;
        Serial.print("LED ");
        Serial.print(ledIndex);
        Serial.println(" volle helderheid bereikt");
      }
      break;


    case PAUSE:
      if (stateTime >= fullBrightnessPause && enableLoop[ledIndex] == 1) {
        // Herstart de hele sequentie
        currentState[ledIndex] = FLICKER;
        stateStartTime[ledIndex] = currentTime;
        Serial.print("LED ");
        Serial.print(ledIndex);
        Serial.println(" herstart sequentie");
      }
      break;
  }
}
Met vriendelijke groet, Bert
Märklin, DCCnext, ECOS
Witmoosdorf afgebroken, Witmoos 2 wordt opgestart na de verhuizing

Ronald Schreuder

  • Offline Offline
  • Berichten: 65
Re: lampjes in huizen willekeurig schakelen
« Reactie #70 Gepost op: Vandaag om 16:31:47 »
Geweldig Bert, dank je wel.

1 opmerking, het gedeelte met

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
      digitalWrite(ledPins[i], ledStates[i]);  // write current Ledstate
      ledStates[i] = !ledStates[i];            // change Ledstate


      // 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;
        intervals[i] = minTimes[i];
      }

      // 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]);

Zit er niet bij (eerste sketch) is dit bewust?
Heb hem nog niet geprobeerd ivm werk, paar late diensten achter elkaar en verder druk.
Het verder aanpassen gaat prima lukken.
Nogmaals ontzettend bedankt

Bert55

  • Offline Offline
  • Berichten: 915
Re: lampjes in huizen willekeurig schakelen
« Reactie #71 Gepost op: Vandaag om 16:43:29 »
Ik begrijp niet precies met “ zat er niet bij” wat precies.
Kan best zijn dat ik niet consequent ben geweest. Het deel onder debug kan weg als je wilt.

Mochten er nog aanpassingen gewenst zijn, je weet me te vinden ;)
Met vriendelijke groet, Bert
Märklin, DCCnext, ECOS
Witmoosdorf afgebroken, Witmoos 2 wordt opgestart na de verhuizing

Ronald Schreuder

  • Offline Offline
  • Berichten: 65
Re: lampjes in huizen willekeurig schakelen
« Reactie #72 Gepost op: Vandaag om 17:02:15 »
Het gedeelte voor de random leds in het gesplitste gedeelte is anders dan het gedeelte voor de random leds in de sketch voor beide toepassingen (random + lantaarns)
Het stuk wat begint met
void randomLeds()
zit er niet in, of is dit niet meer nodig?

Deze regel in de lantaarns - sketch is ook anders,
int enablePins[] = { 2, 4, 7, 8, 12, A0, A1 };  // 7
Kan ik willekeurig welke pin met 'gnd' verbinden of moet ik voor elke uitgang een pin verbinden?
Als het kan zou ik het liefst 1 pin verbinden om elk kanaal (6 of 7) allemaal tegelijk te activeren



« Laatst bewerkt op: Vandaag om 17:10:00 door Ronald Schreuder »

Bert55

  • Offline Offline
  • Berichten: 915
Re: lampjes in huizen willekeurig schakelen
« Reactie #73 Gepost op: Vandaag om 17:05:52 »
Void randomleds is een subroutine.
Dat is overzichtelijk indien er meer sub programma’s staan in 1 sketch.

Nu staat het onder de void loop, en getest, dus zou ok moeten zijn.

Indien je wat tegenkomt hoor ik het vast.

Edit:
Wat betreft programmeren ben ik een hobbyist, dus het kan vast allemaal beter, als het werkt, is het ok denk ik dan maar.
Eerlijk gezegd heb ik dit ook voor mezelf in elkaar gedraaid  8)
« Laatst bewerkt op: Vandaag om 17:09:27 door Bert55 »
Met vriendelijke groet, Bert
Märklin, DCCnext, ECOS
Witmoosdorf afgebroken, Witmoos 2 wordt opgestart na de verhuizing

Ronald Schreuder

  • Offline Offline
  • Berichten: 65
Re: lampjes in huizen willekeurig schakelen
« Reactie #74 Gepost op: Vandaag om 17:13:17 »
Ah, je antwoord kwam terwijl ik aan het typen was. Perfect, ik ga het morgen of donderdag testen en dan hoor je het wel.
Ben heel blij met je hoor, en ik vind je een prima hobbyist.