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

lampjes in huizen willekeurig schakelen door bask185
Vandaag om 00:15:11
DB Cargo gaat op Betuweroute proeven doen met automatisch rijdende locomotief door Bahn-AG
21 July 2025, 23:59:53
Sfeer op je modelbaan door René 4312
21 July 2025, 23:25:13
Bezetmelder brug in rolbrug blijft actief als rolbrug gestopt is door spock
21 July 2025, 23:18:52
BR-18.6 Schaal-0. door FritsT
21 July 2025, 23:03:58
Raadplaatje door Huup
21 July 2025, 22:39:08
Toon hier je (model)treinfoto's door Frank 123
21 July 2025, 22:05:35
Station Roodeschool door Torikoos
21 July 2025, 21:59:55
Toon hier je nieuwe (model-) spooraanwinst(en)... door wob
21 July 2025, 21:59:52
Länderbahn en Reichsbahn locomotieven. door 741230
21 July 2025, 20:44:16
Microstepper motoren voor armseinpalen door AP3737
21 July 2025, 20:39:50
Bentheimer Eisenbahn Stations gebouwen "Laarwald" door borotof
21 July 2025, 20:26:55
"Litter Bin" voor Brits spoor en Britse modelspoorprojecten door Martijn193
21 July 2025, 20:06:38
Centraal Zwitserland: Trein, tram, kabelbaan en gondels. door Hans van de Burgt
21 July 2025, 20:05:19
"Ein kleines Kalkwerk", een nieuwe tentoonstellingsbaan door 741230
21 July 2025, 20:04:49
NS 1700 transfers door Rick
21 July 2025, 19:51:29
Overstap naar HTM door GerardvV
21 July 2025, 19:50:12
Spooraccessoires in diverse schalen, 3D-geprint. door spoorfreak
21 July 2025, 19:48:41
BNLS Rijweekend 19 en 20 juli 2025 door MOVisser
21 July 2025, 18:59:34
Gezocht info en foto's van standaard dwarsliggerwagen door Rob Hagg
21 July 2025, 18:40:47
Mooi weer om buiten te spelen door puntenglijder
21 July 2025, 18:18:39
Br 38 Piko Superen. door Silvolde
21 July 2025, 17:32:46
Spoor- en tramweg parafernalia door Eric B
21 July 2025, 17:32:02
Gezocht: foto's NS Ks/Us (nu Klmos) door marco
21 July 2025, 17:15:33
Da's Daz 2 door BartvD
21 July 2025, 17:06:02
Stationsplein Baden Baden door Dion
21 July 2025, 17:00:00
Dat overkomt mij niet. door Benelux795
21 July 2025, 16:07:49
Het einde van de RhB- Chiavenna Stazione Merci door Hollandserhbfan
21 July 2025, 15:38:11
Wèhnich - Eén onbeduidend baantje op 1200 bij 1200mm door tothebeach
21 July 2025, 15:29:18
De bouw van mijn modelbaan in Thailand door Thai-Bundesbahn
21 July 2025, 14:40:06
  

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

bask185

  • Offline Offline
  • Berichten: 4980
Re: lampjes in huizen willekeurig schakelen
« Reactie #15 Gepost op: 21 July 2025, 13:21:27 »
Bert, de backticks werken hier niet, we hebben code tags op het forum  ::)

[ c o d e ]   [ / c o d e ]

// Configuratie
const int numLeds = 3;              // Aantal LED's
const int ledPins[numLeds] = {2, 3, 4}; // Pinnen waar de LED's op aangesloten zijn

// Min en max aan-tijden in milliseconden voor elke LED
const unsigned long minTimes[numLeds] = {100, 200, 300};  // Minimale aan-tijd per LED
const unsigned long maxTimes[numLeds] = {500, 800, 1000}; // 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, OUTPUT);
    ledStates = LOW;
    digitalWrite(ledPins, ledStates);
    previousTimes = 0;
    intervals = random(minTimes, maxTimes);
  }
}

