adafruit 1.44" problème couleur.

Bonjour à tous.
Je m'appel florent et je suis nouveau sur le forum et je débute dans arduino.

je viens d'acheter un arduino UNO R3 avec un adafruit 1.44" color tft avec carte micro SD.

je voulais afficher une photo dans un premier temps et j'y suis arrivé. le problème c'est que mes photo sont bleu.

  • quand je téléverse , au moment ou l'image apparaît elle s'affiche une fraction de seconde(très rapide) en couleur et passe en bleu.

  • de plus mon fond d'écran (file screen) est rouge alors que dans le code il est écrit " blue".

je pense qu'il y a une erreur dans les codes pour pouvoir afficher une image en couleur.
c'est un code qu'il y a sur arduino dans bitmap.

merci de m’éclaircir si possible.

Bonjour ,

je m'appel florent et je suis nouveau sur le forum et dans arduino.

je viens d'acheter un arduino UNO R3 et un adafruit 1.44" tft color avec carte SD.

j'ai récuperer un code déja tout fait dans la librairie et juste changé une chose par rapport a la notice de l'écran.

j'ai réussi a faire afficher une image mais elle apparait en bleu .
A la fin du téléversement elle s'affiche une fraction de seconde en couleur (normal) et aussitôt elle passe en bleu.

je pense qu'il doit y avoir un problème mais je sais pas ou.

merci de m'éclaircir.

Bonjour
13h47 puis 14h22.....
En multipliant les messages , en contradiction avec la règle du forum, sans attendre les réponses sur le premier fil de discussion , tu t'exposes au risque de les voir passer tous à la poubelle

j'ai récuperer un code déja tout fait dans la librairie et juste changé une chose par rapport a la notice de l'écran.

si tu restes aussi vague ( nom du code et description de toutes les modifications effectuées ?) comment espérer des réponses ?

je pense qu'il doit y avoir un problème mais je sais pas ou.

c'est une devinette ?

lib adafruit_st7735 ?
tester les différents tft_init

// Use this initializer if you're using a 1.8" TFT
//tft.initR(INITR_BLACKTAB); // initialize a ST7735S chip, black tab

// Use this initializer (uncomment) if you're using a 1.44" TFT
tft.initR(INITR_144GREENTAB); // initialize a ST7735S chip, black tab

n'hésites pas a changer :
// Use this initializer if you're using a 1.8" TFT
tft.initR(INITR_BLACKTAB); // initialize a ST7735S chip, black tab

// Use this initializer (uncomment) if you're using a 1.44" TFT
//tft.initR(INITR_144GREENTAB); // initialize a ST7735S chip, black tab

pour les puristes:
il y a un registre du st7735 qui se nomme SRGB : RGB direction setting et filter color
pour choisir RGB ou BGR

Merci .Al1fch

Désolé je suis très vague.
Je post ce soir le code complet que j'utilise comme cela se sera plus simple pour trouver le problème.
Merci

re bonjour al1fch,

voici ci dessous le code qui vient de la librairie.
je viens de voir que en haut il disent que le code est pour un adafruit 1.8" et le miens est un 1.44".

This is a library for the Adafruit 1.8" SPI display.

This library works with the Adafruit 1.8" TFT Breakout w/SD card
----> 1.8 Color TFT LCD display with MicroSD Card Breakout [ST7735R] : ID 358 : $19.95 : Adafruit Industries, Unique & fun DIY electronics and kits
The 1.8" TFT shield
----> Adafruit 1.8 Color TFT Shield w/microSD and Joystick [v 2] : ID 802 : $34.95 : Adafruit Industries, Unique & fun DIY electronics and kits
The 1.44" TFT breakout
----> Adafruit 1.44 Color TFT LCD Display with MicroSD Card breakout [ST7735R] : ID 2088 : $14.95 : Adafruit Industries, Unique & fun DIY electronics and kits
as well as Adafruit raw 1.8" TFT display
----> 1.8 SPI TFT display, 160x128 18-bit color - ST7735R driver : ID 618 : $9.95 : Adafruit Industries, Unique & fun DIY electronics and kits

Check out the links above for our tutorials and wiring diagrams
These displays use SPI to communicate, 4 or 5 pins are required to
interface (RST is optional)
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!

Written by Limor Fried/Ladyada for Adafruit Industries.
MIT license, all text above must be included in any redistribution
****************************************************/

#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library for ST7735
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <SPI.h>
#include <SD.h>

