Flatgebouw verlichting met Arduino

Plaats reactie

Onderwerp starter
mjdb
Berichten: 133
Lid geworden op: 26 feb 2021 21:48

Flatgebouw verlichting met Arduino

Bericht door mjdb »

Van heel lang terug had ik nog een flatgebouw met op de benedenverdieping de winkel Fink Mode. Wie heeft die niet? ;)

Daar wilde ik graag verlichting in maken, maar dan wel met opties.

Ik heb een led-strip gekocht met programmeerbare RGB (Rood, Groen, Blauw) leds. Deze zijn bijvoorbeeld met een Arduino aan te sturen waardoor je alle denkbare kleuren kunt instellen. Toevallig is de afstand tussen de leds gelijk aan de hoogte van een verdieping van het flatgebouw.

Voor iedere soort kamer heb ik van plastic een kolom gemaakt met afscheidingen die als een soort vloer tussen iedere verdieping komen. Een stripje met 7 of 8 leds (afhankelijk van de plaats in het flatgebouw) heb ik aan de achterzijde geplakt. Iedere led heeft zo een eigen 'kamer' gekregen. Daarna heb ik verschillende kolommen met leds en vloeren van onder af in het gebouw geschoven. Aldus zat achter ieder raam een kamer met een eigen led.
.
20220218_113331.jpg
20220218_113331.jpg (108.98 KiB) 3585 keer bekeken
.
In het Arduino programma heb ik een dag- en nacht ritme geprogrammeerd. 'S ochtends gaat in de verschillende slaapkamers licht aan. Niet allemaal tegelijk maar met variatie. Dan gaat licht in de keukens aan en later in de woonkamer. Dan wordt het weer minder op enkele willekeurige uitzonderingen na. 'S avonds met etenstijd weer keuken verlichting en later licht in de woonkamer aan. Nog later weer in de slaapkamer en dan wordt de woonkamer donker. Af en toe gaat er 's nachts nog ergens een lampje aan. Dit alles willekeurig per woning en iedere dag verschillend. Ook de kleur van het licht varieert (een beetje) per dag. Wel in de slaapkamer meer blauwig, in de keuken wit en in de woonkamer warmer.


Marco

Digitaal spoor N met Z21 (voorheen DR5000) en Digikeijs modules.
Diverse Arduino's voor wissels en seinen. Zelfbouw DCC decoders.
Ook een paar DTS ground-detectie modules.
Aangestuurd door Koploper.

FidOo
Berichten: 5935
Lid geworden op: 05 jan 2010 16:27

Re: Flatgebouw verlichting met Arduino

Bericht door FidOo »

He Marco.. dit zijn natuurlijk toffe projecten. Die vragen natuurlijk ook om een filmpje..!

Tevens wat ik nou echt interessant zou vinden is, wat heb je nou allemaal precies gebruikt om dit te maken en wat heeft het je bij wijze van gekost.
Welke Arduino, eventuele uitbreidingen? Welke ledstrip dan.
En misschien een schetsje van hoe je dit dan aanstuurt (elektrisch gezien dan)


M.v.g. Joost van Dijk

Lid van: MC Lima Bravo
Bouwt momenteel: Modulebaan (Kiel-Nordhafen)"
Gebruikersavatar

Momfer
Berichten: 570
Lid geworden op: 29 okt 2020 13:13
Locatie: Zwolle

Re: Flatgebouw verlichting met Arduino

Bericht door Momfer »

Gaaf!

Heb je de sketch zelf geprogrammeerd, of gebruik je MOBALedLid van het stummiforum?

Uiteraard benieuwd naar het "live" resultaat in een filmpje :)


Groet,
Rico (momfer)

Centrale: DCC-Ex | Arduino Mega + Motor shield
Besturing: EXRAIL | Traintastic | RocRail | Engine Driver | DecoderPro
Rails: Minitrix / Fleischmann Piccolo
En hier vind je de bouw van mijn kerstbaan en Starten met EXRAIL

Onderwerp starter
mjdb
Berichten: 133
Lid geworden op: 26 feb 2021 21:48

Re: Flatgebouw verlichting met Arduino

Bericht door mjdb »

