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

Aanbrengen nummerschildjes, maar met welke lijm? door 1200blauw
Vandaag om 22:42:50
Mijn eerste H0-modeltreinbaan in aanbouw door wob
Vandaag om 22:36:58
Acherntal 2.0 H0 TP III/IV door wob
Vandaag om 22:30:44
Aanbrengen van (kleine) nummerplaten en dergelijke door hervé
Vandaag om 22:20:42
Aachenau West door wob
Vandaag om 22:20:42
NS 9500 scratch build uit Fleischmann BR94 door Erwin 054
Vandaag om 22:12:27
lampjes in huizen willekeurig schakelen door Ronald Schreuder
Vandaag om 22:11:47
BNLS-Module: "Rvbr-Btk, Ringvaartbrug Haarlemmermeer nabij Buitenkaag" NS H0 door nighttrain1
Vandaag om 21:56:06
BR-18.6 Schaal-0. door FritsT
Vandaag om 21:55:45
Toon hier je nieuwe (model-) spooraanwinst(en)... door Stefan88
Vandaag om 21:50:34
't Boemeltje door RobVille
Vandaag om 21:36:12
Ronald doet de Fork Challenge! door Frank 123
Vandaag om 21:24:59
Nieuwe ruimte voor baan na ca. 30 jaar door ruudns
Vandaag om 20:24:06
Modules van Kees Gorter (vervolg) door ca.gorter
Vandaag om 20:21:24
Mooi weer om buiten te spelen door Karben
Vandaag om 20:10:33
BMB-Module: “Corfe Castle Station” door Sofie
Vandaag om 19:52:29
Schets Weistra regeling met arduino UNO door keesg
Vandaag om 19:29:23
Länderbahn en Reichsbahn locomotieven. door puntenglijder
Vandaag om 19:05:08
Vitrinekast door Frits C
Vandaag om 19:03:57
Grootspoor in Frankrijk door ruben derks
Vandaag om 19:00:16
Bentheimer Eisenbahn, gisteren, vandaag en morgen. door Hans Reints
Vandaag om 18:41:20
Artikelen "Het matblad" door ES44C4
Vandaag om 18:24:12
Schwarzburg-Neuffen-Bahn door NS264
Vandaag om 18:15:26
Verwijderen van het nummer op Roco 1631 – tips gezocht door Jeroen Water
Vandaag om 17:59:56
Fleischmann Anna ombouw. door jerrytrein
Vandaag om 17:32:09
Raadplaatje door HIJ
Vandaag om 17:24:22
Märklin baanplan uitprinten op ware schaal door MOVisser
Vandaag om 17:16:11
Van British Railways Class 58 naar ACTS 5814 in 0 door BartvD
Vandaag om 16:29:02
"Litter Bin" voor Brits spoor en Britse modelspoorprojecten door JurS
Vandaag om 16:17:47
zondag 17 augustus De Karel over enkelspoor door Forever Rocofan
Vandaag om 16:03:46
  

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

Ronald Schreuder

  • Offline Offline
  • Berichten: 62
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: 912
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: 912
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: 912
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: 62
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: 62
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: 912
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: 912
Re: lampjes in huizen willekeurig schakelen
« Reactie #67 Gepost op: Vandaag om 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: 62
Re: lampjes in huizen willekeurig schakelen
« Reactie #68 Gepost op: Vandaag om 22:11:47 »
Hoi Bert, ja dat lukt!
Fijn, bedankt!