Hoi,

Ik heb hier een WS2812B Led strip met 25 Leds. Hiervan wil ik de eerste vijf en de laatste vijf Leds kunnen aan en uit kunnen schakelen. Dit werkt maar ik wil graag gebruik maken van “fadeToBlackBy” om bij het uitschakelen een DIM effect te krijgen. Zodat deze niet “hard” uitgaan

Ik heb veel gezocht op internet en ben bij deze blijven hangen als voorbeeld:
https://github.com/marmilicious/FastLED_examples/blob/master/fadeToBla…

Hierin staat een voorbeeld maar ik krijg dit voorbeeld niet goed werkend in mijn sketch. Ik doe zeker wat fout. Het begint al met de “EVERY_N_MILLISECONDS(250)” waarvan ik niet weet waar ik deze plaatsen moet.

Kan iemand mij op de juiste weg helpen?

Hieronder de huidige sketch waar bij “if (button1.isReleased())” de functie “fadeToBlackBy” wel werkt maar niet dimt.

#include <FastLED.h>
#include <ezButton.h>

#define LED_PIN 3
#define NUM_LEDS 25
#define BRIGHTNESS 255  // Nog in test
CRGB leds[NUM_LEDS];

ezButton button1(5);  // create ezButton object that attach to pin 5;
ezButton button2(6);  // create ezButton object that attach to pin 6;

void setup() {
  FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
  FastLED.setMaxPowerInVoltsAndMilliamps(5, 500);
  FastLED.clear();
  FastLED.show();

  button1.setDebounceTime(50);  // set debounce time to 50 milliseconds
  button2.setDebounceTime(50);  // set debounce time to 50 milliseconds
}

void loop() {
  button1.loop();  // MUST call the loop() function first
  button2.loop();  // MUST call the loop() function first

  if (button1.isPressed())
    for (int i = 0; i < 5; i++)  //LEDs 0 tot en met 4 gaan aan. Vijf LEDs totaal.
    // RED
      leds[i] = CRGB(255, 0, 0);
  FastLED.show();

  if (button1.isReleased())
    for (int i = 0; i < 5; i++)  //LEDs 0 tot en met 4 gaan uit. Vijf LEDs totaal.
      // OFF
      leds[i].fadeToBlackBy(255);
  // leds[i] = CRGB(0, 0, 0 );
  FastLED.show();

  if (button2.isPressed())
    for (int i = 20; i < 26; i++)  //LEDs 20 tot en met 25 gaan aan. Vijf LEDs totaal.
     // RED
      leds[i] = CRGB(255, 0, 0);
  FastLED.show();

  if (button2.isReleased())
    for (int i = 20; i < 26; i++)  //LEDs 20 tot en met 25 gaan uit. Vijf LEDs totaal.
     // OFF
      leds[i] = CRGB(0, 0, 0);
  FastLED.show();
}

Om te beginnen kan je de EVERY_N_MILLISECONDS in de hele loop() zetten:

void loop(){
   EVERY_N_MILLISECONDS(250){
   ... alle huidige code in de loop
}}

Ik denk wel dat je knopjes dan niet vlot meer reageren, probeer dan:

void loop(){
   button1.loop();  // MUST call the loop() function first
   button2.loop();  // MUST call the loop() function first
   EVERY_N_MILLISECONDS(250){
   ... alle huidige code in de loop
}}

Als dit niet werkt moet je echt even gaan debuggen, terug naar de basis. Probeer of de basis sketch werkt. Of maak je eigen sketch zo eenvoudig mogelijk dus zonder knoppen e.d..

Bv

void loop(){
 EVERY_N_MILLISECONDS(250){
    leds[1] = CRGB(255, 255, 255 );
    FastLED.show();
    delay(1500);  
    leds[1].fadeToBlackBy(255);
    FastLED.show();
    delay(3000); 
}}

Zo simpel mogelijk geen for lusjes geen knoppen en geen onduidelijke variabelen en dan uitbouwen met knopacties e.d.