// TFT display and SD card will share the hardware SPI interface.
// Hardware SPI pins are specific to the Arduino board type and
// cannot be remapped to alternate pins. For Arduino Uno,
// Duemilanove, etc., pin 11 = MOSI, pin 12 = MISO, pin 13 = SCK.
#define TFT_CS 10 // Chip select line for TFT display
#define TFT_RST 9 // Reset line for TFT (or see below...)
//Use this reset pin for the shield!
//#define TFT_RST -1 // you can also connect this to the Arduino reset!
#define TFT_DC 8 // Data/command line for TFT

#define SD_CS 4 // Chip select line for SD card

// For 0.96", 1.44" and 1.8" TFT with ST7735 use
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

// For 1.54" TFT with ST7789
//Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);

void setup(void) {
Serial.begin(9600);

Maintenant avec cela sa devrait être un peu plus simple.

merci d'avance

Mais votre code est incomplet...
Pourquoi avez vous Adafruit_ST7789.h (et cachez par des commentaires ce driver)?
Avez vous fait passer des exemples simples (les démos)?

Est ce que votre image est sur la SD?

Par ailleurs, elektrax, dans sa dernière phrase, a levé une piste interessante (semble coller avec la description de vos déboires)
et pour finir, vous aurez des problèmes -et vos lecteurs- si vous n'encadrez pas les codes par des balises

c'est ici qu'il faut changer les differentes initialisations UNE A LA FOIS :

tft.initR(INITR_144GREENTAB); // Init ST7735R chip, green tab

ou

tft.initR(INITR_BLACKTAB);
ne vous inquietez pas que ce soit écrit pour 1.8

la solution est décrite sur le forum adafruit mais il faut modifier des lignes du fichier.h
The more efficient way is to clear RGB bit in then MADCTL register - this will automatically swap colors and no swapcolor() is necessary.

Here are simple changes:

Replace 0xC8 witt 0xC0:
ST7735_MADCTL , 1 , // 14: Memory access control (directions), 1 arg:
0xC0, // row addr/col addr, bottom to top refresh
Also remove all instances of MADCTL_RGB from setRotation

réponse de l'admin adafruit :
Thats right! thanks for the reminder, latest github library has this fix and supports all tab colors
et çà date de 2013 !!!

vous pourriez essayer une autre biblio comme ucglib, mais je pense pas que soyez assez aguerri pour chipoter entre les différentes biblios

Si tu peux également éditer ton message et mettre ton code entre les balises.

jfs:
Si tu peux également éditer ton message et mettre ton code entre les balises.

Peut tu m'expliquer car je ne comprend pas.

expliqué ici

coller le code complet svp

elektrax:
expliqué ici

coller le code complet svp

je te remercie .

je vai essayer de faire sa ce soir avec les autres conseil du forum

dbrion06:
Mais votre code est incomplet...
Pourquoi avez vous Adafruit_ST7789.h (et cachez par des commentaires ce driver)?
Avez vous fait passer des exemples simples (les démos)?

Est ce que votre image est sur la SD?

Voici une partie de la suite du code. c'est chiant on peut pas tout mettre.
mes images sont sur la SD.
Pour les exemples jai fait des test avec les differentes librairie est sa al'air de fonctionner.

  while (!Serial) {

delay(10);  // wait for serial console
  }

pinMode(TFT_CS, OUTPUT);
  digitalWrite(TFT_CS, HIGH);
  pinMode(SD_CS, OUTPUT);
  digitalWrite(SD_CS, HIGH);

// Use this initializer if you're using a 1.8" TFT
  tft.initR(INITR_BLACKTAB);

// Use this initializer (uncomment) if you're using a 1.44" TFT
  //tft.initR(INITR_144GREENTAB);

// Use this initializer (uncomment) if you're using a 0.96" 180x60 TFT
  //tft.initR(INITR_MINI160x80);  // initialize a ST7735S chip, mini display

// Use this initializer (uncomment) if you're using a 1.54" 240x240 TFT
  //tft.init(240, 240);  // initialize a ST7789 chip, 240x240 pixels

tft.fillScreen(ST77XX_BLUE);

Serial.print("Initializing SD card...");
  if (!SD.begin(SD_CS)) {
    Serial.println("failed!");
    return;
  }
  Serial.println("OK!");

File root = SD.open("/");
  printDirectory(root, 0);
  root.close();
 
  // change the name here!
  bmpDraw("parrot.bmp", 0, 0);
  // wait 5 seconds
  delay(5000);
}

void loop() {
// uncomment these lines to draw bitmaps in different locations/rotations!
/*
  tft.fillScreen(ST7735_BLACK); // Clear display
  for(uint8_t i=0; i<4; i++)    // Draw 4 parrots
    bmpDraw("parrot.bmp", tft.width() / 4 * i, tft.height() / 4 * i);
  delay(1000);
  tft.setRotation(tft.getRotation() + 1); // Inc rotation 90 degrees
*/
}