FidOo schreef: 18 feb 2022 12:49 He Marco.. dit zijn natuurlijk toffe projecten. Die vragen natuurlijk ook om een filmpje..!
Als het goed is moet dit het filmpje zijn...


Marco

Digitaal spoor N met Z21 (voorheen DR5000) en Digikeijs modules.
Diverse Arduino's voor wissels en seinen. Zelfbouw DCC decoders.
Ook een paar DTS ground-detectie modules.
Aangestuurd door Koploper.

Onderwerp starter
mjdb
Berichten: 133
Lid geworden op: 26 feb 2021 21:48

Re: Flatgebouw verlichting met Arduino

Bericht door mjdb »

FidOo schreef: 18 feb 2022 12:49 wat heb je nou allemaal precies gebruikt om dit te maken en wat heeft het je bij wijze van gekost.
Welke Arduino, eventuele uitbreidingen? Welke ledstrip dan.
De aansturing doe ik met een enkele Arduino Nano.
Bijvoorbeeld: https://www.tinytronics.nl/shop/nl/deve ... compatible

Zorg wel voor een voldoende voedingsspanning, het zijn een heleboel leds.
Bijvoorbeeld: https://www.tinytronics.nl/shop/nl/powe ... ningsmeter

Ik heb ledstrip gebruikt met WS2812 RGB leds.
Bijvoorbeeld: https://www.tinytronics.nl/shop/nl/verl ... eds-1m-5mm

Voor de kokers heb ik 1,5 mm dik knutsel-plastic gebruikt van een hobby-winkel. Deze kun je lijmen met dezelfde lijm waarmee je huisjes e.d. in elkaar zet.

Totaal met draadjes e.d. rond de 25 Euro.
Laatst gewijzigd door mjdb op 18 feb 2022 14:17, 1 keer totaal gewijzigd.


Marco

Digitaal spoor N met Z21 (voorheen DR5000) en Digikeijs modules.
Diverse Arduino's voor wissels en seinen. Zelfbouw DCC decoders.
Ook een paar DTS ground-detectie modules.
Aangestuurd door Koploper.

Onderwerp starter
mjdb
Berichten: 133
Lid geworden op: 26 feb 2021 21:48

Re: Flatgebouw verlichting met Arduino

Bericht door mjdb »

Momfer schreef: 18 feb 2022 13:13 Heb je de sketch zelf geprogrammeerd?
Ik maak in principe alle programma's zelf. Natuurlijk kijk ik wel naar voorbeelden op het Internet. Je moet het tenslotte ergens van leren.

Dit is de betreffende programma-code. In Arduino-termen de Sketch:

Code: Selecteer alles

// Flatgebouw verlichting

#include <Adafruit_NeoPixel.h>

// Which pin on the Arduino is connected to the NeoPixels?

#define Pin_Slaapkamer1 2
#define Pin_Keuken1     3
#define Pin_Woonkamer1a 4
#define Pin_Woonkamer1b 5
#define Pin_Slaapkamer2 6
#define Pin_Keuken2     7
#define Pin_Woonkamer2  8
#define Pin_Trappenhuis 9

// How many NeoPixels are attached to the Arduino?
#define Etages 8

#define KamerCount 8
#define Col_Slaapkamer1 0
#define Col_Keuken1     1
#define Col_Woonkamer1a 2
#define Col_Woonkamer1b 3
#define Col_Woonkamer2  4
#define Col_Keuken2     5
#define Col_Slaapkamer2 6
#define Col_Trappenhuis 7

// Declare our NeoPixel strip objects:
Adafruit_NeoPixel Kamers[] = {Adafruit_NeoPixel(Etages, Pin_Slaapkamer1, NEO_GRB + NEO_KHZ800),
                              Adafruit_NeoPixel(Etages, Pin_Keuken1, NEO_GRB + NEO_KHZ800),
                              Adafruit_NeoPixel(Etages, Pin_Woonkamer1a, NEO_GRB + NEO_KHZ800),
                              Adafruit_NeoPixel(Etages, Pin_Woonkamer1b, NEO_GRB + NEO_KHZ800),
                              Adafruit_NeoPixel(Etages, Pin_Slaapkamer2, NEO_GRB + NEO_KHZ800),
                              Adafruit_NeoPixel(Etages, Pin_Keuken2, NEO_GRB + NEO_KHZ800),
                              Adafruit_NeoPixel(Etages, Pin_Woonkamer2, NEO_GRB + NEO_KHZ800),
                              Adafruit_NeoPixel(Etages, Pin_Trappenhuis, NEO_GRB + NEO_KHZ800)};

