FastLed Pixel für pixel an

Hallo ich bräuchte da mal eure Hilfe. Ich hab über eine IR Fernbedienung neopixel strip's programmiert.
Ich kann die Farben weiterschlafen oder halt zurück.
Nur gehen die einfach an. Ich hätte das gerne das pixel für Pixel an geht. Kann mir jemand helfen? Code stell ich gleich online

#include <IRremote.h>
#include <FastLED.h>

#define LED_PIN     6 //pin the LEDS are connected to
#define NUM_LEDS    144 //quantity of leds
#define LED_TYPE    WS2812 //type of leds
#define COLOR_ORDER GRB //colour order
CRGB leds[NUM_LEDS]; //array of leds
uint8_t brightness = 114; //initial brightness
uint8_t colourscheme;
uint8_t colourschemeqty;
//static uint8_t startIndex = 0;
#define UPDATES_PER_SECOND 100
CRGBPalette16 currentPalette;
TBlendType    currentBlending;
extern CRGBPalette16 static_WhitePalette;
extern const TProgmemPalette16 static_WhitePalette_p PROGMEM;

//ir stuff
int RECV_PIN = 11; //IR Receiving LED connected to this pin
bool onoff; //defines the current state of the LEDs
unsigned long command; //stores the latest input command
unsigned long lastcommand; //stores the most recent command if the remote button is held and command repeated
IRrecv irrecv(RECV_PIN); //initialise the IR module
decode_results results; //store results from decoding remote signal

void setup() {
    delay( 3000 ); // power-up safety delay
    //Control scheme
    Serial.begin(9600);// Serial Output
    irrecv.enableIRIn(); // Start the IR receiver
    
    //FastLED stuff
    FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
    FastLED.setBrightness(  brightness );
    
    SetupBlackPalette();
    onoff = false;
}

void loop()
{
 
  if (irrecv.decode(&results)) {//if a new command is received from the IR sensor
    
    command = results.value; //store in command variable
    //Serial.println(results.value, HEX); //print result in hex to serial port
    Serial.println(command); //print result to serial port - use to figure out what commands are being sent by your remote
    
 
 
    switch (command) { //here is where you use the commands received from the remote (seen through serial monitor). Each code must be listed here for anything to happen
      case 0xFF906F: //power button                                  EQ
        if (onoff == false){
          colourscheme=1;
          colourschemecycle(colourscheme);
          onoff = true;
          delay(1000);
        }else{
          colourscheme=0;
          colourschemecycle(colourscheme);
          onoff = false;
        }
        break;
      
      //colour schemes
      case 0xFFE21D: //up arrow - change colour scheme              CH+
        if (colourscheme < colourschemeqty && colourscheme > 0){
          colourscheme += 1;
        }else if (colourscheme == colourschemeqty){
          colourscheme=1;
        }
        colourschemecycle(colourscheme);
        break;
      case 0xFFA25D: //down arrow - change colour scheme             CH-
        if (colourscheme > 1){
          colourscheme -= 1;
        }else if (colourscheme == 1){
          colourscheme = colourschemeqty;
        }
        colourschemecycle(colourscheme);
        break;
      
      //brightness controls
      case 0xFFE01F: //brightness down           vol-
        if (brightness > 25){
          brightness = brightness - 20;
        }
        colourschemecycle(colourscheme);
        break;  
      case 0xFFA857: //brightness up             vol+
        if (brightness < 254){
          brightness = brightness + 20;
        }
        colourschemecycle(colourscheme);
        break;  
         }
    
    irrecv.resume(); // Receive the next value
  }
    /* for motion of leds - still testing
    static uint8_t startIndex = 0;
    startIndex = startIndex + 1; //defines motion speed
    FillLEDsFromPaletteColors( startIndex);*/
    
  FastLED.show();//display the leds
  //FastLED.delay(1000 / UPDATES_PER_SECOND);
  delay(250);//delay for effect to finish processing. reduce to make smoother, but currently causes issues with remote response
}
void FillLEDsFromPaletteColors( uint8_t colorIndex)//fill the leds with palette colours
{
    //uint8_t brightness = 255;
    
    for( int i = 0; i < NUM_LEDS; i++) {
        leds[i] = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending);
        colorIndex += 3;
    }
}
//function to cycle colour schemes.
//Add your colour schemes here.
//Remember to update the colourschemeqty to the largest case number
void colourschemecycle(uint8_t currentscheme)
{
  colourschemeqty = 13;
  switch (currentscheme)
  {
    case 0: fill_solid( currentPalette, 16, CRGB::Black);   currentBlending = LINEARBLEND;  FillLEDsFromPaletteColors( 1);  break;
    case 1: fill_solid( currentPalette, 16, CRGB::White);   currentBlending = LINEARBLEND;  FillLEDsFromPaletteColors( 1);  break;
    case 2: fill_solid( currentPalette, 16, CRGB::Red);     currentBlending = LINEARBLEND;  FillLEDsFromPaletteColors( 1);  break;
    case 3: fill_solid( currentPalette, 16, CRGB::Green);   currentBlending = LINEARBLEND;  FillLEDsFromPaletteColors( 1);  break;
    case 4: fill_solid( currentPalette, 16, CRGB::Blue);    currentBlending = LINEARBLEND;  FillLEDsFromPaletteColors( 1);  break;
    case 5: fill_solid( currentPalette, 16, CRGB::Purple);  currentBlending = LINEARBLEND;  FillLEDsFromPaletteColors( 1);  break;
    case 6: fill_solid( currentPalette, 16, CRGB::Orange);  currentBlending = LINEARBLEND;  FillLEDsFromPaletteColors( 1);  break;
    case 7: fill_solid( currentPalette, 16, CRGB::Yellow);    currentBlending = LINEARBLEND;  FillLEDsFromPaletteColors( 1);  break;
    case 8: fill_solid( currentPalette, 16, CRGB::DarkRed);    currentBlending = LINEARBLEND;  FillLEDsFromPaletteColors( 1);  break;
  }
 
}

