Geschwindigkeit von NeoPixel Ringen getrennt steuern

Hallo, ich bin aktuell noch nicht erfahren mit den Feinheiten der Arduino Prgrammerung.

Der folgende Sketch funktioniert im Grunde genau wie gewollt, nur möchte ich die beiden NeoPixel Ringe ( an PIN7 und Pin8 ) getrennt in ihrer Laufgeschwindigkeit ansteuern.

Im Moment addieren sich alle Delays und machen den Ablauf insgesamt langsamer.
Ich möchte allerding das die Rotation der zwei Ringe an Pin7 unabhängig von der Abfolge der Lichter an Pin3 läuft.

Wie würde sich das, falls überhaupt möglich, bewerkstelligen lassen?

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define PIN1 7                                       // Pin 7 = Input Adruino Rings ( 1 x 16 LEDs  / 1 x 12 LEDs )
#define PIN2 8                                       // Pin 8 = Input Adruino Ring ( 1 x 7LEDs )
#define NUMPIXELS1 28                           // 28 LEDs 
#define NUMPIXELS2 7                            // 7 LEDs

Adafruit_NeoPixel pixels1 = Adafruit_NeoPixel(NUMPIXELS1, PIN1, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels2 = Adafruit_NeoPixel(NUMPIXELS2, PIN2, NEO_GRB + NEO_KHZ800);

int i1=0;
int i2=27;

int eingang= A0;                                                                         // PIN A = Potentiometer
int sensorwert = 0;                                                                     // Value = 0

int RED1=0;                                                                               // LED Color Red         
int BLUE1=0;                                                                              // LED Color Blue
int GREEN1=0;                                                                            // LED Color Green  

int PAUSE1=150;                                                                        // Break / Speed
int PAUSE2=50;  
int PAUSE3=10;  

void setup() 

{
pixels1.begin();
pixels2.begin();
}

void loop()

{sensorwert =analogRead(eingang);                            // Reading Potentiometer Value


if (( sensorwert >=0 ) & ( sensorwert <300 ))                // Potentiometer Value Range for Color Red 
{RED1 = 100;
GREEN1 = 0;
BLUE1 = 0;}

if (( sensorwert >301 ) & ( sensorwert <350 ))               // Potentiometer Value Range for Color Yellow 
{RED1 = 100;
GREEN1 = 10;
BLUE1 = 0;}

if (( sensorwert >351 ) & ( sensorwert <400 ))               // Potentiometer Value Range for Color Green 
{RED1 = 0;
GREEN1 = 100;
BLUE1 = 0;}

if (( sensorwert >401 ) & ( sensorwert <450 ))                // Potentiometer Value Range for Color Turkise
{RED1 = 0;
GREEN1 = 100;
BLUE1 = 10;}

if (( sensorwert >451 ) & ( sensorwert <500 ))                 // Potentiometer Value Range for Color Blue 
{RED1 = 0;
GREEN1 = 0;
BLUE1 = 100;}

if (( sensorwert >501 ) & ( sensorwert <550 ))                 // Potentiometer Value Range for Color Lila 
{RED1 = 10;
GREEN1 = 0;
BLUE1 = 100;}

if (( sensorwert >551 ) & ( sensorwert <600 ))                // Potentiometer Value Range for Color White 
{RED1 = 100;
GREEN1 = 100;
BLUE1 = 100;}

if (( sensorwert >601 ) & ( sensorwert <650 ))               // Potentiometer Value Range for Color Pink
{RED1 = 100;
GREEN1 = 10;
BLUE1 = 100;}


{
pixels1.setPixelColor(i1, pixels1.Color(RED1,GREEN1,BLUE1));              // Ring 1
pixels1.setPixelColor(i1-1, pixels1.Color(0,0,0));                                          
pixels1.show();                                                                            
 
if (i1==0) pixels1.setPixelColor(15, pixels1.Color(0,0,0));                     
pixels1.show();                                                                 
i1=i1+1;                                                                        
if (i1==16) i1=0;  

pixels1.setPixelColor(i2, pixels1.Color(RED1,GREEN1,BLUE1));               // Ring2
pixels1.setPixelColor(i2+1, pixels1.Color(0,0,0));                               
pixels1.show();                                                               
 
if (i2==27) pixels1.setPixelColor(17, pixels1.Color(0,0,0));                      
pixels1.show();                                                                
i2=i2-1;                                                                        
if (i2==16) i2=27;
delay (PAUSE1);                                                              
}



{                                                                                          // Ring 3
pixels2.setPixelColor(1, pixels2.Color(RED1,GREEN1,BLUE1)); 
pixels2.setPixelColor(2, pixels2.Color(RED1,GREEN1,BLUE1)); 
pixels2.setPixelColor(3, pixels2.Color(RED1,GREEN1,BLUE1));                                                          
pixels2.show();  
delay (PAUSE1);          

pixels2.setPixelColor(1, pixels2.Color(0,0,0));
pixels2.setPixelColor(2, pixels2.Color(0,0,0)); 
pixels2.setPixelColor(3, pixels2.Color(0,0,0));                                           
pixels2.show(); 
delay (PAUSE2);


pixels2.setPixelColor(3, pixels2.Color(RED1,GREEN1,BLUE1)); 
pixels2.setPixelColor(6, pixels2.Color(RED1,GREEN1,BLUE1)); 
pixels2.setPixelColor(7, pixels2.Color(RED1,GREEN1,BLUE1));                                                 
pixels2.show();  
delay (PAUSE1);
         
pixels2.setPixelColor(3, pixels2.Color(0,0,0));
pixels2.setPixelColor(6, pixels2.Color(0,0,0)); 
pixels2.setPixelColor(7, pixels2.Color(0,0,0));                                           
pixels2.show(); 
delay (PAUSE2);


pixels2.setPixelColor(2, pixels2.Color(RED1,GREEN1,BLUE1)); 
pixels2.setPixelColor(5, pixels2.Color(RED1,GREEN1,BLUE1)); 
pixels2.setPixelColor(4, pixels2.Color(RED1,GREEN1,BLUE1))                                                       
pixels2.show();  
delay (PAUSE1);
         
pixels2.setPixelColor(2, pixels2.Color(0,0,0));
pixels2.setPixelColor(5, pixels2.Color(0,0,0)); 
pixels2.setPixelColor(4, pixels2.Color(0,0,0));                                           
pixels2.show(); 
delay (PAUSE2);
}

}

Dein Sketch ist fast nicht zu lesen. In einem Mobilgerät überhaupt nicht.
Setze den bitte in Code-Tags.

Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Das kannst du auch nachträglich machen.
Dazu den Sketch markieren und die Schaltfläche klicken.

Damit wird dieser für alle besser lesbar.

Und dein Problem lässt sich durch die Verwendung der Funktion “millis()” anstatt von delay lösen.

Sieh dir BlinkWithoutDelay in den beispielen der IDE an.

Hi

Auch kann man die ganzen NeoPixel zusammen hängen. Die Pixel, Denen Du keine neue Farbe zuweist, behalten die Alte. Da Dir bekannt ist, wie viele Pixel welcher Ring hat und dann auch, in welcher Reihenfolge die Ringe angeschlossen wurden, kannst Du auch weiter gezielt Pixel manipulieren. So kannst Du, der kleine Ring ist 'vorne' - die Pixel 0-6 beliebig manipulieren, ohne, daß die Pixel des großen Ring gestört werden. Auch, wenn die Reihenfolge anders ist - der anzusprechende Pixel ist eh nur eine Nummer - Welche, lässt sich einfach berechnen.

Ob sich der Speicherverbrauch bei Einzel-Stripes vergrößert, ist mir nicht bekannt, aber anzunehmen. Vll. bekommst Du einen Geschwindigkeits-Vorteil, wenn Du nur einen der Ringe anpassen musst - wenn Alles 'Ein Stripe' ist, bekommen auch immer alle LED die neue Farbe zugewiesen - auch, wenn's die alte Farbe ist.

MfG