// Argument 1 = Number of pixels in NeoPixel strip
// Argument 2 = Arduino pin number (most are valid)
// Argument 3 = Pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
//   NEO_RGBW    Pixels are wired for RGBW bitstream (NeoPixel RGBW products)


// setup() function -- runs once at startup --------------------------------

void setup() {

  pinMode(LED_BUILTIN, OUTPUT);
  for (int i=0; i<4; i++) { //enkele secondes aftellen
    digitalWrite(LED_BUILTIN, HIGH);  // turn the LED on (HIGH is the voltage level)
    digitalWrite(2, HIGH);  // turn the LED on (HIGH is the voltage level)
    delay(300);                       // wait for 3/10 second
    digitalWrite(LED_BUILTIN, LOW);   // turn the LED off by making the voltage LOW
    digitalWrite(2, LOW);   // turn the LED off by making the voltage LOW
    delay(700);                       // wait for 7/10 second
  } // countdown

  Serial.begin(57600);
  for(int i=0; i<KamerCount; i++) { // For each strip...
    Kamers[i].begin();           // INITIALIZE NeoPixel strip object (REQUIRED)
    Kamers[i].show();            // Turn OFF all pixels ASAP
    Kamers[i].setBrightness(80); // Set BRIGHTNESS to about 1/5 (max = 255)
  }; // Alle strips initializeren

  ShowAllColors();

  randomSeed(analogRead(0));

  } // setup


// loop() function -- runs repeatedly as long as board is on ---------------

