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

Ik ben aan het opruimen. door Arjan6511
Vandaag om 11:09:20
wat is het merk van deze bochtwissel door Theovh
Vandaag om 11:05:03
De bouw van mijn modelbaan in Thailand door puntenglijder
Vandaag om 10:52:52
Liliput schlafwagen set epoche 2 h0 door Stefan88
Vandaag om 10:40:45
Centraal Zwitserland: Trein, tram, kabelbaan en gondels. door Hans van de Burgt
Vandaag om 10:37:35
BNLS-Module: "Rvbr-Btk, Ringvaartbrug Haarlemmermeer nabij Buitenkaag" NS H0 door MOVisser
Vandaag om 10:27:47
Show je werkplek door 1200blauw
Vandaag om 10:25:18
Mitropa slaaprijtuigen epoche 2 door Huup
Vandaag om 10:04:44
N-Wagen; Brawa, ESU of Piko door LMX
Vandaag om 10:04:34
Ervaringen met veilingsites enzo (Marktplaats, Ebay, Catawiki, etc). door Martijn1974
Vandaag om 09:15:46
mitropa rijtuig door Tomasso
Vandaag om 08:06:17
Spoorhumor door Tomasso
Vandaag om 07:50:22
Station Roodeschool door Eric B
Vandaag om 06:58:31
Houten 23 Augustus 2025 door Peter J K
29 July 2025, 23:22:40
BMB 00-Modulebaan, BMB-Rijdagen en BMB-Deelname aan Beurzen & Evenementen door nighttrain1
29 July 2025, 23:13:57
US diorama in H0 door Wim Vink
29 July 2025, 23:04:15
Goederenloods Zandvoort door nighttrain1
29 July 2025, 22:56:17
Schets Weistra regeling met arduino UNO door keesg
29 July 2025, 22:50:52
Haperende/Gevoelige Sik: wat te doen? door MOVisser
29 July 2025, 22:07:07
Waldbrunn an der Veluwe. Romantiek in H0 (2R) door Ronald Halma
29 July 2025, 21:48:46
RocRail locomotief verandert van rijrichting na wachten in blok door Felix de Groen
29 July 2025, 21:40:58
Mijn eerste H0-modeltreinbaan in aanbouw door Frank 123
29 July 2025, 21:20:05
schok bij vertrek door Ronald Halma
29 July 2025, 20:14:18
Holcim Betonmixers 1:87 Modelauto,s door NL-modelspoor
29 July 2025, 19:49:56
Eén leuke of mooie trein/spoor foto van je vakantie. door defender
29 July 2025, 19:19:07
Fleischmann Anna ombouw. door puntenglijder
29 July 2025, 19:17:42
Ronald doet de Fork Challenge! door hervé
29 July 2025, 19:00:12
Nederland jaren 50 op basis van mijn roots door defender
29 July 2025, 18:59:23
Spoorongeval Duitsland, 27-7-2025 door VictorPM
29 July 2025, 18:44:54
lampjes in huizen willekeurig schakelen door Ronald Schreuder
29 July 2025, 17:46:55
  

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

Ronald Schreuder

  • Offline Offline
  • Berichten: 60
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: 909
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: 909
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: 909
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: 60
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 »