اطلاعیه

Collapse
No announcement yet.

نمایش چند عکس در نمایشگر lcd tft2.4

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    نمایش چند عکس در نمایشگر lcd tft2.4

    سلام دوستان
    من با استفاده از این کد و با استفاده از ماژول sd card اومدم تعدادی عکس رو نمایشگر lcd tft2.4 نمایش دادم



    کد:
    // BMP-loading example specifically for the TFTLCD breakout board.
    // If using the Arduino shield, use the tftbmp_shield.pde sketch instead!
    // If using an Arduino Mega, make sure the SD library is configured for
    // 'soft' SPI in the file Sd2Card.h.
    
    
    ///////  ***** Not Tested yet on SPFD5408 - next version I do it
    #include <Adafruit_GFX.h>
    #include <MCUFRIEND_kbv.h>
    #include <Fonts/FreeMonoBoldOblique12pt7b.h>
    MCUFRIEND_kbv tft(A3, A2, A1, A0, A4);
    uint16_t identifier;
    
    
    #include <SD.h>
    #include <SPI.h>
    #define SD_CS 53     // Set the chip select line to whatever you use (10 doesnt conflict with the library)
    
    
    void setup()
    {
     Serial.begin(9600);
     tft.reset();
     identifier = tft.readID();
      tft.setRotation(3);
    // pinMode(10, OUTPUT);
    // digitalWrite(10, HIGH);
      
    
    
      tft.begin(identifier);
    
    
      progmemPrint(PSTR("Initializing SD card..."));
      if (!SD.begin(SD_CS)) {
        progmemPrintln(PSTR("failed!"));
        return;
      }
      progmemPrintln(PSTR("OK!"));
    
    
      
    }
    
    
    void loop()
    {
    bmpDraw("1.bmp", 0, 10);
    //  delay(2000);
       bmpDraw("2.bmp", 0, 0);
    //  delay(2000);
    //    bmpDraw("3.bmp", 0, 0);
    //  delay(2000);
    //   bmpDraw("4.bmp", 0, 0);
    //  delay(2000);
    //   bmpDraw("5.bmp", 0, 0);
    //  delay(2000);
    //    bmpDraw("6.bmp", 0, 0);
    //  delay(2000);
    //  bmpDraw("7.bmp", 0, 0);
    //  delay(2000);
    //   bmpDraw("8.bmp", 0, 0);
    //  delay(2000);
    //    bmpDraw("9.bmp", 0, 0);
    //  delay(2000);
    //  bmpDraw("10.bmp", 0, 0);
    //  delay(2000);
    //   bmpDraw("11.bmp", 0, 0);
    //  delay(2000);
    //    bmpDraw("12.bmp", 0, 0);
    //  delay(2000);
    //  bmpDraw("13.bmp", 0, 0);
    //  delay(2000);
    //   bmpDraw("14.bmp", 0, 0);
    //  delay(2000);
    //    bmpDraw("15.bmp", 0, 0);
    //  delay(2000);
    //  bmpDraw("16.bmp", 0, 0);
    //  delay(2000);
    //   bmpDraw("17.bmp", 0, 0);
    //  delay(2000);
    //    bmpDraw("18.bmp", 0, 0);
    //  delay(2000);
    //  bmpDraw("19.bmp", 0, 0);
    //  delay(2000);
    //   bmpDraw("20.bmp", 0, 0);
    //  delay(2000);
    //    bmpDraw("21.bmp", 0, 0);
    //  delay(2000);
    }
    
    
    // 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, 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();
      progmemPrint(PSTR("Loading image '"));
      Serial.print(filename);
      Serial.println('\'');
      // Open requested file on SD card
      if ((bmpFile = SD.open(filename)) == NULL) {
        progmemPrintln(PSTR("File not found"));
        return;
      }
    
    
      // Parse BMP header
      if(read16(bmpFile) == 0x4D42) { // BMP signature
        progmemPrint(PSTR("File size: ")); Serial.println(read32(bmpFile));
        (void)read32(bmpFile); // Read & ignore creator bytes
        bmpImageoffset = read32(bmpFile); // Start of image data
        progmemPrint(PSTR("Image Offset: ")); Serial.println(bmpImageoffset, DEC);
        // Read DIB header
        progmemPrint(PSTR("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
          progmemPrint(PSTR("Bit Depth: ")); Serial.println(bmpDepth);
          if((bmpDepth == 24) && (read32(bmpFile) == 0)) { // 0 = uncompressed
    
    
            goodBmp = true; // Supported BMP format -- proceed!
            progmemPrint(PSTR("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);
            } 
            progmemPrint(PSTR("Loaded in "));
            Serial.print(millis() - startTime);
            Serial.println(" ms");
          } // end goodBmp
        }
      }
    
    
      bmpFile.close();
      if(!goodBmp) progmemPrintln(PSTR("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;
    }
    
    
    // Copy string from flash to serial port
    // Source string MUST be inside a PSTR() declaration!
    void progmemPrint(const char *str) {
      char c;
      while(c = pgm_read_byte(str++)) Serial.print(c);
    }
    
    
    // Same as above, with trailing newline
    void progmemPrintln(const char *str) {
      progmemPrint(str);
      Serial.println();
    }
    حالا مشکل من اینکه میخوام چند تا عکس رو به صورت همزمان نمایش بدم با ابعاد مختلف
    این کد میاد عکس های به صورت پشت سره هم نمایش میده
    ممنون میشم دوستان راهنمایی کنند
    جدیدترین ویرایش توسط systam; ۱۳:۰۵ ۱۳۹۷/۰۹/۳۰.

    #2
    پاسخ : نمایش چند عکس در نمایشگر lcd tft2.4

    مشکل حل شد
    ممنونم از این همه راهنمایی

    دیدگاه

    لطفا صبر کنید...
    X