void SetupBlackPalette()
{
  fill_solid( currentPalette, 16, CRGB::Black);
}

Hi

Was denkst Du, passiert in z.B. dieser Zeile:

case 0: fill_solid( currentPalette, 16, CRGB::Black);   currentBlending = LINEARBLEND;  FillLEDsFromPaletteColors( 1);  break;

MfG

Wenn ich den EQ knopf drücke geht das mit dieser zeile aus

Hallo,

hab leider nicht ganz verstanden was du willst. Ich glaube du hast da noch ne Menge Zeug drin das eigentlich für Deine Wünsche nicht benötigt wird.

hier mal ein Link zum lesen und üben

Fast LED

Heinz

ich möchte das der strip nicht einfach angeht sondern so wie beim lauflicht. also einer nach dem anderem und an bleibt.

Hi

Dann solltest Du Das SO programmieren.
Meine Frage bezog sich nämlich GENAU auf diesen Punkt!
Wenn DU z.B. bei case 0 DEN GANZEN STRIPE SCHWARZ FÄRBST - solltest Du Dich nicht wundern, daß der ganze Stripe schwarz gefärbt wird.
Gleiches bei den anderen Cases - wenn Du ALLE LEDs eine Farbe zuweist, dann werden hoffentlich auch alle LEDs diese Farbe anzeigen.

Wenn Du Das nicht willst: Programmiere Das um.

Wenn Du alle 100ms jeweils nur eine weitere LED rot färbst, werden pro Sekunde 10 LEDs nacheinander angehen.
Dazu ist Es aber ungemein hilfreich, wenn man VERSTEHT, was der Sketch Da macht - C&P bringt Dich hier leider nur von einer Schotter-Piste zur Nächsten.

Siehe Dir die Beispiele an, darin wird wohl ein Sketch enthalten sein, Der zumindest grob Das macht, was Du willst.
Den Sinn darin erkennen und bei Dir einbauen - nennt sich Programmieren.

MfG

Hallo

i ist der Index also die nummer der LED. Lese die Beschreibung auf dem Link von mir das steht alles drin.
Delay darfst du nicht verwenden, dann wird das mit der IR Fernbedienung nix mehr, also ein milli() konstrukt verwenden.
Sowas in der Art müsste es sein.

!!!! ungetestet!!!!!

uint32_t altzeit; // im allgemein Teil
int i =0;

if (millis()-altzeit >=100UL){ // alle 100 ms die nächste LED ansteuern

   leds[i] = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending);
   altzeit=millis();
   colorIndex += 3;
   FastLED.show();  
   i++
   if ( i > NUM_LEDS) i=0;

}

postmaster-ino:
Hi

Dann solltest Du Das SO programmieren.
Meine Frage bezog sich nämlich GENAU auf diesen Punkt!
Wenn DU z.B. bei case 0 DEN GANZEN STRIPE SCHWARZ FÄRBST - solltest Du Dich nicht wundern, daß der ganze Stripe schwarz gefärbt wird.
Gleiches bei den anderen Cases - wenn Du ALLE LEDs eine Farbe zuweist, dann werden hoffentlich auch alle LEDs diese Farbe anzeigen.

Wenn Du Das nicht willst: Programmiere Das um.

Wenn Du alle 100ms jeweils nur eine weitere LED rot färbst, werden pro Sekunde 10 LEDs nacheinander angehen.
Dazu ist Es aber ungemein hilfreich, wenn man VERSTEHT, was der Sketch Da macht - C&P bringt Dich hier leider nur von einer Schotter-Piste zur Nächsten.

Siehe Dir die Beispiele an, darin wird wohl ein Sketch enthalten sein, Der zumindest grob Das macht, was Du willst.
Den Sinn darin erkennen und bei Dir einbauen - nennt sich Programmieren.

MfG

ich denke du hast es hast es falsch verstanden.

case0 scahltet nur an oder aus, wie ein lichschalter

ich habe ein sketch der macht was er soll. nur das da ein taster ist. nur bekomme ich das nicht so geändert das das funktioniert. ich lade den gleich mal hoch

