ILI9340液晶の表示の高速化

前回の続きです。

前回の最後のほうで

現在は1ピクセルずつdrawPixelで書いている部分をsetAddrWindowとpushColorで書き直せば、もう少し高速化できると思います。

と書きましたが、大した手間でもないのでやってみました。

描画のループ部分で使う描画命令をdrawPixelからpushColorへ変更した結果、2倍ほど高速になりました。
あまり綺麗ではありませんが、動画を載せておきます。


修正したスケッチは以下に貼っておきます。

#include <arduino.h>
#include <SPI.h>
#include <FS.h>
#include <JPEGDecoder.h>
#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ILI9341.h> // Hardware-specific library

#define TFT_CS     15
#define TFT_RST    5
#define TFT_DC     4

Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);

void setup() {
 pinMode(TFT_RST, OUTPUT);
 digitalWrite(TFT_RST, LOW);
 digitalWrite(TFT_RST, HIGH);

 Serial.begin(115200);
 Serial.println("");
 delay(10);

 tft.begin();
 // read diagnostics (optional but can help debug problems)
 uint8_t x = tft.readcommand8(ILI9341_RDMODE);
 Serial.print("Display Power Mode: 0x"); Serial.println(x, HEX);
 x = tft.readcommand8(ILI9341_RDMADCTL);
 Serial.print("MADCTL Mode: 0x"); Serial.println(x, HEX);
 x = tft.readcommand8(ILI9341_RDPIXFMT);
 Serial.print("Pixel Format: 0x"); Serial.println(x, HEX);
 x = tft.readcommand8(ILI9341_RDIMGFMT);
 Serial.print("Image Format: 0x"); Serial.println(x, HEX);
 x = tft.readcommand8(ILI9341_RDSELFDIAG);
 Serial.print("Self Diagnostic: 0x"); Serial.println(x, HEX);

 tft.fillScreen(ILI9341_BLACK);

 SPIFFS.begin();
 jpegDraw("/test1.jpg");
}

void jpegDraw(char* filename) {
 char str[100];
 uint8 *pImg;
 int x,y,bx,by;
 
 // Decoding start
 JpegDec.decode(filename,0);

 // Image Information
 Serial.print("Width     :");
 Serial.println(JpegDec.width);
 Serial.print("Height    :");
 Serial.println(JpegDec.height);
 Serial.print("Components:");
 Serial.println(JpegDec.comps);
 Serial.print("MCU / row :");
 Serial.println(JpegDec.MCUSPerRow);
 Serial.print("MCU / col :");
 Serial.println(JpegDec.MCUSPerCol);
 Serial.print("Scan type :");
 Serial.println(JpegDec.scanType);
 Serial.print("MCU width :");
 Serial.println(JpegDec.MCUWidth);
 Serial.print("MCU height:");
 Serial.println(JpegDec.MCUHeight);
 Serial.println("");
 
 sprintf(str,"#SIZE,%d,%d",JpegDec.width,JpegDec.height);
 Serial.println(str);

 // Raw Image Data
 while(JpegDec.read()){
   pImg = JpegDec.pImage ;
   x = JpegDec.MCUx * JpegDec.MCUWidth;
   y = JpegDec.MCUy * JpegDec.MCUHeight;
   tft.setAddrWindow(x, y, x+JpegDec.MCUWidth-1, y+JpegDec.MCUHeight-1);
   for(by=0; by<JpegDec.MCUHeight; by++){
     for(bx=0; bx<JpegDec.MCUWidth; bx++){
       if(JpegDec.comps == 1){ // Grayscale          
         tft.pushColor(tft.color565(pImg[0], pImg[0], pImg[0]));
       }else{ // RGB
         tft.pushColor(tft.color565(pImg[0], pImg[1], pImg[2]));
       }        
       pImg += JpegDec.comps ;
     }
   }
 }
}
   
void loop() {
}

コメント

  1. 今更 より:

    最近になって、この液晶を購入しとても参考になりました。
    しかしながら、このままでは動作しませんでした。
    ライブラリが変更となったのかも?下記の様に変更しました。
    tft.startWrite();
    tft.setAddrWindow(x, y, JpegDec.MCUWidth, JpegDec.MCUHeight);