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
- FireBeetle ESP32-E IoT Microcontroller(SKU: DFR0654) (or similar) × 1
- 1.47" 172×320 IPS LCD Display Module(SKU: DFR0995) × 1
- FPC Cable (included with DFR0995) × 1
- Type-C Cable x1
- M-M/F-M/F-F Jumper wires
Software Preparation
- Download Arduino IDE: Click to download Arduino IDE
- Install SDK: click to enter FireBeetle ESP32-E IoT Microcontroller Wiki for SDK installation tutorial
- Download the DFRobot GDL Library: DFRobot GDL Library.
- For Arduino IDE V1.8.19 (or earlier), install the library manually: How to Add a Library?
- For Arduino IDE V2.0.0 (or later), directly search for the "DFRobot GDL Library" in the Library Manager and install it.
Wiring Diagram
The following provides two ways to connect 1.47" display to the FireBeetle ESP32-E:
- Directly connect to GDI via FPC.
- Connect to SPI function pin.
Connection 1:

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:

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.

Was this article helpful?
