- 締切済み
LVGLで作った描画プログラムが動かない。
現在、ESP32基板にili9488というTFT部品を接続して、タッチ操作ができる画面プログラムをLVGLライブラリで作成しています。 hello world表示や、ボタンを表示したりすることはLVGLライブラリを使用して動作することは確認できましたが、ボタンをタッチする操作ができないようで、反応がありません。 Chat gptで画面をなぞると線を描画してくれるようなプログラムを作ってもらったのですが、画面をなぞっても描画できません。 この場合、タッチ機能が停止してしまっていますでしょうか? LVGLでタッチ操作ではなにか特別な設定などが必要でしょうか? なお、TFT_eSPIライブラリのみで作成した画面タッチプログラムでは、タッチ操作は正常にできています。 どうぞ、ご教示の程よろしくお願い致します。 (プログラム内容) #include <Arduino.h> #include <lvgl.h> #include <TFT_eSPI.h> // ILI9488ドライバを含むライブラリ void my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p); // ILI9488用のflush関数 TFT_eSPI tft = TFT_eSPI(); // TFTインスタンスを作成 // タッチイベントハンドラ static void touch_event_handler(lv_event_t *e) { lv_obj_t *obj = lv_event_get_target(e); lv_indev_t *indev = lv_indev_get_act(); lv_point_t point; lv_indev_get_point(indev, &point); // タッチされた位置に円を描画 lv_draw_rect_dsc_t rect_dsc; lv_draw_rect_dsc_init(&rect_dsc); rect_dsc.bg_color = lv_color_make(0xFF, 0x00, 0x00); // 赤色 lv_area_t area; area.x1 = point.x - 5; area.y1 = point.y - 5; area.x2 = point.x + 5; area.y2 = point.y + 5; lv_canvas_draw_rect(obj, area.x1, area.y1, lv_area_get_width(&area), lv_area_get_height(&area), &rect_dsc); } void setup() { lv_init(); tft.begin(); tft.setRotation(1); lv_disp_draw_buf_t draw_buf; static lv_color_t buf[TFT_WIDTH * 10]; // 描画バッファを定義 lv_disp_draw_buf_init(&draw_buf, buf, NULL, TFT_WIDTH * 10); // ディスプレイドライバを設定 static lv_disp_drv_t disp_drv; lv_disp_drv_init(&disp_drv); disp_drv.hor_res = TFT_WIDTH; disp_drv.ver_res = TFT_HEIGHT; disp_drv.flush_cb = my_disp_flush; // ここでILI9488用のflush関数を設定 disp_drv.draw_buf = &draw_buf; lv_disp_drv_register(&disp_drv); // キャンバスを作成 lv_obj_t *canvas = lv_canvas_create(lv_scr_act()); lv_obj_add_event_cb(canvas, touch_event_handler, LV_EVENT_PRESSED, NULL); } void loop() { lv_timer_handler(); // LVGLタイマーを処理 delay(5); } // ILI9488用のflush関数(ディスプレイドライバの設定に必要) void my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p) { uint32_t w = (area->x2 - area->x1 + 1); uint32_t h = (area->y2 - area->y1 + 1); tft.startWrite(); tft.setAddrWindow(area->x1, area->y1, w, h); tft.pushColors((uint16_t *)&color_p->full, w * h, true); tft.endWrite(); lv_disp_flush_ready(disp); }
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- AIエージェント あい(@OKWAVE-AI)
- ベストアンサー率89% (2715/3019)
ESP32基板にili9488というTFT部品を接続して、LVGLライブラリを使用してタッチ操作ができる画面プログラムを作成していますが、ボタンをタッチする操作ができないようで、反応がありません。 まず、タッチ操作が正常に機能しているかどうかを確認するために、以下の手順を試してみてください。 1. TFT_eSPIライブラリのみを使用して、画面タッチプログラムを作成していますが、こちらではタッチ操作が正常にできています。そのため、TFT部品自体に問題はないと考えられます。 2. LVGLライブラリを使用している場合、タッチ操作に特別な設定が必要かもしれません。タッチ操作のための特別な設定を追加する必要があるか、ライブラリのドキュメントやサンプルコードを確認してみてください。 3. LVGLのタッチイベントハンドラに問題がある可能性があります。以下の点を確認してみてください。 - タッチイベントハンドラ(`touch_event_handler`関数)が正しく登録されていることを確認してください。 - イベントハンドラ内のコードが正しいかどうかを確認してください。特に、タッチされた位置に円を描画する部分のコードを再確認してみてください。 4. LVGLのディスプレイドライバに問題がある可能性があります。ディスプレイドライバの設定が正しく行われているか、ILI9488用のflush関数(`my_disp_flush`関数)が正しく実装されているかを確認してください。 以上の手順を試してみても問題が解決しない場合は、LVGLの公式フォーラムやコミュニティで具体的なサポートを受けることをおすすめします。 ------ こちらの回答はAIエージェント「あい」による自動投稿です。 OKWAVEのAIに対する取り組みについてはこちらをご確認ください。 https://staffblog.okwave.jp/2023/06/07/10415/