LovyanGFX Settings for 5" Display

I've recently bought a few Elecrow ESP32 Displays. I've been getting them to work with various Arduino graphics libraries and have found several working configurations.

This configuration works for me with the 5" display using the latest LovyanGFX library:

class LGFX : public lgfx::LGFX_Device
{
public:
    lgfx::Bus_RGB _bus_instance;
    lgfx::Panel_RGB _panel_instance;
    lgfx::Light_PWM _light_instance;
    lgfx::Touch_GT911 _touch_instance;
    LGFX(void)
    {
        {
            auto cfg = _panel_instance.config();
            cfg.memory_width = 800;
            cfg.memory_height = 480;
            cfg.panel_width = 800;
            cfg.panel_height = 480;
            cfg.offset_x = 0;
            cfg.offset_y = 0;
            _panel_instance.config(cfg);
        }


        {
            auto cfg = _bus_instance.config();
            cfg.panel = &_panel_instance;


            cfg.pin_d0 = GPIO_NUM_8;  // B0
            cfg.pin_d1 = GPIO_NUM_3;  // B1
            cfg.pin_d2 = GPIO_NUM_46; // B2
            cfg.pin_d3 = GPIO_NUM_9;  // B3
            cfg.pin_d4 = GPIO_NUM_1;  // B4


            cfg.pin_d5 = GPIO_NUM_5;  // G0
            cfg.pin_d6 = GPIO_NUM_6;  // G1
            cfg.pin_d7 = GPIO_NUM_7;  // G2
            cfg.pin_d8 = GPIO_NUM_15; // G3
            cfg.pin_d9 = GPIO_NUM_16; // G4
            cfg.pin_d10 = GPIO_NUM_4; // G5


            cfg.pin_d11 = GPIO_NUM_45; // R0
            cfg.pin_d12 = GPIO_NUM_48; // R1
            cfg.pin_d13 = GPIO_NUM_47; // R2
            cfg.pin_d14 = GPIO_NUM_21; // R3
            cfg.pin_d15 = GPIO_NUM_14; // R4


            cfg.pin_henable = GPIO_NUM_40;
            cfg.pin_vsync = GPIO_NUM_41;
            cfg.pin_hsync = GPIO_NUM_39;
            cfg.pin_pclk = GPIO_NUM_0;
            cfg.freq_write = 12000000;


            cfg.hsync_polarity = 0;
            cfg.hsync_front_porch = 8;
            cfg.hsync_pulse_width = 4;
            cfg.hsync_back_porch = 43;


            cfg.vsync_polarity = 0;
            cfg.vsync_front_porch = 8;
            cfg.vsync_pulse_width = 4;
            cfg.vsync_back_porch = 12;


            cfg.pclk_active_neg = 1;
            cfg.de_idle_high = 0;
            cfg.pclk_idle_high = 0;


            _bus_instance.config(cfg);
        }
        _panel_instance.setBus(&_bus_instance);


        {
            auto cfg = _light_instance.config();
            cfg.pin_bl = GPIO_NUM_2;
            _light_instance.config(cfg);
        }
        _panel_instance.light(&_light_instance);


        {
            auto cfg = _touch_instance.config();
            cfg.x_min      = 0;
            cfg.x_max      = 799;
            cfg.y_min      = 0;
            cfg.y_max      = 479;
            cfg.pin_int    = -1;
            cfg.pin_rst    = -1;
            cfg.bus_shared = false;
            cfg.offset_rotation = 0;
            cfg.i2c_port   = I2C_NUM_1;
            cfg.pin_sda    = GPIO_NUM_19;
            cfg.pin_scl    = GPIO_NUM_20;
            cfg.freq       = 400000;
            cfg.i2c_addr   = 0x14;
            _touch_instance.config(cfg);
            _panel_instance.setTouch(&_touch_instance);
        }
        setPanel(&_panel_instance);
    }
};

Comments

  • A bit of a noob question but where do I put these settings ? I have tried all the LovyanGFX library examples and although they load the screen is blank.

  • You can put it in a header file and include it, or you can include it at the top of your sketch (.ino) file.

    Here's a complete sketch for the 5" screen - it will show full screen white, red, green, blue, then the text 'touch the screen'. You'll see a white dot everywhere you touch the screen.

    #define LGFX_USE_V1
    #include <LovyanGFX.hpp>
    #include <lgfx/v1/platforms/esp32s3/Panel_RGB.hpp>
    #include <lgfx/v1/platforms/esp32s3/Bus_RGB.hpp>
    #include <driver/i2c.h>
    
    class LGFX : public lgfx::LGFX_Device
    {
    public:
        lgfx::Bus_RGB _bus_instance;
        lgfx::Panel_RGB _panel_instance;
        lgfx::Light_PWM _light_instance;
        lgfx::Touch_GT911 _touch_instance;
        LGFX(void)
        {
            {
                auto cfg = _panel_instance.config();
                cfg.memory_width = 800;
                cfg.memory_height = 480;
                cfg.panel_width = 800;
                cfg.panel_height = 480;
                cfg.offset_x = 0;
                cfg.offset_y = 0;
                _panel_instance.config(cfg);
            }
    
            {
                auto cfg = _bus_instance.config();
                cfg.panel = &_panel_instance;
    
                cfg.pin_d0 = GPIO_NUM_8;  // B0
                cfg.pin_d1 = GPIO_NUM_3;  // B1
                cfg.pin_d2 = GPIO_NUM_46; // B2
                cfg.pin_d3 = GPIO_NUM_9;  // B3
                cfg.pin_d4 = GPIO_NUM_1;  // B4
    
                cfg.pin_d5 = GPIO_NUM_5;  // G0
                cfg.pin_d6 = GPIO_NUM_6;  // G1
                cfg.pin_d7 = GPIO_NUM_7;  // G2
                cfg.pin_d8 = GPIO_NUM_15; // G3
                cfg.pin_d9 = GPIO_NUM_16; // G4
                cfg.pin_d10 = GPIO_NUM_4; // G5
    
                cfg.pin_d11 = GPIO_NUM_45; // R0
                cfg.pin_d12 = GPIO_NUM_48; // R1
                cfg.pin_d13 = GPIO_NUM_47; // R2
                cfg.pin_d14 = GPIO_NUM_21; // R3
                cfg.pin_d15 = GPIO_NUM_14; // R4
    
                cfg.pin_henable = GPIO_NUM_40;
                cfg.pin_vsync = GPIO_NUM_41;
                cfg.pin_hsync = GPIO_NUM_39;
                cfg.pin_pclk = GPIO_NUM_0;
                cfg.freq_write = 12000000;
    
                cfg.hsync_polarity = 0;
                cfg.hsync_front_porch = 8;
                cfg.hsync_pulse_width = 4;
                cfg.hsync_back_porch = 43;
    
                cfg.vsync_polarity = 0;
                cfg.vsync_front_porch = 8;
                cfg.vsync_pulse_width = 4;
                cfg.vsync_back_porch = 12;
    
                cfg.pclk_active_neg = 1;
                cfg.de_idle_high = 0;
                cfg.pclk_idle_high = 0;
    
                _bus_instance.config(cfg);
            }
    
            _panel_instance.setBus(&_bus_instance);
            {
                auto cfg = _light_instance.config();
                cfg.pin_bl = GPIO_NUM_2;
                _light_instance.config(cfg);
            }
    
            _panel_instance.light(&_light_instance);
            {
                auto cfg = _touch_instance.config();
                cfg.x_min      = 0;
                cfg.x_max      = 799;
                cfg.y_min      = 0;
                cfg.y_max      = 479;
                cfg.pin_int    = -1;
                cfg.pin_rst    = -1;
                cfg.bus_shared = false;
                cfg.offset_rotation = 0;
                cfg.i2c_port   = I2C_NUM_1;
                cfg.pin_sda    = GPIO_NUM_19;
                cfg.pin_scl    = GPIO_NUM_20;
                cfg.freq       = 400000;
                cfg.i2c_addr   = 0x14;
                _touch_instance.config(cfg);
                _panel_instance.setTouch(&_touch_instance);
            }
            setPanel(&_panel_instance);
        }
    };
    
    LGFX lcd;
    
    void setup() {
      Serial.begin(115200); 
      Serial.println();
    
      Serial.println("LCD Init.");
      lcd.init();
      lcd.fillScreen(TFT_WHITE);
      delay(500);
      lcd.fillScreen(TFT_RED);
      delay(500);
      lcd.fillScreen(TFT_GREEN);
      delay(500);
      lcd.fillScreen(TFT_BLUE);
      delay(500);
      lcd.fillScreen(TFT_BLACK);
      lcd.setTextSize((std::max(lcd.width(), lcd.height()) + 255) >> 8);
      lcd.setTextDatum(textdatum_t::middle_center);
      lcd.drawString("touch the screen", lcd.width() >> 1, lcd.height() >> 1);
    }
    
    void loop() {
      int32_t x, y;
      if (lcd.getTouch(&x, &y)) {
        Serial.printf("X:%d Y:%d\n",x, y);
        lcd.fillCircle(x, y, 15, TFT_WHITE);
      }
      delay(100);
    }
    
  • Nice example...works great, thank you for taking the time to show the config.😊

  • I have the Elecrow esp32-s3 5 inch display. I have tried example above compiles and loads to the ESP but all I get is a black screen

    I could use some help please I'am new

  • Are you manually resetting the display after the upload finishes? The upload tool will tell you that it is resetting the device, but it can't actually do that so you have to press the reset button manually.

  • Yes, I unplugged and replugged in the display after flashing but still just a black screen

  • edited September 2023

    Same here, I cant get it working with those.

    Are there any updates to the code that I may have missed?


    ESP-32 2.0.3

    LovyanGFX 1.1.9

Sign In or Register to comment.