I’m struggling to get my 4.26" E-Paper Display (GDEQ0426T82-FT01C) working with an ESPduino-32 using the FTS-02 adapter board. I've tried multiple libraries (ZinggJM/GxEPD2 and manufacturer demo code remapping), but the display remains completely unresponsive.
Product Link: https://buy-lcd.com/products/gdey0426t82-ft01c
Download Package by Manufacturer (with Demo Code) : https://sendgb.com/toxQ9rshjLb
Hardware Setup:
I've mapped my connections based on the FTS-02 documentation and my ESPduino-32 pinout:
Code: Select all
Component | Function | ESPduino32 GPIO | Adapter Pin
Power | 3.3V | 3.3V | 3.3V
Power | GND | GND | GND
e-Paper | Chip Select | IO27 | FTS-02 SS
e-Paper | Data/Command | IO14 | FTS-02 TX
e-Paper | Reset | IO16 | FTS-02 T7
e-Paper | Busy | IO13 | FTS-02 RX
e-Paper | MOSI | IO23 | FTS-02 MOSI
e-Paper | SCK | IO18 | FTS-02 SCK
Touch | SDA | IO21 | FTS-02 A4
Touch | SCL | IO22 | FTS-02 A5
Touch | Reset | IO39 | FTS-02 A3
Touch | Interrupt | IO36 | FTS-02 T0


The Issue:
Nothing works. The display is completely blank with no refreshing or flashing. Additionally, the I2C touch controller is failing with an error.
Code: Select all
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0030,len:1184
load:0x40078000,len:13260
load:0x40080400,len:3028
entry 0x400805e4
--- Starting Clean PlatformIO Firmware ---
Hardware I2C Touch Controller Initialized.
Hardware SPI Display Engine Initialized.
_Update_Full : 5001
_Update_Full : 1
Display Refresh Routine Concluded.
Touch Interrupt Spotted! -> [ 1838][E][Wire.cpp:499] requestFrom(): i2cWriteReadNonStop returned Error -1
I2C Bus Empty (Timeout).
Touch Interrupt Spotted! -> [ 1952][E][Wire.cpp:499] requestFrom(): i2cWriteReadNonStop returned Error -1
I2C Bus Empty (Timeout).
Touch Interrupt Spotted! -> [ 2062][E][Wire.cpp:499] requestFrom(): i2cWriteReadNonStop returned Error -1
I2C Bus Empty (Timeout).
Touch Interrupt Spotted! -> [ 2172][E][Wire.cpp:499] requestFrom(): i2cWriteReadNonStop returned Error -1
I2C Bus Empty (Timeout).Code: Select all
#include <Arduino.h>
#include <GxEPD2_BW.h>
#include <Adafruit_GFX.h>
#include <Wire.h>
// ==================== SCREEN PIN ASSIGNMENTS ====================
#define EPD_CS 27 // FTS-02 SS -> Board Pin 27 (D2)
#define EPD_DC 14 // FTS-02 TX -> Board Pin 14 (D3)
#define EPD_RST 16 // FTS-02 T7 -> Board Pin 16 (D8) - SAFE RESET
#define EPD_BUSY 13 // FTS-02 RX -> Board Pin 13 (D7)
// Native ESP32 Hardware VSPI Pins
#define EPD_MOSI 23 // FTS-02 MOSI-> Board Pin 23 (D11)
#define EPD_CLK 18 // FTS-02 SCK -> Board Pin 18 (D13)
// ==================== TOUCH PIN ASSIGNMENTS ====================
#define TOUCH_SDA 21 // FTS-02 A4 -> Dedicated SDA Slot (GPIO 21)
#define TOUCH_SCL 22 // FTS-02 A5 -> Dedicated SCL Slot (GPIO 22)
#define TOUCH_RST 26 // FTS-02 RST -> Board Pin 26
#define TOUCH_INT 36 // FTS-02 T0 -> Board Pin A0 (GPIO 36)
// Correct GxEPD2 Template Init for 4.26" GDEQ0426T82 (SSD1677 Controller)
GxEPD2_BW<GxEPD2_426_GDEQ0426T82, GxEPD2_426_GDEQ0426T82::HEIGHT> display(
GxEPD2_426_GDEQ0426T82(EPD_CS, EPD_DC, EPD_RST, EPD_BUSY)
);
// Forward Declarations
void runDisplayGraphics();
void handleTouchInterrupt();
void setup() {
Serial.begin(115200);
delay(500);
Serial.println("\n--- Starting Clean PlatformIO Firmware ---");
// 1. Kick off Native Hardware I2C (Bypasses the buggy bit-banging code)
Wire.begin(TOUCH_SDA, TOUCH_SCL, 100000); // Standard-mode 100kHz
pinMode(TOUCH_INT, INPUT_PULLUP);
pinMode(TOUCH_RST, OUTPUT);
// Execute Hardware Pulse to wake up the FT6336 Touch IC
digitalWrite(TOUCH_RST, LOW); delay(20);
digitalWrite(TOUCH_RST, HIGH); delay(200);
Serial.println("Hardware I2C Touch Controller Initialized.");
// 2. Initialize Hardware SPI Display Engine via GxEPD2
SPI.begin(EPD_CLK, -1, EPD_MOSI, EPD_CS);
display.init(115200, true, 50, false);
display.setRotation(1); // Set to Landscape Orientation
Serial.println("Hardware SPI Display Engine Initialized.");
// Run first render update
runDisplayGraphics();
}
void loop() {
// Check if the Touch Panel is signaling an interrupt (Active LOW)
if (digitalRead(TOUCH_INT) == LOW) {
handleTouchInterrupt();
delay(100); // short debounce delay
}
}
// Memory-Efficient Paged-Drawing Loop (Protects ESP32 SRAM)
void runDisplayGraphics() {
display.setFullWindow();
display.firstPage();
do {
display.fillScreen(GxEPD_WHITE);
display.setTextColor(GxEPD_BLACK);
display.setTextSize(3);
display.setCursor(40, 50);
display.print("PlatformIO Live!");
display.setTextSize(2);
display.setCursor(40, 110);
display.print("GxEPD2 Running Flawlessly");
display.setCursor(40, 150);
display.print("Pins: CS=27 DC=14 RST=16 BUSY=13");
} while (display.nextPage());
Serial.println("Display Refresh Routine Concluded.");
}
// Clean I2C transaction handling using standard Wire functions
void handleTouchInterrupt() {
Serial.print("Touch Interrupt Spotted! -> ");
// Request 1 byte from the FT6336 tracking address (0x38)
Wire.beginTransmission(0x38);
Wire.write(0x02); // Point to TD_STATUS register (Number of touch points)
Wire.endTransmission(false);
Wire.requestFrom(0x38, 1);
if (Wire.available()) {
uint8_t touchPoints = Wire.read();
Serial.printf("Active Touch Points Detected: %d\n", touchPoints);
} else {
Serial.println("I2C Bus Empty (Timeout).");
}
}