前回の続きです。
前回の最後のほうで
現在は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() { }
コメント
最近になって、この液晶を購入しとても参考になりました。
しかしながら、このままでは動作しませんでした。
ライブラリが変更となったのかも?下記の様に変更しました。
tft.startWrite();
tft.setAddrWindow(x, y, JpegDec.MCUWidth, JpegDec.MCUHeight);