void loop() {

  int Kans_Slaapkamer=0;
  int Kans_Keuken=0;
  int Kans_Woonkamer=0;
  int Kans_Trappenhuis=0;
  int Kans=0;
  int Rood = 0;
  int Groen = 0;
  int Blauw = 0;
  int StapPauze = 200; // milliseconden
   
  Serial.println("DagEnNacht");
  // doorloop een dag en een nacht

  for (int Uur=0; Uur<24; Uur++) { // alle uren
    
    switch(Uur) {
      case 0:
        Kans_Slaapkamer=20;
        Kans_Keuken=20;
        Kans_Woonkamer=20;
        Kans_Trappenhuis=100;
        break;
      case 1:
        Kans_Slaapkamer=10;
        Kans_Keuken=10;
        Kans_Woonkamer=20;
        Kans_Trappenhuis=100;
        break;
      case 2:
        Kans_Slaapkamer=10;
        Kans_Keuken=5;
        Kans_Woonkamer=10;
        Kans_Trappenhuis=100;
        break;
      case 3:
        Kans_Slaapkamer=5;
        Kans_Keuken=5;
        Kans_Woonkamer=10;
        Kans_Trappenhuis=100;
        break;
      case 4:
        Kans_Slaapkamer=5;
        Kans_Keuken=5;
        Kans_Woonkamer=10;
        Kans_Trappenhuis=100;
        break;
      case 5:
        Kans_Slaapkamer=10;
        Kans_Keuken=5;
        Kans_Woonkamer=5;
        Kans_Trappenhuis=100;
        break;
      case 6:
        Kans_Slaapkamer=30;
        Kans_Keuken=20;
        Kans_Woonkamer=30;
        Kans_Trappenhuis=100;
        break;
      case 7:
        Kans_Slaapkamer=50;
        Kans_Keuken=40;
        Kans_Woonkamer=50;
        Kans_Trappenhuis=80;
        break;
      case 8:
        Kans_Slaapkamer=80;
        Kans_Keuken=6;
        Kans_Woonkamer=60;
        Kans_Trappenhuis=60;
        break;
      case 9:
        Kans_Slaapkamer=60;
        Kans_Keuken=80;
        Kans_Woonkamer=80;
        Kans_Trappenhuis=0;
        break;
      case 10:
        Kans_Slaapkamer=40;
        Kans_Keuken=70;
        Kans_Woonkamer=60;
        Kans_Trappenhuis=0;
        break;
      case 11:
        Kans_Slaapkamer=20;
        Kans_Keuken=50;
        Kans_Woonkamer=50;
        Kans_Trappenhuis=0;
        break;
      case 12:
        Kans_Slaapkamer=10;
        Kans_Keuken=90;
        Kans_Woonkamer=70;
        Kans_Trappenhuis=0;
        break;
      case 13:
        Kans_Slaapkamer=10;
        Kans_Keuken=80;
        Kans_Woonkamer=70;
        Kans_Trappenhuis=0;
        break;
      case 14:
        Kans_Slaapkamer=10;
        Kans_Keuken=50;
        Kans_Woonkamer=60;
        Kans_Trappenhuis=0;
        break;
      case 15:
        Kans_Slaapkamer=10;
        Kans_Keuken=40;
        Kans_Woonkamer=70;
        Kans_Trappenhuis=0;
        break;
      case 16:
        Kans_Slaapkamer=10;
        Kans_Keuken=50;
        Kans_Woonkamer=80;
        Kans_Trappenhuis=0;
      case 17:
        Kans_Slaapkamer=20;
        Kans_Keuken=70;
        Kans_Woonkamer=90;
        Kans_Trappenhuis=0;
        break;
      case 18:
        Kans_Slaapkamer=30;
        Kans_Keuken=90;
        Kans_Woonkamer=90;
        Kans_Trappenhuis=60;
        break;
      case 19:
        Kans_Slaapkamer=40;
        Kans_Keuken=80;
        Kans_Woonkamer=90;
        Kans_Trappenhuis=80;
        break;
      case 20:
        Kans_Slaapkamer=60;
        Kans_Keuken=70;
        Kans_Woonkamer=90;
        Kans_Trappenhuis=100;
        break;
      case 21:
        Kans_Slaapkamer=80;
        Kans_Keuken=50;
        Kans_Woonkamer=80;
        Kans_Trappenhuis=100;
        break;
      case 22:
        Kans_Slaapkamer=90;
        Kans_Keuken=30;
        Kans_Woonkamer=70;
        Kans_Trappenhuis=100;
        break;
      case 23:
        Kans_Slaapkamer=50;
        Kans_Keuken=20;
        Kans_Woonkamer=60;
        Kans_Trappenhuis=100;
        break;
    }; // switch Uur

    Serial.print(Uur);
    Serial.print(" ");
    Serial.print(Kans_Slaapkamer);
    Serial.print(" ");
    Serial.print(Kans_Keuken);
    Serial.print(" ");
    Serial.print(Kans_Woonkamer);
    Serial.print(" ");
    Serial.print(Kans_Trappenhuis);
    Serial.println();

    for(int e=0; e<Etages; e++) { // For each Etage...
      Kans = rand() % 100 + 1;
      if (Kans_Slaapkamer>Kans) {
        Rood = rand() % 100 + 80;
        Groen = rand() % 100 + 80;
        Blauw = rand() % 120 + 50;
      }
      else {
        Rood = 0;
        Groen = 0;
        Blauw = 0;
      }
      Kamers[Col_Slaapkamer1].setPixelColor(e, Rood, Groen, Blauw); // On
      Kamers[Col_Slaapkamer1].show();                    //  Update strip to match
      delay(StapPauze);                           //  Pause for a moment
      
      Kans = rand() % 100 + 1;
      if (Kans_Keuken>Kans) {
        Rood = rand() % 50 + 200;
        Groen = rand() % 50 + 200;
        Blauw = rand() % 50 + 150;
      }
      else {
        Rood = 0;
        Groen = 0;
        Blauw = 0;
      }
      Kamers[Col_Keuken1].setPixelColor(e, Rood, Groen, Blauw);
      Kamers[Col_Keuken1].show();                    //  Update strip to match
      delay(StapPauze);                           //  Pause for a moment
      
      Kans = rand() % 100 + 1;
      if (Kans_Woonkamer>Kans) {
        Rood = rand() % 100 + 155;
        Groen = rand() % 100 + 150;
        Blauw = rand() % 50 + 50;
      }
      else {
        Rood = 0;
        Groen = 0;
        Blauw = 0;
      }
      Kamers[Col_Woonkamer1a].setPixelColor(e, Rood, Groen, Blauw);
      Kamers[Col_Woonkamer1a].show();                    //  Update strip to match
      delay(StapPauze);                           //  Pause for a moment
      
      Kans = rand() % 100 + 1;
      if (Kans_Woonkamer>Kans) {
        Rood = rand() % 150 + 100;
        Groen = rand() % 150 + 100;
        Blauw = rand() % 50 + 50;
      }
      else {
        Rood = 0;
        Groen = 0;
        Blauw = 0;
      }
      Kamers[Col_Woonkamer1b].setPixelColor(e, Rood, Groen, Blauw);
      Kamers[Col_Woonkamer1b].show();                    //  Update strip to match
      delay(StapPauze);                           //  Pause for a moment
      
      Kans = rand() % 100 + 1;
      if (Kans_Slaapkamer>Kans) {
        Rood = rand() % 100 + 150;
        Groen = rand() % 100 + 150;
        Blauw = rand() % 100 + 100;
      }
      else {
        Rood = 0;
        Groen = 0;
        Blauw = 0;
      }
      Kamers[Col_Slaapkamer2].setPixelColor(e, Rood, Groen, Blauw);
      Kamers[Col_Slaapkamer2].show();                    //  Update strip to match
      delay(StapPauze);                           //  Pause for a moment
      
      Kans = rand() % 100 + 1;
      if (Kans_Keuken>Kans) {
        Rood = rand() % 50 + 200;
        Groen = rand() % 50 + 200;
        Blauw = rand() % 50 + 150;
      }
      else {
        Rood = 0;
        Groen = 0;
        Blauw = 0;
      }
      Kamers[Col_Keuken2].setPixelColor(e, Rood, Groen, Blauw);
      Kamers[Col_Keuken2].show();                    //  Update strip to match
      delay(StapPauze);                           //  Pause for a moment

      Kans = rand() % 100 + 1;
      if (Kans_Woonkamer>Kans) {
        Rood = rand() % 150 + 100;
        Groen = rand() % 150 + 100;
        Blauw = rand() % 50 + 80;
      }
      else {
        Rood = 0;
        Groen = 0;
        Blauw = 0;
      }
      Kamers[Col_Woonkamer2].setPixelColor(e, Rood, Groen, Blauw);
      Kamers[Col_Woonkamer2].show();                    //  Update strip to match
      delay(StapPauze);                           //  Pause for a moment
         
    } // Each Etage

    Kans = rand() % 100 + 1;
    for(int e=0; e<Etages; e++) { // For each Etage...
      if (Kans_Trappenhuis>=Kans) {
        Rood = 127;
        Groen = 127;
        Blauw = 100;
      }
      else {
        Rood = 0;
        Groen = 0;
        Blauw = 0;
      }
      Kamers[Col_Trappenhuis].setPixelColor(e, Rood, Groen, Blauw);
      Kamers[Col_Trappenhuis].show();
    } // Each Etage

     
    digitalWrite(LED_BUILTIN, HIGH);  // turn the LED on (HIGH is the voltage level)
    delay(100);                       // wait for 3/10 second
    digitalWrite(LED_BUILTIN, LOW);   // turn the LED off by making the voltage LOW
    delay(100);                       // wait for 7/10 second
    digitalWrite(LED_BUILTIN, HIGH);  // turn the LED on (HIGH is the voltage level)
    delay(100);                       // wait for 3/10 second
    digitalWrite(LED_BUILTIN, LOW);   // turn the LED off by making the voltage LOW
    delay(700);                       // wait for 7/10 second

  } // alle uren

} // loop

