Problema libreria Neopixel e velocità di lavorazione dati di Arduino

Salve a tutti,
sono nuovo perciò spero di aver scritto un oggetto abbastanza comprensivo.

Vi espongo il mio problema:
sto costruendo per una stanza hobby, con un'illuminazione costituita da strip led Neopixel.

Ho eseguito svariate prove con questa tipologia di led (max 30 led), fatto qualche progetto funzionante, ma ora mi trovo a pilotare circa 300 led, ed il mio problema sta qui.

Quando eseguo il comando "strip.setPixelcolor(numero led,colore)", ho una condizione in cui ad ogni ciclo di Arduino, mi incrementa la variabile "numero Led", fino ad arrivare alla quantità di led utilizzati per poi azzerarsi.

Fino a qua tutto ok. Però su una quantità di 300 led, prima che la variabile "numero led" arrivi a 300, passano praticamente 300ms, e per certi effetti colore (ad es. l'effetto arcobaleno), la velocità in cui Arduino incrementa la variabile dei led è fatale, perché sta troppo tempo a completare un ciclo di colori.

Queste prove le ho eseguite utilizzando un Arduino Nano v3.0, e volevo capire se c'era un modo per far arrivare una variabile da 0 a 300 in meno tempo, oppure se passando ad un Arduino Nano 33BLE(che ha una lavorazione dati sicuramente più veloce), riesco ad incrementare il valore molto più velocemente, avendo magari un ciclo di programma ogni 0.5ms (o magari anche meno) e non a 1ms, come con Arduino Nano v3.0.

Ho considerato molte altre opzioni per pilotare i led, ma questa mi sembra ancora la più fattibile anche economicamente.

Grazie in anticipo a chi mi risponde, spero di esser stato abbastanza chiaro sul mio quesito.

Buongiorno, :slight_smile:
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

Ciao!
Mi sono appena presentato, purtroppo sono uno di poche parole nelle presentazioni!

La spedizione dei dati per 300 LED dura 300 LED x 3 color x 8 bit per colore x 1,25µS tempo di trasferimento per un bit = 900µS = 0,9mS.

Non so spiegarti il perché hai quei tempi. Dovrei vedere il Tuo sketch.

Ciao Uwe

Ciao,

lo sketch è questo:

#include <Adafruit_NeoPixel.h>

#ifdef __AVR__
#include <avr/power.h>
#endif

#define PIXEL_PIN    8 // Data Pin of Led strip 
#define PIXEL_COUNT    300  // Number of LEDs in the strip

 
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_BRG + NEO_KHZ800);

static unsigned long t1, dt;
int ret = 0; 



uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}


static unsigned long tempo0,temp0; uint16_t i0=0; uint8_t  stampaled0;

static unsigned long tempo,temp; uint16_t i=0; uint8_t  stampaled;

static unsigned long tempored,tempred; uint8_t  stampared; uint16_t r=0;

static unsigned long tempogreen,tempgreen; uint8_t  stampagreen; uint16_t g=0;

static unsigned long tempoblue,tempblue; uint8_t  stampablue; uint16_t b=0;

uint32_t WheelPos; uint16_t  j; float velocita=1;

int Striscia=8;

uint32_t rosso=strip.Color(255,0,0);uint32_t verde=strip.Color(0,255,0);uint32_t blu=strip.Color(0,0,255);
uint32_t giallo=strip.Color(255,255,0);uint32_t magenta=strip.Color(255,0,255);uint32_t ciano=strip.Color(0,255,255);
uint32_t bianco=strip.Color(255,255,255);uint32_t spento=strip.Color(0,0,0);

uint8_t inizio1=0; 
int pixel1=strip.numPixels();

int elaborazionesegnale=0;
const int Signal=A5;
const int ledrosso=2;
const int ledverde=3;
const int ledblu=4;
void setup() {

  strip.begin();
  Serial.begin(9600);


  
}

void loop() {
  
  
  elaborazionesegnale=digitalRead(Signal);
  dt = millis(); 
  
 if (elaborazionesegnale==LOW){Striscia++;delay(400);
                               if (Striscia>=9){Striscia=0;}
                              }
  //strip.fill(color, first, count); colore, primo led, quantità led

          if (Striscia==0){strip.fill(spento, inizio1, pixel1);
                          
                           }
          if (Striscia==1){strip.fill(rosso, inizio1, pixel1);
                         
                           }
          if (Striscia==2){strip.fill(verde, inizio1, pixel1);
                         
                           }
          if (Striscia==3){strip.fill(blu, inizio1, pixel1);
          
                           }
          if (Striscia==4){strip.fill(giallo, inizio1, pixel1);
                         
                           }
          if (Striscia==5){strip.fill(ciano, inizio1, pixel1);
                          
                           }
          if (Striscia==6){strip.fill(magenta, inizio1, pixel1);
                         
                           }
          if (Striscia==7){strip.fill(bianco, inizio1, pixel1);
                          
                           }
          
          
     //effetto rainbow 
         if (Striscia==8){velocita=20;} else {velocita=1;}
         tempo=dt-temp;
         if ((tempo>=1)&&Striscia==8){temp=dt;stampaled=1;} else {stampaled=0;};
        
    //variabile numero led      
         if (Striscia==8){   if (i>=strip.numPixels()){i=0;} else {i++;}    
                          }
         
         tempored=dt-tempred;if ((tempored>=velocita)&&Striscia==8){tempred=dt;stampared=1;} else {stampared=0;};
         if (stampared==1){int full;if (r>=256){r=0;} else {r++;}
                          }
                          
         tempogreen=dt-tempgreen;if ((tempogreen>=velocita)&&Striscia==8){tempgreen=dt;stampagreen=1;} else {stampagreen=0;};
         if (stampagreen==1){int full;if (g>=256*10){g=0;} else {g++;}
                            }                       
               
         WheelPos=r+g;

//se non erro, le seguenti 4 righe dovrebbero essere inutilizzate, erano sicuramente delle prove
         WheelPos = 255 - WheelPos;
         if(WheelPos < 85) {strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);}
         if(WheelPos < 170) {WheelPos -= 85; strip.Color(0, WheelPos * 3, 255 - WheelPos * 3); }
         if ( WheelPos -= 170){strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0); }
      
       

 //stampaggio led 
         if (Striscia==8){strip.setPixelColor(i,Wheel(((i * 256 / strip.numPixels()) -g) & 255));
           
                           }
Serial.println(i);
strip.show();
        }

ti avverto, lo sketch è abbastanza un miscuglio di prove, però ho cercato di aggiungere qualche commento, in modo da far capire le righe in cui ho questo problema...

In base alle mie conoscenze sulla libreria "Adafruit_NeoPixel.h", non mi risulta che ci siano altri metodi per stampare il pixel... In qualunque caso sottolineo, la mia ignoranza in materia.

Se hai qualche consiglio, è ben accettato! :smiley:

Grazie!