Description
I am having trouble with the screen turning white immediately on startup and not showing anything.
To test the display buffer, I replaced the code in the display buffer to colour the screen red (i.e., replaced the code in the second for loop with Display.set(x, y, 255, 0, 0);
). I saw the red streak through the display in blocks, and then the blocks be trailed almost immediately by black as the red continued down (whether or not I had the code for lv_obj_t * screen_black = lv_obj_create(NULL);
there or not), then the screen turned white. I also put a serial print in the flush callback that was outputting to the monitor. So I know that the flush callback is being called and is working.
If I replace lv_obj_t * screen_black = lv_obj_create(NULL);
with lv_obj_t * screen_black = lv_obj_create(lv_screen_active());
, leave the rest of the code for the screen obj, and remove the code for creating the display and buffers, the screen does appropriately turn black (with a small white border).
I thought about trying TFT_eSPI instead of Arduino_H7_Video that I am currently using, but though it looks like the processor might be supported, I couldn’t figure out the right driver for the display (and I haven’t found an example from anyone who has got it working with the Giga Display).
Any ideas of what might be going on here?
What MCU/Processor/Board and compiler are you using?
Arduino Giga with an Arduino Giga Display Shield
What LVGL version are you using?
v9.2.2
What do you want to achieve?
Get the display working properly
What have you tried so far?
Testing to make sure that the display buffer is working
Code to reproduce
#include <Arduino_H7_Video.h>
#include <Arduino_GigaDisplay.h> // v1.0.2
#include <Arduino_GigaDisplayTouch.h> // v1.0.1
#include <lvgl.h> // LVGL v9.2.2
#include <ArduinoGraphics.h>
Arduino_H7_Video Display(800, 480, GigaDisplayShield);
Arduino_GigaDisplayTouch TouchDetector;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Display.begin();
lv_init();
lv_display_t * display = lv_display_create(800, 480);
static uint8_t buf1[800 * 480 / 10];
lv_display_set_buffers(display, buf1, NULL, sizeof(buf1), LV_DISPLAY_RENDER_MODE_PARTIAL);
lv_display_set_flush_cb(display, my_disp_flush);
lv_disp_set_default(display);
lv_obj_t * screen_black = lv_obj_create(NULL);
lv_obj_set_size(screen_black, 800, 480);
lv_obj_set_style_bg_color(screen_black, lv_color_black(), LV_PART_MAIN);
lv_obj_set_style_bg_opa(screen_black, LV_OPA_COVER, LV_PART_MAIN);
lv_screen_load(screen_black);
}
void loop() {
// put your main code here, to run repeatedly:
lv_timer_handler();
}
void my_disp_flush(lv_display_t *disp, const lv_area_t *area, uint8_t *color_p) {
// Cast the buffer to lv_color_t for proper interpretation
lv_color_t *color_map = (lv_color_t *)color_p;
// Start drawing to the framebuffer
Display.beginDraw();
// Loop through the area and set pixels
for (int32_t y = area->y1; y <= area->y2; y++) {
for (int32_t x = area->x1; x <= area->x2; x++) {
// Extract RGB565 from lv_color_t
uint16_t color = *((uint16_t *)color_map);
// Convert RGB565 to R, G, B components
uint8_t r = (color >> 11) & 0x1F; // Extract 5 bits for red
uint8_t g = (color >> 5) & 0x3F; // Extract 6 bits for green
uint8_t b = color & 0x1F; // Extract 5 bits for blue
// Scale to 8-bit values (0-255)
r = (r * 255) / 31;
g = (g * 255) / 63;
b = (b * 255) / 31;
// Set the pixel color
Display.set(x, y, r, g, b);
// Advance to the next color in the buffer
color_map++;
}
}
// End drawing operation
Display.endDraw();
lv_display_flush_ready(disp);
}