void ShowAllColors(){

  for(int i=0; i<KamerCount; i++) { // For each strip...
    
    for(int j=0; j<Kamers[i].numPixels(); j++) { // For each pixel in strip...
      Kamers[i].setPixelColor(j, Kamers[i].Color(255, 0, 0)); // Red
      Kamers[i].show();                    //  Update strip to match
      delay(50);                           //  Pause for a moment
    };
    
    for(int j=0; j<Kamers[i].numPixels(); j++) { // For each pixel in strip...
      Kamers[i].setPixelColor(j, Kamers[i].Color(0, 255, 0)); // Green
      Kamers[i].show();                    //  Update strip to match
      delay(50);                           //  Pause for a moment
    };
    
    for(int j=0; j<Kamers[i].numPixels(); j++) { // For each pixel in strip...
      Kamers[i].setPixelColor(j, Kamers[i].Color(0, 0, 255)); // Blue
      Kamers[i].show();                    //  Update strip to match
      delay(50);                           //  Pause for a moment
    };
    
    for(int j=0; j<Kamers[i].numPixels(); j++) { // For each pixel in strip...
      Kamers[i].setPixelColor(j, Kamers[i].Color(0, 0, 0)); // Off
      Kamers[i].show();                    //  Update strip to match
      delay(50);                           //  Pause for a moment
    };
    
  }; // Each strip
  
  for(int j=0; j<Etages; j++) { // For each Etage...
    
    for(int i=0; i<KamerCount; i++) { // For each pixel in strip...
      Kamers[i].setPixelColor(j, Kamers[i].Color(255, 0, 0)); // Red
      Kamers[i].show();                    //  Update strip to match
      delay(50);                           //  Pause for a moment
    };
    
    for(int i=0; i<KamerCount; i++) { // For each pixel in strip...
      Kamers[i].setPixelColor(j, Kamers[i].Color(0, 255, 0)); // Green
      Kamers[i].show();                    //  Update strip to match
      delay(50);                           //  Pause for a moment
    };
    
    for(int i=0; i<KamerCount; i++) { // For each pixel in strip...
      Kamers[i].setPixelColor(j, Kamers[i].Color(0, 0, 255)); // Blue
      Kamers[i].show();                    //  Update strip to match
      delay(50);                           //  Pause for a moment
    };
    
    for(int i=0; i<KamerCount; i++) { // For each pixel in strip...
      Kamers[i].setPixelColor(j, Kamers[i].Color(0, 0, 0)); // Off
      Kamers[i].show();                    //  Update strip to match
      delay(50);                           //  Pause for a moment
    };
    
  }; // Each Etage
  
}; // ShowAllColors
Een array 'kamer' in het programma komt overeen met een kolom boven elkaar liggende ramen in het gebouw. Dit is een stripje van 7 of 8 leds die ik in een plastic kolom heb ingebouwd.