wat probeer je precies te maken?
ik zie 2 knoppen maar versta de werking niet echt.

knop 1 aan zet de eerste 5 leds allemaal fel rood
knop 1 uit laat ze uit faden

knop 2 aan zet de laatste 5 leds fel rood
knop 2 uit laat ze uit faden.

leds[1].fadeToBlackBy(255);

dit zou het faden per 255 laten gaan, dus quasi instant??? ik had hier iets verwacht van

leds[1].fadeToBlackBy(5);

, dan ga je faden per stappen van 5 (kan de library niet zien dus geen idee wat ze doet.

waarom doe je het niet gewoon met die getallen?
in je loop kan je toch gewoon

leds[i] = CRGB(255, 0, 0);

bijvoorbeeld per 5 laten omlaag gaan naar

leds[i] = CRGB(0, 0, 0);

hieronder laat ik de eerste 5 leds van rood 255 naar 0 gaan in stappen van 5 en wacht die 100ms per stap

for (int i = 255; i > 0; i=i-5){
  leds[1] = CRGB(i, 0, 0);
  leds[2] = CRGB(i, 0, 0);
  leds[3] = CRGB(i, 0, 0);
  leds[4] = CRGB(i, 0, 0);
  leds[5] = CRGB(i, 0, 0);
  delay(100);
}

Dat hangt wel af van die button functies.

De functie isPressed() geeft eenmalig een true op het moment dat je de knop indrukt. En daarna false ook al blijf je op de knop drukken. En zo ook isReleased(), die geeft ook maar één keer een true na het loslaten van de knop.

En fadeToBlackBy(255) moet je meerdere keren aanroepen met tussenpozen, en elke keer worden de leds dan een piezeltje minder.

Dus dan krijg je ongeveer zo een sketch:
-- Niet getest. Ik heb deze libraries hier niet.



#include <FastLED.h>
#include <ezButton.h>

#define LED_PIN 3
#define NUM_LEDS 25
#define BRIGHTNESS 255  // Nog in test
CRGB leds[NUM_LEDS];

ezButton button1(5);  // create ezButton object that attach to pin 5;
ezButton button2(6);  // create ezButton object that attach to pin 6;

void setup() 
{
  FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
  FastLED.setMaxPowerInVoltsAndMilliamps(5, 500);
  FastLED.clear();
  FastLED.show();

  button1.setDebounceTime(50);  // set debounce time to 50 milliseconds
  button2.setDebounceTime(50);  // set debounce time to 50 milliseconds
}

void loop() 
{
  button1.loop();  // MUST call the loop() function first
  button2.loop();  // MUST call the loop() function first
  
  static bool Fading = false;

  if (button1.isPressed())
  {  for (int i = 0; i < 5; i++)  //LEDs 0 tot en met 4 gaan aan. Vijf LEDs totaal.
     {  // RED
        leds[i] = CRGB(255, 0, 0);
     }
     Fading = false;
  }

  if (button1.isReleased())
  {  Fading = true;
  }

  if (button2.isPressed())
  {  for (int i = 20; i < 26; i++)  //LEDs 20 tot en met 25 gaan aan. Vijf LEDs totaal.
      {  // RED
         leds[i] = CRGB(255, 0, 0);
      }
  }

  if (button2.isReleased())
  {  for (int i = 20; i < 26; i++)  //LEDs 20 tot en met 25 gaan uit. Vijf LEDs totaal.
     {  // OFF
        leds[i] = CRGB(0, 0, 0);
     }
  }
  
  EVERY_N_MILLISECONDS(250) 
  {
    if(Fading)
    {  // LEDs 0 tot en met 4 gaan uit. Vijf LEDs totaal.
       // -- &leds[0]   : pointer naar de eerste led die moet dimmen
       // -- 5          : aantal leds die moeten dimmen
       // -- 20         : Brightness vermindering voor elke fadeToBlack() aanroep 
       fadeToBlackBy(&leds[0], 5, 20);
    }
  }

  // Een keer per loop is wel genoeg  
  FastLED.show();
}

Misschien had ik wat duidelijker moeten zijn wat het doel hiervan is. Ik heb de hele bovenverdieping van mijn huis gerenoveerd. Alles eruit en alles nieuw, dus ook de slaapkamer. Aangezien ik geen bijpassende lampjes bij het nieuwe bed kon vinden dacht ik waarom doe je dit niet met WS2812B LED strip. Die heb ik tenslotte voldoende liggen. Dus heb ik een mooi (45°) LED profiel gekocht en deze gemonteerd in de hoek van het plafond en de muur boven het bed.

Op elk nachtkastje komt een kleine verlichte button in een mooi klein ABS kastje die een deel van de LED strip aanzet. X aantal LEDs links en rechts.

Dit zijn inderdaad Latching Buttons. De sketch kreeg ik wel voor elkaar na wat puzzelen. Maar het dimming proces niet.

@deKees, jouw voorbeeld werkte in één keer, waarvoor hartelijk dank. Ik zie nu ook wat er gebeurd en daar leer ik weer van. Ik heb de sketch aangepast voor de tweede button. Dit werkt ook.

Uiteraard is dit een test strip van 25 LEDs die over was van de 5 meter.

Nogmaals iedereen bedankt en hieronder de uiteindelijke sketch voor de liefhebbers die misschien ook zoiets willen maken. Je weet maar nooit :)

#include <FastLED.h>
#include <ezButton.h>

#define LED_PIN 3
#define NUM_LEDS 25
#define BRIGHTNESS 255
CRGB leds[NUM_LEDS];

ezButton button1(5);  // create ezButton object that attach to pin 5;
ezButton button2(6);  // create ezButton object that attach to pin 6;

void setup() 
{
  FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
  FastLED.setMaxPowerInVoltsAndMilliamps(5, 500);
  FastLED.clear();
  FastLED.show();

  button1.setDebounceTime(50);  // set debounce time to 50 milliseconds
  button2.setDebounceTime(50);  // set debounce time to 50 milliseconds
}

void loop() 
{
  button1.loop();  // MUST call the loop() function first
  button2.loop();  // MUST call the loop() function first
  
  static bool Fading1 = false;
  static bool Fading2 = false;

  if (button1.isPressed())
  {  for (int i = 0; i < 5; i++)  //LEDs 0 tot en met 4 gaan aan. Vijf LEDs totaal.
     {  // RED
        leds[i] = CRGB(255, 0, 0);
     }
     Fading1 = false;
  }

  if (button1.isReleased())
  {  Fading1 = true;
  }

  if (button2.isPressed())
  {  for (int i = 20; i < 25; i++)  //LEDs 20 tot en met 24 gaan aan. Vijf LEDs totaal.
     {  // RED
        leds[i] = CRGB(255, 0, 0);
     }
     Fading2 = false;
  }

  if (button2.isReleased())
  {  Fading2 = true;
  }
  
  EVERY_N_MILLISECONDS(250) 
  {
    if(Fading1)
    {  // LEDs 0 tot en met 4 gaan uit. Vijf LEDs totaal.
       // -- &leds[0]   : pointer naar de eerste led die moet dimmen
       // -- 5          : aantal leds die moeten dimmen
       // -- 20         : Brightness vermindering voor elke fadeToBlack() aanroep 
       fadeToBlackBy(&leds[0], 5, 20);
    }
  {
    if(Fading2)
    {  // LEDs 20 tot en met 24 gaan uit. Vijf LEDs totaal.
       // -- &leds[20]   : pointer naar de eerste led die moet dimmen
       // -- 5          : aantal leds die moeten dimmen
       // -- 20         : Brightness vermindering voor elke fadeToBlack() aanroep 
       fadeToBlackBy(&leds[20], 5, 20);
    }
  }
  // Een keer per loop is wel genoeg  
  FastLED.show();
}
}

Mooi dat het gelukt is. :)

Je hebt wel een paar krulhaakjes te veel rond if(Fading2) maar dat heeft verder geen effect op de sketch.