Couleurs en HEX Arduino

Yo,

Trouver des couleurs en HEX normal c'est facile. Trois clics internet et, on trouve des générateurs de couleurs.

Mon probleme est de savoir les convertir en 16 bits. Quelqu'un sait-il faire ?

Ça doit avoir la forme ;

#define 0xFFFF

Si ton format de couleur est RGB565, voici des fonctions qui permettent de convertir de l'un à l'autre, en minimisant la perte de précision, garantissant que le résultat sera le plus proche de la couleur originale.

uint16_t RGB888toRGB565( const uint32_t rgb888 )
{
    uint8_t r, g, b;
    unpackRGB888( rgb888, r, g, b );
    return packRGB888toRGB565( r, g, b );
}

uint32_t RGB565toRGB888( const uint16_t rgb565 )
{
    uint8_t r, g, b;
    unpackRGB565( rgb565, r, g, b);
    return packRGB565toRGB888( r, g, b );
}

void unpackRGB888( const uint32_t color, uint8_t &r, uint8_t &g, uint8_t &b )
{
    r = (uint8_t)((color & 0xFF0000) >> 16);
    g = (uint8_t)((color & 0x00FF00) >> 8);
    b = (uint8_t)((color & 0x0000FF));
}

uint16_t packRGB888toRGB565( const uint8_t r, const uint8_t g, const uint8_t b )
{
    return (uint16_t)(((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3));
}

void unpackRGB565( const uint16_t color, uint8_t &r, uint8_t &g, uint8_t &b )
{
    r = (uint8_t)((color >> 11) & 0x1F);
    g = (uint8_t)((color >> 5) & 0x3F);
    b = (uint8_t)(color & 0x1F);
}

uint32_t packRGB565toRGB888( const uint8_t r, const uint8_t g, const uint8_t b )
{
    return (uint32_t)((((r * 527 + 23) >> 6) << 16) | (((g * 259 + 33) >> 6) << 8) | ((b * 527 + 23) >> 6));
}

Exemple:

uint32_t magenta888 = 0xFF00FF;

uint16_t magenta565 = RGB888toRGB565( magenta888 );
Serial.println( magenta565, HEX ); // F81F

magenta888 = RGB565toRGB888( magenta565 );
Serial.println( magenta888, HEX ); // FF00FF

Oui j'ai enlevé le 'contrairement à', puisqu'hormis le fait que tu arrondisse, il n'y a aucune différence :slight_smile:

Merxi pour toutes vos réponses.

Mais j'ai un probleme en effet la couleur est bleue et non marron.

Le code HEX est D2691E.
Le code BIN est 11010 110100 11110.
Le code HEX est D69E.

Et le résultat TfT est une nuance de bleue.

Autre question ; en 4 digits on a que 64 couleurs diffèrentes (4x16)?

Au temps pour moi, je comprends mes deux erreurs.

Merde, les posts de pepe ont été supprimé et, il avait donné une solution manuelle pour trouver les couleurs.

Quelqu'un se souvient de comment avoir les couleurs dans le bon format ?

Ou alors, expliquez pourquoi ceci ne marche pas :

void setup() {
 Serial.println(9600);
}

void loop() {
uint16_t magenta565 = RGB888toRGB565( 0xFF00FF );
Serial.println( magenta565, HEX );
}

uint16_t RGB888toRGB565( const uint32_t rgb888 ){
   uint8_t r, g, b;
   unpackRGB888( rgb888, r, g, b );
   return packRGB888toRGB565( r, g, b ); }
   
void unpackRGB888( const uint32_t color, uint8_t &r, uint8_t &g, uint8_t &b ){
   r = (uint8_t)((color & 0xFF0000) >> 16);
   g = (uint8_t)((color & 0x00FF00) >> 8);
   b = (uint8_t)((color & 0x0000FF));}

uint16_t packRGB888toRGB565( const uint8_t r, const uint8_t g, const uint8_t b ){
   return (uint16_t)(((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3));}

Calvin-duino:
Ou alors, expliquez pourquoi ceci ne marche pas :

Faudrait essayer d'être factuel!
"ça marche pas" n'explique rien.
Qu'est-ce qui ne marche pas:

  • erreur de compilation?
  • la couleur n'est pas celle attendue?
  • mon programme plante lamentablement?
  • ......

rien ne s'affiche ^^ désolé de l'avoir oublié

Enfait, j'ai réutiliser la réponse plus haut mais, je ne sais plus si elle était complète et ce qui avait été dit dessus.

Tu as mis Serial.println au lieu de Serial.begin.. :slight_smile: