🤖Have you ever tried Chat.M5Stack.com before asking??😎
    M5Stack Community
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Register
    • Login

    ⚠️ HELP: LVGL on M5Stack CoreS3 not detecting touch events ⚠️

    Arduino
    2
    2
    221
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • R
      Robertof
      last edited by Robertof

      Hello community,

      I'm trying to integrate LVGL 9.3.0 with the touch screen on M5Stack CoreS3, but I'm facing an issue: touch events are not being registered correctly in LVGL, even though the touch screen works fine when tested using M5Stack's official example code.

      📌 Software versions I'm using: ✅ M5Stack CoreS3 (ESP32-S3-based hardware) ✅ LVGL version: 9.3.0 ✅ M5Unified library version: Latest available version (checked via Arduino IDE) ✅ LovyanGFX library version: Latest available version ✅ Arduino IDE version: 1.8.19 ✅ ESP32 Board Support Package: Latest version installed via Board Manager

      📌 What I’ve tested so far: ✅ The touch screen works correctly using CoreS3.Touch.getDetail(). ✅ LVGL is not detecting touches, suggesting a possible misconfiguration in lv_indev_t. ✅ I've implemented synchronization with CoreS3.update(), but LVGL still does not process touch events.

      📜 Current code I'm using:

      #include <M5CoreS3.h>
      #include <lvgl.h>
      
      // 🛠 Screen instance
      M5GFX display;
      
      // 🛠 Callback function for display update in LVGL
      void flush_cb(lv_display_t *disp_drv, const lv_area_t *area, uint8_t *color_p) {
          display.pushImage(area->x1, area->y1, area->x2 - area->x1 + 1, area->y2 - area->y1 + 1, (uint16_t*)color_p);
          lv_display_flush_ready(disp_drv);
      }
      
      // 🛠 Touch event handling using CoreS3 and advanced debugging
      void my_input_read(lv_indev_t *indev, lv_indev_data_t *data) {
          CoreS3.update();
          auto t = CoreS3.Touch.getDetail();
      
          data->point.x = t.x;
          data->point.y = t.y;
      
          Serial.print("📍 Touch state: "); Serial.println((int)t.state);
          Serial.print("📍 Coordinates → X: "); Serial.print(t.x);
          Serial.print(" Y: "); Serial.println(t.y);
      
          if (t.state == m5::touch_state_t::touch_begin || t.state == m5::touch_state_t::hold_begin || t.state == m5::touch_state_t::drag_begin) {
              data->state = LV_INDEV_STATE_PR;
              Serial.println("✅ LVGL has detected the touch!");
          } else {
              data->state = LV_INDEV_STATE_REL;
          }
      }
      
      // 🛠 Creating a test button in LVGL
      void create_button(lv_obj_t *parent) {
          lv_obj_t *btn = lv_btn_create(parent);
          lv_obj_set_size(btn, 100, 50);
          lv_obj_align(btn, LV_ALIGN_CENTER, 0, 0);
      
          lv_obj_t *label = lv_label_create(btn);
          lv_label_set_text(label, "Press");
          lv_obj_center(label);
      
          lv_obj_add_flag(btn, LV_OBJ_FLAG_CLICKABLE);
      }
      
      // 🛠 System initial setup
      void setup() {
          auto cfg = M5.config();
          CoreS3.begin(cfg);
          Serial.begin(115200);
          Serial.println("\n🚀 M5Stack CoreS3 initialized with LVGL 9.3.0 🚀\n");
      
          display.init();
          lv_init();
          display.begin();
          display.setColorDepth(16);
      
          static lv_display_t *disp_drv = lv_display_create(320, 240);
          lv_display_set_flush_cb(disp_drv, flush_cb);
      
          // 🚀 Dynamic memory allocation to optimize RAM usage
          static lv_color_t *buf1 = (lv_color_t*)malloc(320 * 50 * sizeof(lv_color_t));
          if (buf1 == NULL) {
              Serial.println("❌ Error: Failed to allocate memory.");
              return;
          }
          lv_display_set_buffers(disp_drv, buf1, NULL, 320 * 50 * sizeof(lv_color_t), LV_DISPLAY_RENDER_MODE_PARTIAL);
      
          // 🛠 Properly initialize the touch input handler in LVGL
          lv_indev_t *indev = lv_indev_create();
          lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER);
          lv_indev_set_read_cb(indev, my_input_read);
      
          // 🛠 Create a test button in LVGL
          create_button(lv_scr_act());
      
          Serial.println("✅ LVGL initialized correctly, waiting for interaction...");
      }
      
      // 🛠 Main loop for touch updates and LVGL handling
      void loop() {
          CoreS3.update();
          lv_timer_handler();
          delay(5);
      }
      

      💡 Has anyone successfully enabled touch detection in LVGL with M5Stack CoreS3? If you have any suggestions, insights, or working code examples, I’d really appreciate your help. 🙏

      Thanks in advance for any assistance! 🚀 Let’s get this working! 💪🔥

      1 Reply Last reply Reply Quote 0
      • A
        andremp
        last edited by

        Hello,

        Struggling on the same problem.

        Has anyone by any chance successfully configured the Core S3 SE to be able to run with full LVGL Support? What are the libraries and configurations required?

        Thanks in advance!

        1 Reply Last reply Reply Quote 0
        • First post
          Last post