imagenes en blanco y negro en sd.(solucionado por nuken)

Hola haber si me podeis ayudar en esto,estoy usando el ejemplde Adafruit imagenes en sd y no soy capaz de ver las imagenes en color salen en blanco y negro,desde ya gracias.

// Modified TFTbmp sketch from Adafruit_TFTLCD Library for
// TFT shield LCD 2.4" Chip ILI9341
// http://www.electronicavm.net
// @iPadNanito

#include <Adafruit_GFX.h>    // Libreria de graficos
#include <Adafruit_TFTLCD.h> // Libreria de LCD 
#include <SD.h>              // Libreria de tarjeta SD
#include <SPI.h>             // Libreria bus SPI 

#define LCD_CS A3   // Definimos los pines del LCD
#define LCD_CD A2   // para poder visualizar elementos graficos
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4

// Los pines del puerto SPI vienen configurados por libreria, por lo que 
// solamente debemos colocar el pin correspondiente al Chip Select del
// bus SPI correspondiente a la conexion con la tarjeta SD
#define SD_CS 10  

// En la tarjeta SD debemos colocar imagenes en formato BMP de 24 Bits!
// Otro tipo de formato de imagen no se puede visualizar por pantalla. 

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);  // Instancia LCD 

void setup()
{
  Serial.begin(9600); // Iniciamos el puerto serie para comprobar 
                      // la comunicacion con la tarjeta microSD
                      
  tft.reset();
  
  tft.begin(0x9341); // Iniciamos el LCD especificando el controlador ILI9341. 

  Serial.print(F("Inicializando tarjeta SD..."));
  
  if (!SD.begin(SD_CS)) // Si se produce un error al intentar acceder
  {                     // a la tarjeta SD, lo mostramos por el Serial Monitor
    Serial.println(F("Error!"));
    return;
  }
  Serial.println(F("OK!"));
  
}

void loop()
{
   tft.setRotation(5); // Establecemos la posicion de la pantalla Vertical
   
   bmpDraw("1.bmp", 0, 0); // Mostramos una imagen en las coordenadas 0,0
   
   delay(1000);
  
   tft.setRotation(5); // Establecemos la posicion de la pantalla Horizontal
   
   bmpDraw("2.bmp",0,0); // // Mostramos otra imagen en las coordenadas 0,0
   
   delay(1000);  
}

// Esta funcion abre un archivo Windows bitmap (BMP) y lo muestra por 
// pantalla en las coordenadas especificadas. Se puede acelerar el 
// proceso de muestreo leyendo muchos pixeles a la vez en lugar de 
// leer pixel a pixel, incrementando el tamaño de la siguiente variable 
// BUFFPIXEL, utilizaremos mas memoria RAM del Arduino pero se realizará
// la carga de la imagen mas rapido.
// Un buffer de 20 pixeles es un valor equilibrado. 

#define BUFFPIXEL 20

void bmpDraw(char *filename, int x, int 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 in buffer (R+G+B per pixel)
  uint16_t lcdbuffer[BUFFPIXEL];  // pixel out buffer (16-bit 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();
  uint8_t  lcdidx = 0;
  boolean  first = true;

  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.println(F("File not found"));
    return;
  }

  // Parse BMP header
  if(read16(bmpFile) == 0x4D42) { // BMP signature
    Serial.println(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.setAddrWindow(x, y, x+w-1, y+h-1);

        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?
            bmpFile.seek(pos);
            buffidx = sizeof(sdbuffer); // Force buffer reload
          }

          for (col=0; col<w; col++) { // For each column...
            // Time to read more pixel data?
            if (buffidx >= sizeof(sdbuffer)) { // Indeed
              // Push LCD buffer to the display first
              if(lcdidx > 0) {
                tft.pushColors(lcdbuffer, lcdidx, first);
                lcdidx = 0;
                first  = false;
              }
              bmpFile.read(sdbuffer, sizeof(sdbuffer));
              buffidx = 0; // Set index to beginning
            }

            // Convert pixel from BMP to TFT format
            b = sdbuffer[buffidx++];
            g = sdbuffer[buffidx++];
            r = sdbuffer[buffidx++];
            lcdbuffer[lcdidx++] = tft.color565(r,g,b);
          } // end pixel
        } // end scanline
        // Write any remaining data to LCD
        if(lcdidx > 0) {
          tft.pushColors(lcdbuffer, lcdidx, first);
        } 
        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;
}

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;
}

