[RISOLTO] Imagazzinare colori rgb scritti in HEX

riecomi qui a rompere ]:slight_smile:

ho un bel problema che non so come risolvere…
in pratica sono riuscito a fare una lista di ben 189 colori rgb scritti in esadecimale del tipo #RRGGBB
Dovrei quindi far accendere il led rgb secondo quei colori, mandandone uno alla volta con una pausa…
per questo motivo dovrei usare un convertitore da esadecimale a decimale, e l‚Äôho fatto. ecco il convertitore:‚Äď>

int convHex2Dec(byte hex)
{
  if (hex >= '0' && hex <= '9') { return hex - '0'; }
  else if (hex >= 'A' && hex <= 'F') { return hex - 'A' + 10; }
}

//nel loop
       inByte = Serial.read;
      if (inByte == '#')
      {
         while (p < 6) // Accumula 6 caratteri
          {
            buffer[p] = Serial.read;
            p++;
          }
 
          valR=convHex2Dec(buffer[1])+convHex2Dec(buffer[0])*16;
          valG=convHex2Dec(buffer[3])+convHex2Dec(buffer[2])*16;
          valB=convHex2Dec(buffer[5])+convHex2Dec(buffer[4])*16;
 
          p = 0;
 
      }

percioò io cn questo codice controllo un rgb da seriale…ma come posso inviare direttamente questo listato di colori che ho fatto?

Non ho capito il problema.

L'elenco dei colori ce l'hai sul PC e vuoi spedire la combinazione RGB ad un Arduino via seriale per far accendere un led? Se è così, devi spedire 3 byte, ogni byte contiene il valore di un canale colore. Ad esempio, $FF0000 corrisponde ad un rosso acceso, devi spedire $FF, $00 e $00. Lato seriale leggi 3 byte, ed usi direttamente il byte senza riconvertirlo ma come valore da usare nell'analogWrite del corrispondente canale colore.

leo72: Non ho capito il problema.

Probabilmente non sa come gestire il protocollo di trasmissione tra pc e Arduino, aspettiamo suoi chiarimenti sulla domanda. In tutti i casi è inutile convertire l'esadecimale in decimale, infatti basta usare direttamente i valori in arrivo sulla seriale, inviati come unsigned char (byte) e non come array di char (stringa), e darli in pasto direttamente all'analogwrite come giustamente suggerisci.

Scusate la tarda risposta... allora no...le cose stanno così: io non voglio inviare tramite seriale il codice....devo direttamente scriverli nello sketch e cmq non posso scrivere per ogni codice il valore hex separato cioè: XRR,XGG,XBB perchè i codici sono troppi :fearful: quindi la seriale non mi serve....ma se è l'unica soluzione magari usando un software a parte allora la userò

Se per "tanti" intedi che puoi saturare la memoria, allora vedo 2 soluzioni: 1) li salvi su una EEPROM esterna da cui poi li leggi 2) li salvi su una schedina SD

Sia nel 1¬į che nel 2¬į caso li memorizzi sempre in formato R/G/B, quindi 3 byte distinti. Ed in entrambi i casi necessiti comunque di HW aggiuntivo

no no sono solo 189...non penso sia troppo grande... cmq partiamo dal fatto ke non posso memorizzarli in 3 byte distinti perchè ci metterei troppo tempo quindi volevo solo sapere se si poteva memorizzare ogni codice in un array e poi selezionando il vettore lo mando al convertitore che ho fatto

igor97: no no sono solo 189...non penso sia troppo grande... cmq partiamo dal fatto ke non posso memorizzarli in 3 byte distinti perchè ci metterei troppo tempo

Non riesco a capire dove sta il problema, sempre tre valori devi inserire, ovvero tre byte per ogni colore, li metti tutti in fila in un array di 567 elementi e li leggi tre per volta assegnando la terna di valori alle relative AnalogWrite per ottenere il colore desiderato.

Salvali come stringa usando PROGMEM per poterli gestire direttamente in Flash. L'alternativa è farsi un array di byte, per risparmiare memoria (189*3=567 celle di memoria),però considera che in fase di runtime ti verrebbe caricato in memoria, occupandoti diverso spazio.

@astrobeed io dico partendo da questa lista: http://elettrofacebook.altervista.org/other/hex.txt

non c'è un modo per memorizzare l'intera stringa #RRGGBB? oppure devo per forza separarli in 3 byte?

@leo72 come dovrei fare con PROGMEM? come faccio poi a prelevare un codice alla volta con un ciclo for? Grazie :D

igor97: @astrobeed io dico partendo da questa lista: http://elettrofacebook.altervista.org/other/hex.txt

Quella lista non puoi memorizzarla direttamente nello sketch in nessun modo, devi comunque scriverla a mano isolando i vari valori, puoi anche lasciarli direttamente in esadecimale, ovvero devi fare una cosa del genere:

stringa[] = {0xC8,0xBA,0x80,0xCE,0xB1,0x81,0xD2,0xAD,0x6B}

igor97: @astrobeed io dico partendo da questa lista: http://elettrofacebook.altervista.org/other/hex.txt

non c'è un modo per memorizzare l'intera stringa #RRGGBB? oppure devo per forza separarli in 3 byte?

Ma non vedo il problema. Ti metti lì ed in 5 minuti hai diviso i codici... ho fatto di peggio, in passato... XD

@leo72 come dovrei fare con PROGMEM? come faccio poi a prelevare un codice alla volta con un ciclo for? Grazie :D

Va creato un array con PROGMEM, è un argomento un po' ostico però. http://www.arduino.cc/playground/Main/PROGMEM

leo72: Ma non vedo il problema. Ti metti lì ed in 5 minuti hai diviso i codici... ho fatto di peggio, in passato... XD

Mi sa tanto che pi√Ļ che un problema di programmazione √® un problema di pigrizia :grin:

leo72: Va creato un array con PROGMEM, è un argomento un po' ostico però. http://www.arduino.cc/playground/Main/PROGMEM

ma il datatype in questo caso quale deve essere?

astrobeed:

leo72: Ma non vedo il problema. Ti metti lì ed in 5 minuti hai diviso i codici... ho fatto di peggio, in passato... XD

Mi sa tanto che pi√Ļ che un problema di programmazione √® un problema di pigrizia :grin:

bè penso proprio di si ]:D ]:D

Tipo dati byte. Ti fai un bell'array di byte, ogni byte 1 terzo di stringa RGB. Poi leggi una tripletta ed hai il valore.

PS: la pigrizia è una brutta bestia :stuck_out_tongue_closed_eyes:

leo72: Tipo dati byte. Ti fai un bell'array di byte, ogni byte 1 terzo di stringa RGB. Poi leggi una tripletta ed hai il valore.

PS: la pigrizia è una brutta bestia :stuck_out_tongue_closed_eyes:

oook grazie leo ora lo faccio :D chiudo qua il topic perchè nn penso di avere altri problemi con lo sketch ciao Igor

non avete mai disegnato uno sprite con il commodore64 :D

mio zio me ne parl√≤ √Ļ.√Ļ penso sia molto ma molto complicato :grin:

non era coplicato era palloso un pixel per volta :sweat_smile:

BrainBooster: non era coplicato era palloso un pixel per volta :sweat_smile:

si si ;) ma io quando dico complicato parlo proprio di una cosa molto lungo da fare :grin:

… allora era mooolto complicato :smiley: sopratutto quando volevi fare l’animazione di uno sprite… disegnare e mettere in codice i vari fotogrammi con i movimenti .