Uso dei millis in programma neopixel

Ciao a tutti, ho fatto girare un programma semplice per accendere in sequenza dei led neopixel creando un effetto scia.....
Tutto bene perchè uso dei delay, ora però mi bloccano tutto il resto del programma...
come posso utilizzare i millis al posto del delay?
ho scritto questo

for ( i=0;i<NUMPIXELS+5;i++){
  pixels.setPixelColor(i,pixels.Color(8,8,8));        //0x080808
  if (i>=5){pixels.setPixelColor(i-5,pixels.Color(200,200,200));}
  pixels.show();
  delay(delayval); 
  pixels.setPixelColor(i,pixels.Color(16,16,16));     //0x080808
  if (i>=5){pixels.setPixelColor(i-5,pixels.Color(128,128,128));}
  pixels.show();
  delay(delayval);
  if (i<=5){pixels.setPixelColor(i-5,pixels.Color(32,32,32));}
  pixels.setPixelColor(i,pixels.Color(32,32,32));     //0x202020
  pixels.show();
  delay(delayval);
  if (i>=5){pixels.setPixelColor(i-5,pixels.Color(16,16,16));}
  pixels.setPixelColor(i,pixels.Color(128,128,128));  //0x808080
  pixels.show();
  delay(delayval);
  if (i>=5){pixels.setPixelColor(i-5,pixels.Color(8,8,8));}
  pixels.setPixelColor(i,pixels.Color(200,200,200));  //0xC8C8C8
  pixels.show();
  delay(delayval);  
  if (i>=5){pixels.setPixelColor(i-5,pixels.Color(0,0,0));}
  pixels.setPixelColor(i,pixels.Color(255,255,255));  //0xFFFFFF
  pixels.show();
  delay(delayval);
}

Delayval è un valore di intervallo tra una sfumatura e l'altra.
Grazie.

Come sempre: macchina a stati dipendente dal tempo trascorso.
Considera che ci sono ostacoli di due tipi: c'è il for iniziale e ci sono i delay all'interno
Il for puoi sostituirlo con un if, incrementando i alla fine del blocco.

Per semplificare il programma potresti scrivere una funzione colore (attento: se i==5 sono vere entrambe!):

void colore_imag5 (byte col1, byte col2)
  {
  pixels.setPixelColor (i,pixels.Color(col1, col1, col1));        //0x080808
  if (i>=5) {pixels.setPixelColor(i-5,pixels.Color(col2, col2, col2));}
  pixels.show();
  }

void colore_imin5 (byte col1, byte col2)
  {
  pixels.setPixelColor (i,pixels.Color(col1, col1, col1));        //0x080808
  if (i<=5) {pixels.setPixelColor(i-5,pixels.Color(col2, col2, col2));}
  pixels.show();
  }

perciò verrebbe:

for (i=0;i<NUMPIXELS+5;i++){
  colore_imag5 ( 8,200);
  delay(delayval);
  colore_imag5 (16,128);
  delay(delayval);
  colore_imin5 (32, 32);
  delay(delayval);
  colore_imag5 (16,128);
  delay(delayval);
  colore_imag5 ( 8,200);
  delay(delayval); 
  colore_imag5 ( 0,255);
  delay(delayval);
}
if (i<NUMPIXELS+5)
  {
  colore_imag5 ( 8,200);
  delay(delayval);
  colore_imag5 (16,128);
  delay(delayval);
  colore_imin5 (32, 32);
  delay(delayval);
  colore_imag5 (16,128);
  delay(delayval);
  colore_imag5 ( 8,200);
  delay(delayval);
  colore_imag5 ( 0,255);
  delay(delayval);
  i++;
  }
}
void colore_imag5 (byte col1, byte col2)
  {
  pixels.setPixelColor (i, pixels.Color(col1, col1, col1));
  if (i>=5) {pixels.setPixelColor(i-5, pixels.Color (col2, col2, col2));}
  pixels.show();
  }

void colore_imin5 (byte col1, byte col2)
  {
  pixels.setPixelColor (i, pixels.Color (col1, col1, col1));
  if (i<=5) {pixels.setPixelColor(i-5, pixels.Color (col2, col2, col2));}
  pixels.show();
  }

---------------------------------

if (i<NUMPIXELS+5)
  {
  switch (stato)
    {
    case 1: colore_imag5 ( 8,200); break;
    case 2: colore_imag5 (16,128); break;
    case 3: colore_imin5 (32, 32); break;
    case 4: colore_imag5 (16,128); break;
    case 5: colore_imag5 ( 8,200); break;
    case 6: colore_imag5 ( 0,255); break;
    }
  delay(delayval);
  stato+=1; 
  if (stato==7) {stato=1; i++;}
  }
}

Ci vuole ancora qualcosa... e bisogna sostituire il delay().

Sei sicuro?...

 if (i<=5) {pixels.setPixelColor (i-5, pixels.Color (32,32,32));}

Non ci sarebbe differenza... Forse deve essere:

 if (i<5) {pixels.setPixelColor (i, pixels.Color (32,32,32));}

Datman,

Sei sicuro?...

 if (i<=5) {pixels.setPixelColor (i-5, pixels.Color (32,32,32));}

Non ci sarebbe differenza... Forse deve essere:

 if (i<5) {pixels.setPixelColor (i, pixels.Color (32,32,32));}

Mi sono sbalgiato il codice corretto è

if (i>=5) {pixels.setPixelColor (i-5, pixels.Color (32,32,32));}

Resta comunque un problema l'uso del delay....
Quello lo sto trovando un ostacolo molto grande....
Non so come fare...mi si blocca tutto