Accensione neopixel dall'ultimo al primo

Buonasera a tutti, avrei bisogno di accendere una striscia led neopixel sia dal pixel 0 al 50 sia dal pixel 50 a 0.

lo sketch per andare da 0 a 50 funziona

 for(int i=0;i<NUMPIXELS;i++){
        pixels.setPixelColor(i, pixels.Color(100, 255, 0)); // imposta il colore per ogni led.
    pixels.show(); 
    delay(delayval);
   }

ho provato diversi modi per cambiare il ciclo for

 for(int i=NUMPIXELS ;i=0;i--){

 for(int i=NUMPIXELS ;i=0;i-1){

 for(int i=NUMPIXELS ;i>1;i--){

 for(int i=NUMPIXELS ;i<0;i--){

 for(int i=NUMPIXELS ;i<0;i-1){

ma non funziona niente dov’è l’errore?

Ne avessi azzeccata una :smiley: :grin:

Invece di tentare, sarebbe meglio vedere come funziona il for così saprai sempre adoperarlo.

Analizziamo quello che funziona:

for(int i=0;i<NUMPIXELS;i++)

guarda i tre pezzi dentro le parentesi ():

int i = 0

stiamo usando una variabile int che chiamiamo i e le diamo il valore iniziale 0

i<NUMPIXELS

condizione per rimanere dentro il ciclo, vuol dire che ripeti il ciclo fino a quando è vero che i è minore di NUMPIXELS

i++

Come devi modificare i alla fine di ogni ciclo. In questo caso, alla fine di ogni ciclo i aumenta di 1, infatti scrivere i++ è come dire “usa il valore di i e poi fai i = i+1”.

Prova a prendere questi tre pezzi ed adattarli alla tua esigenza. Vuoi partire da 50, diminuire di 1 e farlo fino a quando il valore di i è maggiore o uguale a 0.

il terzo for è scritto giusto (quasi). Definisci errore e non funziona niente perché dovrebbe funzionare, metti tutto il codice usato

for(int i=0; i<NUMPIXELS; i++)   // va da 0 a NUMPIXELS-1, perciò al contrario diventa: 

for(int i=NUMPIXELS-1; i>=0; i--)

Grazie per le spiegazioni e soluzione.

non capisco come mai con questo sketch

for(int i=NUMPIXELS; i>1; i--){
    // accende tutti i led di Rosso
    pixels.setPixelColor(i, pixels.Color(100, 255, 0));
    pixels.show();
    delay(delayval);
   }

ieri sera non si accendeva niente :sleeping: :sleeping:
ora ho riprovato e infatti si accendono tutti tranne i led 1 e 0

In realtà se ne "accende" anche uno che non esiste: se sono 50 LED, hanno indirizzi da 0 a 49 :slight_smile:

Datman:
In realtà se ne “accende” anche uno che non esiste: se sono 50 LED, hanno indirizzi da 0 a 49 :slight_smile:

Non esattamente, è perché lui con:

for(int i=NUMPIXELS; i>1; i–){

parte dal led con indice NUMPIXELS (che non esiste, come hai identificato tu, ma penso che la libreria ignori questo comando errato) ed esce quando i arriva ad 1 per via della condizione “i>1” (quindi non accende né 1 né 0).

Deve andare da NUMPIXELS-1 (es. 50 LED, quindi 49) ma deve anche arrivare a comprendere lo 0 (non i>1 ma i>=0).

Sì, infatti: oltre a non accendersi lo 0 e l'1, viene pilotato il n.50 che non esiste, perché vanno da 0 a 49.
Così come ho scritto nella terza risposta, invece, dovrebbe funzionare

oppure:
for(int i=NUMPIXELS-1; i>-1; i--)
o, meglio:
for(int8_t i=NUMPIXELS-1; i>-1; i--)

Datman:
Così come ho scritto nella terza risposta, invece, dovrebbe funzionare

Beh non veolvo dargli troppa "pappa pronta" e farlo scervellare un pochino per capire come funziona la for() ma vabbé.. :wink:

Comunque io nella condizione della for() preferisco sempre metterla con l'uguale per esplicitare il range di validità:

for(int i=NUMPIXELS-1; i>=0; i--)