nadie? es posible esto?

flipante!ver como pasan de uno cuando dices las cosas a los listos de turno!al que le pica ajos come! y cria "CUERVOS" y te sacaran los ojos!

Vamos a analizar un poco, los tres mensajes de este post.

Primer mensaje, creado: Nov 24, 2015, 06:03 pm
Segundo mensaje: Today at 09:23 am, o sea, 15 horas y 20 minutos después.
Tercer mensaje: Today at 12:39 pm , 18 horas y 36 minutos después del primero.

A ver, vamos a dejar claras las cosas, porque parece que no lo están. La gente que estamos en este foro, no estamos aquí como un trabajo, ni como una obligación, ni en exclusiva para atender las necesidades de los demás. Quien más y quien menos, tenemos nuestro trabajo, el que nos permite vivir, y pagar las facturas, incluida la de la línea de internet, que nos permite conectarnos a este foro, como un entretenimiento, y si de paso, podemos ayudar a alguien, pues mejor.

Una vez dejado claro todo esto, Lo que no puedes pretender, es que, en menos de 24h. venga alguien y te responda el post con la solución. Sí, pones un código, pero en ningún momento, dices qué modelo de TFT estás usando. Porel código, se intuye que puede ser una TFT shield LCD 2.4" Chip ILI9341 pero es solo eso, una intuición. Para continuar, es muy posible que, los que hayamos leído el post, no dispongamos de dicha TFT, para poder hacer la prueba, como tampoco disponemos de las imágenes que quieres mostrar en la misma.

Hay un usuario muy puesto en temas de pantallas TFT, que muy posiblemente, no ha visto el post, porque no creo que esté las 24h del día mirando el foro, a ver quien necesita su ayuda.

Para finalizar, dices esto:

enter_67:
flipante!ver como pasan de uno cuando dices las cosas a los listos de turno!al que le pica ajos come! y cria "CUERVOS" y te sacaran los ojos!

