Connecting GooDisplay E-Paper to ESPduino-32 (using FTS-02 Adapter board)

dankknight
Posts: 1
Joined: Fri Jul 10, 2026 11:52 am

Connecting GooDisplay E-Paper to ESPduino-32 (using FTS-02 Adapter board)

Postby dankknight » Fri Jul 10, 2026 11:59 am

Hi everyone,

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
Image

Image

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).
My Code:

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).");
    }
}

Who is online

Users browsing this forum: Bing [Bot], Qwantbot and 2 guests