andele
September 2, 2020, 1:52pm
1
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 );
}
agmue
September 2, 2020, 2:45pm
2
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);
}
andele
September 2, 2020, 4:41pm
3
Danke für die Antwort aber leider klappt das nicht
Rentner
September 2, 2020, 4:59pm
4
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
andele
September 2, 2020, 5:04pm
5
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.
Rentner
September 2, 2020, 5:55pm
6
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
andele
September 2, 2020, 5:58pm
7
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
noiasca
September 2, 2020, 6:05pm
8
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?
andele
September 2, 2020, 6:10pm
9
Wie kann mann das machen?
agmue
September 2, 2020, 6:37pm
10
andele:
Danke für die Antwort aber leider klappt das nicht
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 );
}
andele
September 2, 2020, 6:51pm
11
BINGO....Genau So.
Herzlichen Dank für Deine/Eure Hilfe.
noiasca
September 2, 2020, 6:56pm
12
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);
}
^^
andele
September 3, 2020, 6:46am
13
noiasca:
warum einfach, wenn es kompliziert auch geht.
Ja ist etwas kompliziert aber es funktioniert.
Vielen Dank.