// This example if for processors with LittleFS capability (e.g. RP2040, // ESP32, ESP8266). It renders a png file that is stored in LittleFS // using the PNGdec library (available via library manager). // The test image is in the sketch "data" folder (press Ctrl+K to see it). // You must upload the image to LittleFS using the Arduino IDE Tools Data // Upload menu option (you may need to install extra tools for that). // Don't forget to use the Arduino IDE Tools menu to allocate a LittleFS // memory partition before uploading the sketch and data! #include #define FileSys LittleFS // Include the PNG decoder library #include PNG png; #define MAX_IMAGE_WIDTH 240 // Adjust for your images int16_t xpos = 0; int16_t ypos = 0; // Include the TFT library https://github.com/Bodmer/TFT_eSPI #include "SPI.h" #include // Hardware-specific library TFT_eSPI tft = TFT_eSPI(); // Invoke custom library //==================================================================================== // Setup //==================================================================================== void setup() { Serial.begin(115200); Serial.println("\n\n Using the PNGdec library"); // Initialise FS if (!FileSys.begin()) { Serial.println("LittleFS initialisation failed!"); while (1) yield(); // Stay here twiddling thumbs waiting } // Initialise the TFT tft.begin(); tft.fillScreen(TFT_BLACK); Serial.println("\r\nInitialisation done."); } //==================================================================================== // Loop //==================================================================================== void loop() { // Scan LittleFS and load any *.png files File root = LittleFS.open("/", "r"); while (File file = root.openNextFile()) { String strname = file.name(); strname = "/" + strname; Serial.println(file.name()); // If it is not a directory and filename ends in .png then load it if (!file.isDirectory() && strname.endsWith(".png")) { // Pass support callback function names to library int16_t rc = png.open(strname.c_str(), pngOpen, pngClose, pngRead, pngSeek, pngDraw); if (rc == PNG_SUCCESS) { tft.startWrite(); Serial.printf("image specs: (%d x %d), %d bpp, pixel type: %d\n", png.getWidth(), png.getHeight(), png.getBpp(), png.getPixelType()); uint32_t dt = millis(); if (png.getWidth() > MAX_IMAGE_WIDTH) { Serial.println("Image too wide for allocated line buffer size!"); } else { rc = png.decode(NULL, 0); png.close(); } tft.endWrite(); // How long did rendering take... Serial.print(millis()-dt); Serial.println("ms"); } } delay(3000); tft.fillScreen(random(0x10000)); } } //=========================================v========================================== // pngDraw //==================================================================================== // This next function will be called during decoding of the png file to // render each image line to the TFT. If you use a different TFT library // you will need to adapt this function to suit. // Callback function to draw pixels to the display 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); }