Trapverlichting

Goedemorgen,

Ik ben een beginner als het gaat om programmeren, maar ben bezig om de trap in mijn huis te voorzien van LED verlichting.

De bedoeling is dat er zowel boven als onderaan de trap een sensor komt, zodra deze wordt geactiveerd moet de verlichting per trede aan gaan (dus als je omhoog loopt moet eerst de onderste trede aan gaan, als je naar beneden gaat moet eerst de bovenste trede aan gaan).

Elke trede moet een fade in en een fade out doen van een paar seconden.

Nu ben ik bezig om dit te programmeren, maar kom er niet helemaal uit en ik vroeg me af of jullie mij verder kunnen helpen.

1 strip een fade in en een fade out te laten doen is geen probleem, maar ik heb straks meerdere treden.

Ik heb mijn project tot nu toe bijgevoegd (grotendeels van voorbeelden op het internet).

Kan iemand mij vertellen hoe ik dit moet aanpassen zodat ik 1 loop kan gebruiken voor alle treden, en dus niet het stuk code voor de Fade in en Fade out X aantal keer moet kopiëren?

Ik heb bovenin de code al wat integers toegevoegd die ik denk nodig te hebben, maar weet niet of dit klopt...

#include <Adafruit_NeoPixel.h>

// totaal aantal treden
int treden = 2;

// definieer pwm pin per trede
int Trede1 = 5;
int Trede2 = 6;

int totalLEDs = 32;
int ledFadeTime = 5;

Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(totalLEDs, Trede1, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strip2 = Adafruit_NeoPixel(totalLEDs, Trede2, NEO_GRB + NEO_KHZ800);

void setup() {
 
  strip1.begin();
  strip1.show(); // Initialize all pixels to 'off'

}

void loop() {
  FadeIn(255, 255, 255, ledFadeTime); // Blue
  delay (10000);
  FadeOut(255, 255, 255, ledFadeTime); // Blue
}

void FadeIn(uint8_t red, uint8_t green, uint8_t blue, uint8_t wait) {
 
  for(uint8_t b = 0; b <255; b++) {
     for(uint8_t i=0; i < strip1.numPixels(); i++) {
        strip1.setPixelColor(i, red * b/255, green * b/255, blue * b/255);
     }

     strip1.show();
     delay(wait);
  };
};

void FadeOut(uint8_t red, uint8_t green, uint8_t blue, uint8_t wait) {
  for(uint8_t b=255; b > 0; b--) {
     for(uint8_t i = 0; i < strip1.numPixels(); i++) {
        strip1.setPixelColor(i, red * b/255, green * b/255, blue * b/255);
     }
     strip1.show();
     delay(wait);
  };
};

Alle hulp is welkom, alvast bedankt!

Daarom is het altijd handig om een tekening te maken wat je nu precies wilt. Een schets helpt je om jouw probleem te ordenen.
samenvattend:
Je hebt een trap....
Die heeft treden.....
Elke trede wil ik op en af laten faden....

Een led strip bevat een reeks (array) leds.....
Een led strip kun je opdelen in segmenten (per trede).....
Elk segment kun je op en af laten faden...

Afhankelijk van de sensor werk je van het einde van de strip naar het begin of omgekeerd.

Beste Nico,

Dank je wel voor je antwoord.

De schematische tekening heb ik in mijn hoofd zitten en is ook niet erg moeilijk. Elke led strip bestaat uit 32 RGB leds. Elke strip heeft een data lijn die ik aansluit op mijn arduino Mega vanaf PWM pin 5.

Op dit moment heb ik nog geen sensor geimplementeerd en heb ik ook nog niet besloten wat ik ga gebruiken (drukschakelaar of bewegingsmelder). Voor het gemak ga ik een drukschakelaar gebruiken op een analoog kanaal, deze procedure is later eenvoudig aan te passen mocht ik een bewegingsmelder gaan gebruiken.

Waar het mij op dit moment om gaat is de opbouw van de code. Waar ik aan zat te denken is dat zodra drukschakelaar A wordt ingedrukt, een array wordt gevuld met Trede1,Trede2,Trede3,enz. Wordt drukschakelaar B ingedrukt, dan moet de volgorde andersom zijn (dit is nog wel handmatig te definiëren.

Ik heb echter geen idee hoe ik dit moet realiseren.. Ik hoop dat je me hierbij kan helpen.

Je kan die strips toch gewoon doorlussen en er een grote lange strip van maken? Die kan je dan onderverdelen in segment per trede.
Je krijgt dan gewoon een lange array. De leds van de juiste trede vul je met het fade effect en telkenmale een update.
Dan wordt je programma niet meer dan:

bij oplopen:

for (trede is 0 to max tredes) {
   //
   //  bereken de offset van de huidige trede
   //
   offset = (trede * AantalTredes);
   for (led = offset to (offset + aantalLedsPerTrede)) {
      //
      //  fade de leds aan....
      //

      //
      // fade de leds uit
      //
  }
}

En bij aflopen gewoon omgekeerde richting.

Wel moet je de voedingen in de gaten houden bij een groter aantal leds. Die kakt in elkaar.
En een schets in het hoofd is vaak onvoldoende bij het uitwerken.

Ik ben het helemaal eens met Nico's tip over tekening of beter schets, waarbij je dat dus op papier doet.
Dat papier is een oeroud, maar ook bij dit soort moderne toepassingen nog steeds zeer dankbaar hulpmiddel.
Want je kunt hiermee je ideeën vastleggen, maar ook in de passende volgorde sorteren (een potlood en gum zijn daar ook erg handig bij).
Als je dat dan nog zo doet dat je telkens wat ruimte over laat om er nog iets aan toe te voegen zal dat ook weer helpen.
Door het te noteren of uit te tekenen, ben je er meer bewust mee bezig dan wanneer je het "in je hoofd hebt zitten".
Hierdoor zul je zien dat je de ideeën al uit aan het werken bent terwijl je ze nog op papier aan het zetten bent.

Je zult allerlei problemen (of eigenlijk vraagstukken) tegenkomen, zet die er ook op.
Vaak zul je merken dat het dan niet een enkel vraagstuk is, maar meerdere kleinere vraagstukken.
Door dat op te breken in de kleinere vraagstukken die het zijn, kun je die dan stuk voor stuk oplossen.

Als je vaak genoeg de vraagstukken kleiner maakt, kom je al bijna uit bij de code voor je sketch.
Dit kun je "uit het hoofd" doen, maar door het op papier te zetten zul je eenvoudiger het overzicht behouden en kun je zo'n vraagstuk ook even wegleggen en een andere oplossen.