Neopixel non cambia colore

Buon giorno, sto provando i led Neopixel con la libreria Adafruit_NeoPixel.h, ma succede qualcosa che non capisco perchè....
Ho due file di led a cui gli voglio continuamente cambiare colore e utilizzo delle variabili attribuendo il colore:

rosso2 = pixels2.Color(255, 0, 0);
verde1 = pixels1.Color(0 ,255, 0);
 verde2 = pixels2.Color(0 ,255, 0);
 blu1 = pixels1.Color(0 ,0, 255);
blu2 = pixels2.Color(0 ,0, 255);
 red1 = pixels1.Color(255, 0, 0);
orange1=pixels1.Color(255,160,0);
magenta1=pixels1.Color(255,0,255);

poi al bisogno le richiamo con

pixels1.clear();
pixels2.clear();
pixels1.setPixelColor(cycl,red1);
pixels2.setPixelColor(cycl,green2);
pixels1.show();
pixels2.show();

Però non esegue correttamente i colori....il primo è spento, il secondo è giusto....
Poi provo a scrivere

pixels1.clear();
pixels2.clear();
pixels1.setPixelColor(cycl,pixels1.Color(255,0,255));
pixels2.setPixelColor(cycl,green2)
pixels1.show();
pixels2.show();

e funziona regolarmente.....
MI chiedo....cosa sbaglio?
Se sbaglio, come faccio a far cambiare il colore semplicemente dando una variabile??

Posta tutto il codice. Con solo pezzi difficile capire

Se rosso2 è una variabile a 32-bit deve funzionare.
Ma se rosso2 è int o byte non funziona.

Posta più codice incluse le dichiarazioni.

Ciao.

Ho risolto....
Praticamente avevo bisogno di una variabile a 32 bit (uint32_t) ed io banalmente avevo messo un unsigned int (16bit).....
Mio grave errore, dovevo usare unsigned long....
Grazie per le risposte.

Se vai a guardare il codice della libreria uno dei due metodi Color() restituiscono al chiamante una variabile di tipo uint32_t. Se salvi 4 byte in 2 byte del tipo uint16_t, 2 byte li perdi per troncamento. Se al posto di uint16_t avessi usato uint64_t (se disponibile) non avresti perso 2 byte ma ne avresti sprecato 4.

Ora il mio consiglio è di fare tesoro di questi errori, così la prossima volta ti viene il dubbio (255, 0, 255) e ti fai la domanda: come fa la funzione Color() a salvare 3 byte in un contenitore grande solo 2 byte? :grinning:

Ciao.

Certo MAurotec, grazie per i consiglio.
Ora chiedo come posso fare un array con i colori?
Nel senso che ho le variabili a 32bit che contengono il codice del colore,e attualmente ho adto un nome...io vorrei che cambiassero solo con un numero, perchè la parte di codice è comune e non vorrei ripeterla ma cambiare solo la variabile del colore...
COme posso fare?

// dichiarazione e inizializzazione globale dopo le variabili rosso2, verde1 ecc.
uint32_t colori[] = { rosso2, verde1, verde2 };

Tipo come sopra come ti sembra?

Per sapere quanti elementi ci sono in colori puoi usare
sizeof come spiegato qui.

Ciao.

Ho fatto così, dichiarazione varaibili globali

unsigned long rosso1;
unsigned long rosso2;
unsigned long verde1;
unsigned long verde2;
unsigned long blu1;
unsigned long blu2;
unsigned long orange1;
unsigned long orange2;
unsigned long magenta1;
unsigned long magenta2;
unsigned long bianco1;
unsigned long bianco2;
unsigned long matrix1[]={rosso1,verde1,blu1,orange1,magenta1,bianco1};
unsigned long matrix2[]={rosso2,verde2,blu2,orange2,magenta2,bianco2};

Nel setup

 rosso1 = pixels1.Color(255, 0, 0);
 rosso2 = pixels2.Color(255, 0, 0);
 verde1 = pixels1.Color(0 ,255, 0);
 verde2 = pixels2.Color(0 ,255, 0);
 blu1 = pixels1.Color(0 ,0, 255);
 blu2 = pixels2.Color(0 ,0, 255);
 orange1=pixels1.Color(255,160,0);
 orange2=pixels2.Color(255,160,0);
 magenta1=pixels1.Color(255,0,255);
 magenta2=pixels2.Color(255,0,255);
 bianco1=pixels1.Color(255,255,255);
 bianco2=pixels2.Color(255,255,255);

Ma poi quando faccio la chiamata

pixels1.setPixelColor(i,matrix1[0]);
pixels2.setPixelColor(i,matrix2[0]);

Tutto buio....

Ok, risolto....
Si vede che sono un pollo...
Dichiarato globali

unsigned long rosso1 = pixels1.Color(255, 0, 0);
unsigned long rosso2 = pixels2.Color(255, 0, 0);
unsigned long verde1 = pixels1.Color(0 ,255, 0);
unsigned long verde2 = pixels2.Color(0 ,255, 0);
unsigned long blu1 = pixels1.Color(0 ,0, 255);
unsigned long blu2 = pixels2.Color(0 ,0, 255);
unsigned long orange1=pixels1.Color(255,160,0);
unsigned long orange2=pixels2.Color(255,160,0);
unsigned long magenta1=pixels1.Color(255,0,255);
unsigned long magenta2=pixels2.Color(255,0,255);
unsigned long bianco1=pixels1.Color(255,255,255);
unsigned long bianco2=pixels2.Color(255,255,255);
unsigned long matrix1[]={rosso1,verde1,blu1,orange1,magenta1,bianco1};
unsigned long matrix2[]={rosso2,verde2,blu2,orange2,magenta2,bianco2};

e poi richiamato

pixels1.setPixelColor(cycl,matrix1[color]);
pixels2.setPixelColor(cycl,matrix2[color]);

Grazie

Ci sono alternative a ciò che ti ho indicato. Ad esempio se le variabili rosso1 ecc ti servono solo per inizializzare matrix[], potresti decidere di definire delle macro del preprocessore così:

#define ROSSO1 pixels1.Color(255, 0, 0)
unsigned long matrix1[]={ ROSSO1 };

Poi Color() è un metodo statico e come tale se non ricordo male dovrebbe essere possibile richiamarlo così:

uint32_t rosso1 = Adafruit_NeoPixel::Color(255, 0, 0);

Se funziona questo qui sopra eviti di usare la variabile pixels1 e pixels2, tanto che puoi dichiarare e inizializzare l'array prima di creare pixels1 ecc.

Ciao.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.