FastLed Effect

Hallo zusammen, habe ein programmier problem, würde gerne dies hinbekommen .Das sollte gleichzeitig laufen, macht es aber nicht .

#include "FastLED.h"
#define LED_PIN 14 
#define NUM_LEDS 20
#define COLOR_ORDER RGB
#define LED_TYPE WS2811
#define MAX_BRIGHTNESS 255 

CRGB strip[NUM_LEDS];

void setup()
{
  Serial.begin(9600);
  FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(strip, NUM_LEDS).setCorrection(TypicalLEDStrip);
  FastLED.setBrightness(MAX_BRIGHTNESS);
  FastLED.clear();
}

void set1( byte start, byte end, byte g, byte r, byte b ) {
    for( int i = start; i > end; i-- ) {
        strip[i] = CHSV(g, r, b);
        FastLED.show();
        strip[i] = CRGB::Black;
        delay(100);     
      }
       for( int j = end; j < start; j++ ) {
        strip[j+3] = CHSV(g, r, b);
        FastLED.show();
        strip[j+3] = CRGB::Black;
        delay(100);
    }   
  }

void loop()
{
set1( 13, 10, 0, 0xff, 0xff );
}

Ungetestet, besonders hinsichtlich i+3:

    for( int i = start; i > end; i-- ) {
        strip[i] = CHSV(g, r, b);
        strip[i+3] = CHSV(g, r, b);
        FastLED.show();
        strip[i] = CRGB::Black;
        strip[i+3] = CRGB::Black;
        delay(100);     
      }

Danke für die Antwort aber leider klappt das nicht :frowning:

Hallo,

irgendwie werde ich aus Deiner Zeichnung nicht schlau. Willst du z.B eine rot links rum laufen lassen und eine blaue rechts herum. ?

Kann ja schon sein das Bilder mehr als Worte sagen "können" aber ich hätte schon ein wenig mehr Aufwand auf Deiner Seite erwartet um uns Dein Problem näher bringt.

macht es aber nicht !! schon klar sonst hättest Du den Post nicht eröffnet.

Heinz

Ok...dann versuche ich es Wörtlich.
Meine Startposition soll irgendwo im Kreis stattfinden, ab diese Position sollen gleichzeitig 3 Leds nach Links und 3 nach Rechts und wieder zur Startposition zurück bewegen.

andele:
Ok...dann versuche ich es Wörtlich.
Meine Startposition soll irgendwo im Kreis stattfinden, ab diese Position sollen gleichzeitig 3 Leds nach Links und 3 nach Rechts und wieder zur Startposition zurück bewegen.

was ist mit den übrigen , sind die dabei aus ?
drei LED´s nach links -> je eine Position ? oder je drei Positionen ?
eine LED bewegt sich je eine positon und das drei mal, alle übrigen sind aus ?

anschliessend wieder zurück

Heinz

Rentner:
was ist mit den übrigen , sind die dabei aus ? JA
drei LED´s nach links -> je eine Position ? oder je drei Positionen ? JE EINE POSITION
eine LED bewegt sich je eine positon und das drei mal, alle übrigen sind aus ? JA

anschliessend wieder zurück

So wie in der GIF-Animation

also jeweils eine Sequenz:

random Start s ermitteln
s+1
s+2
s+3
s+2
s+1
s

und halt einen evtl. Übergang maxPixel auf 0 berücksichtigen? Ist das alles?

Wie kann mann das machen?

andele:
Danke für die Antwort aber leider klappt das nicht :frowning:

Ich vermutete, Du meinst Knight Rider, aber dem ist nicht so.

Dann probiere mal dies:

void set1( byte start, byte off, byte g, byte r, byte b ) {
  static int8_t j = off - 1;
  static int8_t d = 1;
  strip[start + j] = CHSV(g, r, b);
  strip[start - j] = CHSV(g, r, b);
  FastLED.show();
  strip[start + j] = CRGB::Black;
  strip[start - j] = CRGB::Black;
  if ((j >= off - 1) || (j < 1)) {
    d = -d;
  }
  j += d;
  delay(100);
}

void loop() {
  set1( 10, 3, 0, 0xff, 0xff );
}

BINGO....Genau So.
Herzlichen Dank für Deine/Eure Hilfe.

warum einfach, wenn es kompliziert auch geht.
in diesem Sinne:

#define NUM_LEDS 20
const uint16_t intervall = 100;
byte startPos;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  randomSeed(A0);
  neustart();
  startPos = 19; // Überlauf provzieren
}

void loop() {
  // put your main code here, to run repeatedly:
  tuwas();
}

void ausgabe(byte index, uint32_t color)  // Simulation Pixel färben
{
  //strip[index] = color;  //???
  //fastLED.show();        //???
  Serial.print (index);
  Serial.print (" ");
  Serial.println(color, HEX);
}

void tuwas()
{
  static uint32_t previousMillis = 0;
  static uint8_t counter = 0;  // 0 startpos, 1 , 2, 1, 0
  const int8_t sequenz[] {0, 1, 2, 1};
  if (millis() - previousMillis > intervall)
  {
    if (counter < sizeof(sequenz))  // in der sequenz weitergehen
    {
      //löschen
      ausgabe((startPos + sequenz[counter]) % NUM_LEDS, 0);  //Vorwärts
      ausgabe((startPos - sequenz[counter]) % NUM_LEDS, 0);  //Zurück
      // weiterschalten
      counter++;
      //setzen
      ausgabe((startPos + sequenz[counter]) % NUM_LEDS, 0x808080);
      ausgabe((startPos - sequenz[counter]) % NUM_LEDS, 0x808080);
      previousMillis = millis();
    }
    else
    {
      ausgabe(startPos, 0);         // "alte" Startposition muss man am Ende löschen
      counter = 0;
      neustart();
      ausgabe(startPos, 0xFFFFFF);  // "neue" Startposition einschalten
      previousMillis = millis();
    }
  }
}

void neustart()   // neue startposition ermitteln
{
  Serial.println("neuer Start");
  startPos = random(20);
}

^^

noiasca:
warum einfach, wenn es kompliziert auch geht.

Ja ist etwas kompliziert aber es funktioniert.
Vielen Dank.