#include <Adafruit_NeoPixel.h>
#define BUTTON_PIN   2    
#define PIXEL_PIN    6   
#define PIXEL_COUNT 144

Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);
bool oldState = LOW;
int showType = 0;
void setup() {
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}
void loop() {
  // Get current button state.
  bool newState = digitalRead(BUTTON_PIN);
  // Check if state changed from high to low (button press).
  if (newState == HIGH && oldState == LOW) {
    // Short delay to debounce button.
    delay(20);
    // Check if button is still low after debounce.
    newState = digitalRead(BUTTON_PIN);
    if (newState == HIGH) {
      showType++;
      if (showType > 2)
        showType=0;
      startShow(showType);
    }
  }
  // Set the last button state to the old state.
  oldState = newState;
}
void startShow(int i) {
  switch(i){
    case 0: colorWipe(strip.Color(0, 0, 0), 50);    // Black/off
            break;
    case 1: colorWipe(strip.Color(255, 0, 0), 50);  // Red
            break;
    case 2: colorWipe(strip.Color(0, 255, 0), 50);  // Green
            break;
  }
}
// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
  }
}

Bezogen auf den Sketch in #0: Meinst Du sowas?

void FillLEDsFromPaletteColors( uint8_t colorIndex)//fill the leds with palette colours
{
  for ( int i = 0; i < NUM_LEDS; i++) {
    leds[i] = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending);
    colorIndex += 3;
    delay(100);
    FastLED.show();//display the leds
  }
}

Ich habe allerdings eine schlechte Nachricht: IR-Fernbedienung und WS2812b (Neopixel) passen nicht zusammen. Die Auswertung der Fernbedienung bringt häufig Müll. Altrernativ habe ich APA102 verwendet, da geht es problemlos.

ich hab mit der ir ferbedienung keine probleme.
so wie der sketch ist funktioniert es es auch;) ich probiere es aus

agmue:
Bezogen auf den Sketch in #0: Meinst Du sowas?

void FillLEDsFromPaletteColors( uint8_t colorIndex)//fill the leds with palette colours

{
  for ( int i = 0; i < NUM_LEDS; i++) {
    leds[i] = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending);
    colorIndex += 3;
    delay(100);
    FastLED.show();//display the leds
  }
}



Ich habe allerdings eine schlechte Nachricht: IR-Fernbedienung und WS2812b (Neopixel) passen nicht zusammen. Die Auswertung der Fernbedienung bringt häufig Müll. Altrernativ habe ich APA102 verwendet, da geht es problemlos.

agmue:
Bezogen auf den Sketch in #0: Meinst Du sowas?

void FillLEDsFromPaletteColors( uint8_t colorIndex)//fill the leds with palette colours

{
  for ( int i = 0; i < NUM_LEDS; i++) {
    leds[i] = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending);
    colorIndex += 3;
    delay(100);
    FastLED.show();//display the leds
  }
}



Ich habe allerdings eine schlechte Nachricht: IR-Fernbedienung und WS2812b (Neopixel) passen nicht zusammen. Die Auswertung der Fernbedienung bringt häufig Müll. Altrernativ habe ich APA102 verwendet, da geht es problemlos.

Perfekt danke das hat geklappt jetzt macht er was er machen soll;)

Hi

Hast Du wenigstens verstanden, warum Das (ungefähr so) funktioniert, wie Du Das wolltest?
Ganz nebenbei: Während des 'Voll-Laufen' reagiert der Sketch in keinster Weise auf die IR-Fernbedienung, da Er in einer FOR-Schleife gefangen ist, Die mittels delay() auch noch schön lange dauert.
Klar - man will ja auch sehen, daß der Streifen langsam voll läuft - kein Thema.

Klar: Deine Anforderung wurde hiermit erfüllt, aber willst Du nicht selber über den Tellerrand schauen können und verstehen, Was Da abläuft?
Bisher machst Du den Eindruck nicht!

MfG

PS: Mir ist schon klar, das die Cases den ganzen Stripe um färben (eben auch in Schwarz=Aus) - Dir aber nicht, daß genau darin Dein Problem bestand - daß Du nämlich ALLE Pixel um färbst, statt 'Einen nach dem Anderen'.

ja das hab ich schon verstanden. und die fernbedienung muss auch nicht reagieren . das wird ehh verbaut und denn sind es vielleicht noch 20 Ledś. selbst wenn es auf die länge geblieben wäre es kei problem die zeit nehm ich mir :wink:

klar will ich über mein Tellerand gehen, aber ich hab den fehler irgendwie nicht gefunden.
ich hatte es schon so nur mit dem unterschied das ich das" FastLED.show();" nucht unten drunter geschrieben habe.
Und genau für sowas ist doch solch ein Forum da. um zu helfen und geholfen werden. Oder nicht

Und wenn es für fortschrittene oder profis einfacher und offensichtlicher ist das doch gut.

Vielen dank Agmue

Andreas87:
Vielen dank Agmue

Bitte gerne :slight_smile: