ESP32 Plus ESP32s3 LovyanGFX

Купил себе такую игрушку как CS01 Plus. Чип видео ST7796U, тачпад FT6336U, Flash 16 Mb, PSRAM 2M. Никак не могу разобраться как вывести картинку на эран. Нашел на гитхабе скетч с настройками для своего девайса, при помощи которого можно рисовать всякие линии и квадратики - там вроде бы все норм с цветами, я проверял, рисуя всякие фигуры определенных цветов, но вот если попробовать вывести картинку по вот ЭТОЙ инструкции, то получается какая-то фигня: введите сюда описание изображения И картинка из массива из инструкции, rocks_02.h выглядят так же. Настройки конвертора следующие: введите сюда описание изображения Мне еще понравился онлайн-конвертр. А код у меня такой:

#define LGFX_USE_V1         // set to uACse new version of library
#include <LovyanGFX.hpp>    // main library
#include "esp32-hal-psram.h"
#include "C:\Users\madmentat\Documents\Arduino\ArduinoLCD\CS01PLUS\img.h"

// Portrait
#define TFT_WIDTH   320
#define TFT_HEIGHT  480

class LGFX : public lgfx::LGFX_Device
{
lgfx::Panel_ST7796  _panel_instance;  // ST7796UI
lgfx::Bus_Parallel8 _bus_instance;    // MCU8080 8B
lgfx::Light_PWM     _light_instance;
lgfx::Touch_FT5x06  _touch_instance;

public:
LGFX(void)
{
{
  auto cfg = _bus_instance.config();
  cfg.freq_write = 40000000;    
  cfg.pin_wr = 47;             
  cfg.pin_rd = -1;             
  cfg.pin_rs = 0;              

  // LCD data interface, 8bit MCU (8080)
  cfg.pin_d0 = 9;              
  cfg.pin_d1 = 46;             
  cfg.pin_d2 = 3;              
  cfg.pin_d3 = 8;              
  cfg.pin_d4 = 18;             
  cfg.pin_d5 = 17;             
  cfg.pin_d6 = 16;             
  cfg.pin_d7 = 15;             

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

  { 
  auto cfg = _panel_instance.config();    

  cfg.pin_cs           =    -1;  
  cfg.pin_rst          =    4;  
  cfg.pin_busy         =    -1; 

  cfg.panel_width      =   TFT_WIDTH;
  cfg.panel_height     =   TFT_HEIGHT;
  cfg.offset_x         =     0;
  cfg.offset_y         =     0;
  cfg.offset_rotation  =     0;
  cfg.dummy_read_pixel =     8;
  cfg.dummy_read_bits  =     1;
  cfg.readable         =  false;
  cfg.invert           = true;
  cfg.rgb_order        = false;
  cfg.dlen_16bit       = false;
  cfg.bus_shared       = false;

  _panel_instance.config(cfg);
}

{
  auto cfg = _light_instance.config();    

  cfg.pin_bl = 45;              
  cfg.invert = false;           
  cfg.freq   = 44100;           
  cfg.pwm_channel = 7;          

  _light_instance.config(cfg);
  _panel_instance.setLight(&_light_instance);  
}

{ 
  auto cfg = _touch_instance.config();

  cfg.x_min      = 0;
  cfg.x_max      = 319;
  cfg.y_min      = 0;  
  cfg.y_max      = 479;
  cfg.pin_int    = 7;  
  cfg.bus_shared = true; 
  cfg.offset_rotation = 0;

  cfg.i2c_port = 1;//I2C_NUM_1;
  cfg.i2c_addr = 0x38;
  cfg.pin_sda  = 6;   
  cfg.pin_scl  = 5;   
  cfg.freq = 400000;  

  _touch_instance.config(cfg);
  _panel_instance.setTouch(&_touch_instance);  
  }

  setPanel(&_panel_instance); 
 }
};

static LGFX lcd;            // declare display variable

// Variables for touch x,y
static int32_t x,y;

void setup(void)
{
lcd.init();
// Setting display to landscape
if (lcd.width() < lcd.height()) lcd.setRotation(lcd.getRotation() ^ 1);
lcd.setCursor(0,0);
lcd.pushImage (0,0,480,320,_Kristi480);
}

void loop()
{
if (lcd.getTouch(&x, &y)) {
lcd.fillRect(x-2, y-2, 5, 5, TFT_RED);
lcd.setCursor(380,0);
lcd.printf("Touch:(%03d,%03d)", x,y);
}
}

Кстати, если собирать проект в нативном онлайн-конструкторе от 8ms.xyz, то все Ок: введите сюда описание изображения То есть, сам девайс не сломан, дело в каких-то настройках. Пожалуйста, помогите разобраться, откуда идут искажения.

P.S. По совету товарища eri сделал RGB-тест. Вот оригинал, квадратик 40 на 40:

введите сюда описание изображения

А вот что получилось после конвертации:

введите сюда описание изображения

Но вот что делать дальше я пока тоже не понимаю, так что буду благодарен за помощь.


Ответы (1 шт):

Автор решения: user591218

После

lcd.setCursor(0, 0);

Используйте

lcd.swapBytes(true); 

Это для прозрачных правильных цветов.

→ Ссылка