¿Quien se supone que son los listos de turno? Porque mirando los post que has publicado (y esto no es más que una cosa que puede usar cualquier usuario del foro públicamente, haciendo click en el nickname de cualquier usuario, veo esto:

Los tres últimos mensajes, son los de este post, y los tres anteriores, los de este:

https://forum.arduino.cc/index.php?topic=360709.msg2491425#msg2491425

En el que estoy yo implicado. Ahora, vuelvo a formular la pregunta de otra forma, ¿soy yo uno de "los listos de turno"? porque viendo tu última actividad en el foro, es lo primero que se me ocurre.

Es ese otro post que pongo, no se te niega la ayuda en ningún momento, no se te dice nada fuera de lugar, y dices esta frase: "no entiendo tanto mal estar" ¿Que mal estar? Nadie te ha dicho nada fuera de tono. Ahí están los mensajes del post para quien los quiera ver. Si no he vuelto a responder, es simplemente, porque por cuestiones de trabajo, no he tenido tiempo para mirar más cosas de tu post.

Tengo montado un arduino uno, con el LCD y un keypad improvisado con pulsadores y cables en una protoboard, para hacer las pruebas de ese otro post, en el que te he estado ayudando, pero sintiéndolo mucho, no pienso tolerar esta actitud, y esta falta de respeto por la gente que ayuda a los demás de forma totalmente desinteresada. No hace falta decir, que en el momento de después de dar al botón de post, me voy a disponer a desmontar el montaje en cuestión, ya que no tenemos por qué aguantar insolencias de este tipo.

Esto no es ayuda express. Un poco de paciencia y comprensión.

Bueno habla el otro implicado en el post.
Siento una ola de personas que menosprecian al Arduino y vienen y exigen que se les de solución a sus peticiones en tiempo y forma. Para colmo, no aportan información como corresponden.
Y tampoco hacen el mas mínimo esfuerzo para entender que ocurre. Y no te enojes porque puedes probar cientos de programas con tu TFT. No has dicho que corriendo algun demo sale a color o si?

Muchas veces como hizo carmeloco destinamos mucho tiempo de nuestra parte para resolver problemas pero aún asi se quejan. Otras cuando uno sugiere que eso me lleva tiempo y como el tiempo es dinero se le ofrece la ayuda personalizada permitida en las
En el otro post hablas de Nano, en el medio cambias a UNo y terminas con un MEGA. Todo porque yo te lo pregunté porque ni siquiera puedes cambiar el título como te pedí en uno de los primeros post para que retiraras la palabra Ayuda.

Asi que nosotros demos ayudarte inmediatamente pero tu dessde el día 21-11-2015, 17:43:11 no puedes cambiar el título de tu post que tiene la palabra AYUDA que es justamente lo que todos hacemos al responderte y como esta implicita la ayuda en toda respuesta no hace falta reiterarla. Además asi lo dicen las normas.

Bien. Yo no quiero agregar otra discusión pero intenta ser mas calmo y paciente con las posibles respuestas.
Si no sabes como ya lo has expresado, no es una vergüenza estudiar un poco Arduino con un libro o con los tutoriales que hay en Documentación.
Tu vienes con problemas que exigen primero mucho tiempo entender y luego responder con alguna propiedad.
Es importante que valores eso antes de molestarte porque en 24hs nadie te ha respondido porque tu TFT no muestra imagenes a color, pero menos reclamar a un grupo de este foro, como si tuvieramos obligación de hacerlo.

Ahora menos que menos te respondo.

cuando seas viejo lo entederas mientras disfruta de la vida, ayuda los demás que ya trabajaron para otros y por cierto no leísteis o no te interesa el último post del proyecto que quería hacer y que gracias a ti no saldrá,y por supuesto viendo este percaz menos aún por que yo soy un bicho raro..:al que no me va a contestar mas,pues bien que as contesttado a unos cuantos estando mi post ya antes que el de otros, y no me digas que no a bueno que ya no eres Capitan ahora General venga otra estrella mas,que yo leo todos los post Coronel!

Tengo 54, que cumplí ayer. Por lo demás respondo porque no tengo que pensar ni montar un TFT a ver que le ocurre como tu preguntas.
Que parte no entiendes que responder responsablemente implica darte la respueta mas acertada desde lo técnico y no siempre se puede, porque no sabemos todos los temas.

Respecto de capital, mayor, coronel, esa es una broma que llevo con pincho1979 (no recuerdo bien su nick) otro forero y nadie mas.

Verifiqué el codigo que subiste al principio. Funciona bien, posiblemente el problema está en las imágenes que quieres usar, deben ser BMP de 24 bits, de 320x240.

Te recomiendo usar una microSD de 4 Gb, formateada con el programa SDFormatter.

Si aun persisten los problemas, te recomiendo usar esta libreria modificada:

Incluso funciona la pantalla táctil

Gracias TFTCDCyg pero estan en color y en 24 bits de bmp,el problema es que se ven los colores en blanco y negro como si estuvieran velados y si pongo el ejemplo de dibujar me salen los colores invertidos,es decir el blanco en azul,el negro en verde y asi.

Sube las imagenes que pretendes usar.

Te dejo las imágenes que utilicé para verificar el codigo que colocaste en el primer post, intenta con ellas.

3 imagenes

¿Que pantalla y placa arduino estás usando?

enter_67:
que quería hacer y que gracias a ti no saldrá,y por supuesto viendo este percaz menos aún por que yo soy un bicho raro

Se dice "percal" y no "percaz"

A parte de impaciente......

cefere0:
Se dice "percal" y no "percaz"

A parte de impaciente......

Sobras tanto tú como otros muchos,este "foro" es de ayuda se supone yo la pido si me la dan bien,si no me fastido sea impaciente o no es mi problema,el tuyo por lo que veo es andar metiendo mierda guapo,anda vete a fregar que aqui sobras.

Que poco humor

Comportarse mismos.

TFTLCDCyg:
Sube las imagenes que pretendes usar.

Te dejo las imágenes que utilicé para verificar el codigo que colocaste en el primer post, intenta con ellas.

3 imagenes

¿Que pantalla y placa arduino estás usando?

Hola estoy usando el arduino uno y la placa es una 2,4 tft lcdshield para insertar la micro sd,e bajado tus fotos y me pasa lo mismo se quedan como veladas, 8blanco y negro) las mias las e pasado a bmp 24 bits tambien.

prueba a cambiar esta linea:

lcdbuffer[lcdidx++] = tft.color565(r,g,b);

por esta otra:

lcdbuffer[lcdidx++] = tft.color565(255-r,255-g,255-b);

Gracias!!! ahora si veo las fotos en color y los ejemplos de pintar con sus correspondientes colores y no invertidos/cambiados.