// This function opens a Windows Bitmap (BMP) file and
// displays it at the given coordinates.  It's sped up
// by reading many pixels worth of data at a time
// (rather than pixel by pixel).  Increasing the buffer
// size takes more of the Arduino's precious RAM but
// makes loading a little faster.  20 pixels seems a
// good balance.

#define BUFFPIXEL 20

void bmpDraw(char *filename, uint8_t x, uint16_t y) {

File    bmpFile;
  int      bmpWidth, bmpHeight;  // W+H in pixels
  uint8_t  bmpDepth;              // Bit depth (currently must be 24)
  uint32_t bmpImageoffset;        // Start of image data in file
  uint32_t rowSize;              // Not always = bmpWidth; may have padding
  uint8_t  sdbuffer[3*BUFFPIXEL]; // pixel buffer (R+G+B per pixel)
  uint8_t  buffidx = sizeof(sdbuffer); // Current position in sdbuffer
  boolean  goodBmp = false;      // Set to true on valid header parse
  boolean  flip    = true;        // BMP is stored bottom-to-top
  int      w, h, row, col;
  uint8_t  r, g, b;
  uint32_t pos = 0, startTime = millis();

if((x >= tft.width()) || (y >= tft.height())) return;

Serial.println();
  Serial.print(F("Loading image '"));
  Serial.print(filename);
  Serial.println(''');

// Open requested file on SD card
  if ((bmpFile = SD.open(filename)) == NULL) {
    Serial.print(F("File not found"));
    return;
  }

// Parse BMP header
  if(read16(bmpFile) == 0x4D42) { // BMP signature
    Serial.print(F("File size: ")); Serial.println(read32(bmpFile));
    (void)read32(bmpFile); // Read & ignore creator bytes
    bmpImageoffset = read32(bmpFile); // Start of image data
    Serial.print(F("Image Offset: ")); Serial.println(bmpImageoffset, DEC);
    // Read DIB header
    Serial.print(F("Header size: ")); Serial.println(read32(bmpFile));
    bmpWidth  = read32(bmpFile);
    bmpHeight = read32(bmpFile);
    if(read16(bmpFile) == 1) { // # planes -- must be '1'
      bmpDepth = read16(bmpFile); // bits per pixel
      Serial.print(F("Bit Depth: ")); Serial.println(bmpDepth);
      if((bmpDepth == 24) && (read32(bmpFile) == 0)) { // 0 = uncompressed

goodBmp = true; // Supported BMP format -- proceed!
        Serial.print(F("Image size: "));
        Serial.print(bmpWidth);
        Serial.print('x');
        Serial.println(bmpHeight);

// BMP rows are padded (if needed) to 4-byte boundary
        rowSize = (bmpWidth * 3 + 3) & ~3;

// If bmpHeight is negative, image is in top-down order.
        // This is not canon but has been observed in the wild.
        if(bmpHeight < 0) {
          bmpHeight = -bmpHeight;
          flip      = false;
        }

// Crop area to be loaded
        w = bmpWidth;
        h = bmpHeight;
        if((x+w-1) >= tft.width())  w = tft.width()  - x;
        if((y+h-1) >= tft.height()) h = tft.height() - y;

// Set TFT address window to clipped image bounds
        tft.startWrite();
        tft.setAddrWindow(x, y, w, h);

for (row=0; row<h; row++) { // For each scanline...

// Seek to start of scan line.  It might seem labor-
          // intensive to be doing this on every line, but this
          // method covers a lot of gritty details like cropping
          // and scanline padding.  Also, the seek only takes
          // place if the file position actually needs to change
          // (avoids a lot of cluster math in SD library).
          if(flip) // Bitmap is stored bottom-to-top order (normal BMP)
            pos = bmpImageoffset + (bmpHeight - 1 - row) * rowSize;
          else    // Bitmap is stored top-to-bottom
            pos = bmpImageoffset + row * rowSize;
          if(bmpFile.position() != pos) { // Need seek?
            tft.endWrite();
            bmpFile.seek(pos);
            buffidx = sizeof(sdbuffer); // Force buffer reload
          }

for (col=0; col<w; col++) { // For each pixel...
            // Time to read more pixel data?
            if (buffidx >= sizeof(sdbuffer)) { // Indeed
              bmpFile.read(sdbuffer, sizeof(sdbuffer));
              buffidx = 0; // Set index to beginning
              tft.startWrite();
            }

// Convert pixel from BMP to TFT format, push to display
            b = sdbuffer[buffidx++];
            g = sdbuffer[buffidx++];
            r = sdbuffer[buffidx++];
            tft.pushColor(tft.color565(r,g,b));
          } // end pixel
        } // end scanline
        tft.endWrite();
        Serial.print(F("Loaded in "));
        Serial.print(millis() - startTime);
        Serial.println(" ms");
      } // end goodBmp
    }
  }

bmpFile.close();
  if(!goodBmp) Serial.println(F("BMP format not recognized."));
}

// These read 16- and 32-bit types from the SD card file.
// BMP data is stored little-endian, Arduino is little-endian too.
// May need to reverse subscript order if porting elsewhere.

uint16_t read16(File f) {
  uint16_t result;
  ((uint8_t *)&result)[0] = f.read(); // LSB
  ((uint8_t *)&result)[1] = f.read(); // MSB
  return result;
}

elektrax:
lib adafruit_st7735 ?
tester les différents tft_init

pour les puristes:
il y a un registre du st7735 qui se nomme SRGB : RGB direction setting et filter color
pour choisir RGB ou BGR

Désolé mais je sais pas ce qu'est un registre

dbrion06:
Mais votre code est incomplet...

voici la suite et la fin du code

uint32_t read32(File f) {
  uint32_t result;
  ((uint8_t *)&result)[0] = f.read(); // LSB
  ((uint8_t *)&result)[1] = f.read();
  ((uint8_t *)&result)[2] = f.read();
  ((uint8_t *)&result)[3] = f.read(); // MSB
  return result;
}


void printDirectory(File dir, int numTabs) {
  while (true) {

    File entry =  dir.openNextFile();
    if (! entry) {
      // no more files
      break;
    }
    for (uint8_t i = 0; i < numTabs; i++) {
      Serial.print('\t');
    }
    Serial.print(entry.name());
    if (entry.isDirectory()) {
      Serial.println("/");
      printDirectory(entry, numTabs + 1);
    } else {
      // files have sizes, directories do not
      Serial.print("\t\t");
      Serial.println(entry.size(), DEC);
    }
    entry.close();
  }
}

[code]
  // Use this initializer if you're using a 1.8" TFT
  tft.initR(INITR_BLACKTAB);

  // Use this initializer (uncomment) if you're using a 1.44" TFT
  //tft.initR(INITR_144GREENTAB);

  // Use this initializer (uncomment) if you're using a 0.96" 180x60 TFT
  //tft.initR(INITR_MINI160x80);   // initialize a ST7735S chip, mini display

  // Use this initializer (uncomment) if you're using a 1.54" 240x240 TFT
  //tft.init(240, 240);   // initialize a ST7789 chip, 240x240 pixels

  tft.fillScreen(ST77XX_BLUE);  

[color=red]l'écran se met-il en fond bleu ou rouge ?[/color]

elektrax:

  // Use this initializer if you're using a 1.8" TFT

tft.initR(INITR_BLACKTAB);

tft.fillScreen(ST77XX_BLUE);

l'écran se met-il en fond bleu ou rouge ?

salut elektrax.

oui le fond d'écran est rouge alors que la couleur demandé est bleu.

j'ai changé le fond d'écran et j'ai mis white a la place de blue.

mais pour répondre à ta question j’essaierai de mettre rouge en fond et voir.

c'est bizard , mais photos sont bleu et blanche .comme j'ai mis au début du post , a la fin de téléversement l'image apparaît un dixième de seconde en couleur est ce met ensuite en bleu et blanc.

"Désolé mais je sais pas ce qu'est un registre"
C'est une petite mémoire (typiquement 1 ou 2 caractère) qui permet, dans le cas général, de stocker des informations utiles au fonctionnement de la puce; dans ce cas, de savoir si on transmet des données en RGB (rouge d'abord, puis vert -green- , puis bleu) ou BGR... s'il est mal renseigné, les couleurs peuvent être dénaturées.

[quote author=elektrax link=msg=4086726 date=1551925290]


  tft.fillScreen(ST77XX_BLUE);  

[color=red]l'écran se met-il en fond bleu ou rouge ?[/color]

[/quote]

je viens de tester

Quand je mets BLUE le fond d'écran est rouge
Quand je mets RED le fond d'écran est bleu

C'est bizard

Non ce n'est pas bizarre c'est ce que l'on t'a expliqué un peu plus haut. Suivant le type d'écran monté sur la carte on peut être confronté à une permutation entre les points rouge et bleu. Il faut regarder dans la librairie que tu utilises s'il n'y aurait pas un paramètre à donner lors de l'initialisation pour permuter rouge et bleu.

Adafruit fait bien son boulot en général, tu as suivi ce tuto?