void loop() {
  unsigned long currentTime = millis();
 
  for (int i = 0; i < numLeds; i++) {
    // Controleer of het tijd is om de LED te schakelen
    if (currentTime - previousTimes >= intervals) {
      // Schakel de LED
      ledStates = !ledStates;
      digitalWrite(ledPins, ledStates);
     
      // Update de vorige schakeltijd
      previousTimes = currentTime;
     
      // Bepaal een nieuw random interval voor de volgende schakeling
      if (ledStates == HIGH) {
        // LED gaat aan - gebruik aan-tijd interval
        intervals = random(minTimes, maxTimes);
      } 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 = minTimes / 2;
      }
     
      // Debug output (optioneel)
      Serial.print("LED ");
      Serial.print(i);
      Serial.print(": ");
      Serial.print(ledStates ? "AAN" : "UIT");
      Serial.print(", Volgende schakeling in: ");
      Serial.println(intervals);
    }
  }
}
Train-Science.com
Train-Science github
It ain't rocket science ;-)

Bert55

  • Offline Offline
  • Berichten: 892
Re: lampjes in huizen willekeurig schakelen
« Reactie #16 Gepost op: 21 July 2025, 15:24:49 »
Bedankt Bas,
Ken het maar was te lui ::)

edit:
Er zit een fout in de sketch:
Compilation error: incompatible types in assignment of 'int' to 'long unsigned int [3]'

In deze regels:
    previousTimes = 0;
    intervals = random(minTimes, maxTimes);

Moet even weer nazoeken waarom incompatible, mocht je het zo weten Bas, graag.

Bij toeval ben ik nu bezig met een eigen gebouwd huisje met leds erin, dus kan ik het mooi testen
« Laatst bewerkt op: 21 July 2025, 17:40:59 door Bert55 »
Met vriendelijke groet, Bert
Märklin, DCCnext, ECOS
Witmoosdorf afgebroken, Witmoos 2 wordt opgestart na de verhuizing

Patrick Smout

  • Offline Offline
  • Berichten: 441
Re: lampjes in huizen willekeurig schakelen
« Reactie #17 Gepost op: 21 July 2025, 19:33:06 »
Intervals is een array. Je moet deze indexeren wil je een waarde aan een element toekennen.

M.a..w, intervals vervangen door intervals[ i ]

Komt enkele malen voor in het programma. Ff ook nog nakijken of i de juiste index is op alle plaatsen.
« Laatst bewerkt op: 21 July 2025, 19:36:00 door Patrick Smout »
Met vriendelijk groeten,

Patrick Smout

RobVille

  • Offline Offline
  • Berichten: 185
  • My Dark Side
    • Modelbanen - Rob
Re: lampjes in huizen willekeurig schakelen
« Reactie #18 Gepost op: 21 July 2025, 19:54:00 »
Goedemorgen,

Ik ben nu op het punt om de verlichting aan te leggen.
Straatlantaarns, en verlichting voor de huisjes en het station.
Nu wil ik de verlichting in de huisjes een beetje slim maken, af en toe een lamp aan, en uit, en dat willekeurig.
Heb zo'n 30 leds voor huisjes en ongeveer 20-30 straatlantaarns (ook led)
Bestaat er een apparaat om dit slim te schakelen? Heb al de 5074 Multi protocol light decoder gevonden, heeft iemand ervaring hiermee? Is best duur om even te 'proberen'
Of zijn er alternatieven? Analoog of digitaal vind ik niet belangrijk.

Toch maar even terugkomen op de vraag van de TS. Nu de heren verder bakkeleien over het wel en wee van het programmeren van een Arduino, gebruik ik zelf de apparaatjes van Woodland. Hier kan je de Led's makkelijk mee in / uitschakelen, dimmen, ad rondom schakelen. Op beide van mijn modelbanen gebruik ik deze zonder problemen. Geen digitaal gedoe.

Rob
I need to embrace imperfection, anomalies exist everywhere .....
and
asking me if that's black or dark green is not done!

Cornfield Junction / Boulder Crossing
Bypass Junction
Het Boemeltje

bask185

  • Offline Offline
  • Berichten: 4980
Re: lampjes in huizen willekeurig schakelen
« Reactie #19 Gepost op: 21 July 2025, 20:55:16 »
Bert, je bent echt overal vergeten om  achter te tikken  :P. Dit compileert:
// Configuratie
const int numLeds = 3;              // Aantal LED's
const int ledPins[numLeds] = {2, 3, 4}; // Pinnen waar de LED's op aangesloten zijn

// Min en max aan-tijden in milliseconden voor elke LED
const unsigned long minTimes[numLeds] = {100, 200, 300};  // Minimale aan-tijd per LED
const unsigned long maxTimes[numLeds] = {500, 800, 1000}; // 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, OUTPUT);
    ledStates[i] = LOW;
    digitalWrite(ledPins, ledStates);
    previousTimes[i] = 0;
    intervals[i] = random(minTimes, maxTimes);
  }
}

void loop() {
  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, 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("LED ");
      Serial.print(i);
      Serial.print(": ");
      Serial.print(ledStates ? "AAN" : "UIT");
      Serial.print(", Volgende schakeling in: ");
      Serial.println(intervals[i]);
    }
  }
}


Ik ben zelf echter meer dan de object georienteerde aanpak. Niet altijd, maar voor dit soort dingen vind ik het wel handig. Ik zal eerdaags iets in elkaar sleutelen.

Mvg,

Bas
Train-Science.com
Train-Science github
It ain't rocket science ;-)

Bert55

  • Offline Offline
  • Berichten: 892
Re: lampjes in huizen willekeurig schakelen
« Reactie #20 Gepost op: 21 July 2025, 21:17:39 »
Bedankt Bas en Rob.
Heb zelf overigens niets getypt, is allemaal AI.
Met vriendelijke groet, Bert
Märklin, DCCnext, ECOS
Witmoosdorf afgebroken, Witmoos 2 wordt opgestart na de verhuizing

bask185

  • Offline Offline
  • Berichten: 4980
Re: lampjes in huizen willekeurig schakelen
« Reactie #21 Gepost op: Vandaag om 00:15:11 »
Ik denk dat ik wat heb.

De bovenste vier regels zijn de enige die je hoeft aan te passen. Hier kan je gebruikte pinnen tussen de accolades {} zetten, en je kan 3 tijden aanpassen.
const int pin[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 } ;
const int MIN_HOUSE_TIME  =   5000 ;
const int MAX_HOUSE_TIME  =  15000 ;
const int DAY_CHANGE_TIME = 200000 ;

Elke zoveel tijd (dayTimer) klapt 'state' om. Alle pinnen gaan van af dat moment in een willekeurige volgorde om met een willekeurig (instelbare) tijd tot de volgende.


De rest van de code ziet er zo uit. Er zijn echter wat meer bestandjes bij betrokken. Dus ik moet een .zip mailen zodat je alles hebt.
Het was wel even een puzzeltje, maar het is gelukt.
#include "light.h"
#include "src/ST.h"

const int nLights = sizeof(pin) / sizeof(pin[0]) ;
Light light[nLights] ;

Timer timer ;
Timer dayTimer ;

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

    for (int i = 0; i < nLights; i++)
    {
        light[i].begin(pin[i]);
    }

    timer.set(TIMER_BLEEP, MIN_HOUSE_TIME);
    dayTimer.set(TIMER_TOGGLE, DAY_CHANGE_TIME);

    randomSeed(analogRead(A7));
}

void loop()
{
    timer.update();
    dayTimer.update();

    if (timer.Q)
    {
        uint8_t targetState = dayTimer.Q;

        // Count how many lights are not yet in the correct state
        int mismatches = 0;
        for (int i = 0; i < nLights; i++)
        {
            if (light[i].getState() != targetState) { mismatches ++ ; }
        }

        // Only toggle if there's something left to update
        if (mismatches > 0)
        {
            bool updated = false;

            // Try random indices until one needs to change
            while (!updated)
            {
                int index = random(nLights);

                if (light[index].getState() != targetState)
                {
                    light[index].setState(targetState);

                    updated = true;
                    timer.PT = random(MIN_HOUSE_TIME, MAX_HOUSE_TIME);

                    char buf[64] ;
                    sprintf( buf, "index: %3d, Time to next: %4d, state: %d", (int)index, (int)timer.PT/*/1000*/, (int)targetState ) ;
                    Serial.println( buf ) ;
                }
            }
        }
    }
}

De hoofd aandrijfveer is hier de dayTimer en die staat dan hier op 200s (alle tijden voer je in ms). Je zou die dus ook kunnen vervangen door een schakelaar. Als je dan de schakelaar omzet, dan volgen de lampen 1 voor 1 met willekeur.

Mvg,

Bas
Train-Science.com
Train-Science github
It ain't rocket science ;-)