Het programma begint om alle leds per kolom en per etage de basis-kleuren rood, groen en blauw te laten zien. Dit ter controle of alle leds werken.


Marco

Digitaal spoor N met Z21 (voorheen DR5000) en Digikeijs modules.
Diverse Arduino's voor wissels en seinen. Zelfbouw DCC decoders.
Ook een paar DTS ground-detectie modules.
Aangestuurd door Koploper.
Gebruikersavatar

Rtoonen
Berichten: 322
Lid geworden op: 30 jun 2013 19:43
Locatie: Vlissingen

Re: Flatgebouw verlichting met Arduino

Bericht door Rtoonen »

Zojuist het filmpje bekeken. Ontzettend leuk geworden!
Wat een drukte in die flat 😂


Groet,
Rob


Modelbaan met kopstation "Waterloo". Nederland 1945 - 2000
Gebruikersavatar

Momfer
Berichten: 570
Lid geworden op: 29 okt 2020 13:13
Locatie: Zwolle

Re: Flatgebouw verlichting met Arduino

Bericht door Momfer »

mjdb schreef: 18 feb 2022 13:54 <knip>
Als het goed is moet dit het filmpje zijn...
Gaaf hoor, zo heb je eer van je werk!



Onmogelijkhier
Berichten: 410
Lid geworden op: 05 jan 2021 20:06
Locatie: Omgeving Rotterdam mijn geboorte stad

Re: Flatgebouw verlichting met Arduino

Bericht door Onmogelijkhier »

Heel leuk om te zien.


Groeten Marcel V
Plaats reactie