ESP32 a ILI9143 TFT displej - zobrazení obrázku PNG

25.06.2023 Arduino #tft #display #esp32

Rychlý příklad pro zobrazení obrázku PNG na TFT displeji, převedením obrázku na pole.


Příklad vychází z předchozího článku, který se věnoval zapojení TFT displeje a základnímu zprovoznění.

V první řadě se obrázek musí převést na pole ve formátu jazyka C. K tomu lze využít nástroj: IMG2HEX

Dále vytvořte soubor, který bude obsahovat vygenerovaný HEX kód. Tento soubor může mít například název image.h. Vygenerovaný kód se umístí do složených závorek (místo ...).

#ifndef PROGMEM
#define PROGMEM
#endif

#define imageWidth  320  // image width
#define imageHeight 240  // image height

static const unsigned char image[] PROGMEM  = {
...
}

Samotný zdrojový kód, který bude zobrazovat obrázek na displeji vypadá následovně:

#include <PNGdec.h>
#include "image.h" // Image is stored here in an 8 bit array

PNG png; 

#define MAX_IMAGE_WIDTH 320 

int16_t xpos = 0;
int16_t ypos = 0;

#include "SPI.h"
#include <TFT_eSPI.h>              // Hardware-specific library
TFT_eSPI tft = TFT_eSPI();         // Invoke custom library

void pngDraw(PNGDRAW *pDraw) {
  uint16_t lineBuffer[MAX_IMAGE_WIDTH];
  png.getLineAsRGB565(pDraw, lineBuffer, PNG_RGB565_BIG_ENDIAN, 0xffffffff);
  tft.pushImage(xpos, ypos + pDraw->y, pDraw->iWidth, 1, lineBuffer);
}

void setup(){
  Serial.begin(115200);
  Serial.println("\n\n Using the PNGdec library");

  tft.begin();
  tft.fillScreen(TFT_BLACK);
}

void loop(){
  int16_t rc = png.openFLASH((uint8_t *)image, sizeof(image), pngDraw);
  if (rc == PNG_SUCCESS) {
    tft.startWrite();
    uint32_t dt = millis();
    rc = png.decode(NULL, 0);
    Serial.print(millis() - dt); Serial.println("ms");
    tft.endWrite();
    // png.close(); // not needed for memory->memory decode
  }
  delay(3000);
  tft.fillScreen(random(0x10000));
}

Literatura:
PNG Images. Bodmer - TFT_eSPI [online]. BODMER, 2023 [cit. 2023-06-25]. Dostupné z: https://github.com/Bodmer/TFT_eSPI/blob/master/examples/PNG%20Images/Flash_PNG/Flash_PNG.ino