Example Code for Arduino-Dynamic Image Display

Last revision 2025/12/22

This article offers a detailed guide on using the FireBeetle ESP32-E microcontroller and a 1.47" IPS LCD Display Module to create dynamic image displays with Arduino, including hardware setup, software preparation, wiring instructions, and example code for implementing dynamic visual effects.

Hardware Preparation

Software Preparation

Wiring Diagram

The following provides two ways to connect 1.47" display to the FireBeetle ESP32-E:

  1. Directly connect to GDI via FPC.
  2. Connect to SPI function pin.

Connection 1:

DFR0995-FPC connection

Wire Sequence for GDI connection:

FPC PINS FireBeetle ESP32 PINS Description
VCC 3V3 3.3V
BLK 12/D13 Backlit
GND GND GND
SCLK 18/SCK SPI Clock
MOSI 23/MOSI Master output, slave input
MISO 19/MISO Master input, slave output
DC 25/D2 Data/Command
RES 26/D3 Reset
CS 14/D6 TFT Chip-select
SDCS 13/D7 SD chip-select
FCS 0/D5 Font library
TCS 4/D12 Touch
SCL 22/SCL I2C clock
SDA 21/SDA I2C data
INT 16/D11 INT
BUSY-TE 17/D10 Anti-tear pin
X1 NC User-defined pin 1
X2 NC User-defined pin 2

Connection 2:

DFR0995-SPI connection

Wire sequence for SPI connection:

LCD Display ESP32-E
VCC 3V3
GND GND
SCLK 18/SCK
MOSI 23/MOSI
CS 14/D6
RES 26/D3
DC 25/D2
BLK 13/D7

Sample Code

Code function: Screen graphics test including radial lines, fast lines, and rectangle animation.

#include "DFRobot_GDL.h"

#define TFT_DC  D2
#define TFT_CS  D6
#define TFT_RST D3
#define TFT_BL  D4


DFRobot_ST7789_172x320_HW_SPI screen(/*dc=*/TFT_DC,/*cs=*/TFT_CS,/*rst=*/TFT_RST,/*bl=*/TFT_BL);
/* M0 mainboard DMA transfer */
//DFRobot_ST7789_172x320_DMA_SPI screen(/*dc=*/TFT_DC,/*cs=*/TFT_CS,/*rst=*/TFT_RST,/*bl=*/TFT_BL);

void setup() {
  screen.begin();
}

void loop(){
    testLine();
    testFastLines(COLOR_RGB565_PURPLE,COLOR_RGB565_YELLOW);       
    testRects(COLOR_RGB565_BLACK,COLOR_RGB565_WHITE);
}

void testLine(){
  uint16_t color = 0x00FF;
  screen.fillScreen(COLOR_RGB565_BLACK);
  for (int16_t x=0; x < screen.width(); x+=6) {
    screen.drawLine(/*x0=*/screen.width()/*Screen width*//2, /*y0=*/screen.height()/*Screen height*//2, /*x1=*/x, /*y1=*/0, /*c=*/color+=0x0700);
  }
  for (int16_t y=0; y < screen.height(); y+=6) {
    screen.drawLine(screen.width()/2, screen.height()/2, screen.width(), y, color+=0x0700);
  }
  for (int16_t x = screen.width(); x >= 0; x-=6) {
    screen.drawLine(screen.width()/2, screen.height()/2, x,screen.height(), color+=0x0700);
  } 
  for (int16_t y = screen.height(); y >= 0; y-=6) {
    screen.drawLine(screen.width()/2, screen.height()/2, 0, y, color+=0x0700);
  }
}
void testFastLines(uint16_t color1, uint16_t color2) {
  for (int16_t y=0; y < screen.height(); y+=4) {

    screen.drawFastHLine(/*x=*/0, /*y=*/y, /*w=*/screen.width(),/*c=*/color2);
    delay(10);
  }

  for(int16_t x=0; x < screen.width(); x+=3) {

    screen.drawFastVLine(/*x=*/x, /*y=*/0, /*h=*/screen.height(), /*c=*/color1);
    delay(10);
  }
}


void testRects(uint16_t color1, uint16_t color2) { 
    screen.fillScreen(COLOR_RGB565_BLACK);
    int16_t x=screen.width()-12;
    for (; x > 100; x-=screen.width()/40) {

      screen.drawRect(/*x=*/screen.width()/2 -x/2, /*y=*/screen.height()/2 -x/2 , /*w=*/x, /*h=*/x, /*color=*/color2+=0x0F00);
      delay(100);
    }

    screen.fillRect(/*x=*/screen.width()/2 -x/2, /*y=*/screen.height()/2 -x/2 , /*w=*/x, /*h=*/x, /*color=*/color2);
    delay(100);
    for(; x > 6; x-=screen.width()/40){
      screen.drawRect(screen.width()/2 -x/2, screen.height()/2 -x/2 , x, x, color1);
      delay(100);
    }
}

Result

Burn the codes into the ESP32-E, then the screen shows the specified dynamic effects.

DFR0995-Dynamic effects

Was this article helpful?

TOP