• 締切済み

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); }

みんなの回答

回答No.1

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/

関連するQ&A

  • C#のプログラムでエラーが…

    プログラムを作ったのですが、どうしてもエラーが出てしまいます。この中でどこが間違っているのか、教えてください!!(>_<)文字数の都合で見にくいですが… namespace DrawTool { public class MyLine { // 線の太さを設定 int lineWidth; // 線の太さをクラス外から設定 public int LineWidth { set { lineWidth = value; } } // 線を構成する複数の点 ArrayList Points = new ArrayList(); Color lineColor; public MyLine(int x, int y) { Points.Add(new Point(x, y)); } // 線の色をMyLine クラス外から設定 public Color LineColor { set { lineColor = value; } } // 現在の点の数を返す public int Count { get { return Points.Count; } } // 点を追加 public void Add(int x, int y) { Points.Add(new Point(x, y)); } // 線を描く public void Draw(Graphics g) { // ペンの作成 Pen pen = new Pen(lineColor, lineWidth); pen.EndCap = LineCap.Round; for(int i=0; i<Points.Count - 1; i++) g.DrawLine(pen, (Point)Points[i], (Point)Points[i + 1]); // ペンを開放 pen.Dispose(); } // 直前の追加分だけを描く public void DrawLastSegment(Graphics g) { // 線の始点終点をとりだす Point p1 = (Point)Points[Points.Count - 2]; Point p2 = (Point)Points[Points.Count - 1]; Pen pen = new Pen(lineColor, lineWidth); pen.EndCap = LineCap.Round; // 始点から終点まで線を引く g.DrawLine(pen, p1, p2); pen.Dispose(); } } }

  • actionscript 3.0 初心者です

    現在bitmap処理について調べています。 以下の記述に置いて、ライブラリーにあるpng画像をbitmapで読み込みました。 この画像はswfファイルに埋め込み済みでクラスをtokyo1としています。 続いて、これを.draw()を使って画像に変化を起こそうとしましたが、 こちらはうまく行きませんでした。 どこかおかしいのでしょうか?お心当たりございましたら是非よろしくお願いします。 import flash.display.BitmapData; import flash.display.Bitmap; import flash.geom.Matrix; import flash.geom.ColorTransform; var rectX:Number=40; var rectY:Number=30; var rectwidth:Number=20; var rectheight:Number=20; var rect1:Rectangle=new Rectangle(rectX,rectY,rectwidth,rectheight); var btm_data:BitmapData=new tokyo1(); var btm_obj:Bitmap=new Bitmap(btm_data,PixelSnapping.AUTO,false); var matrix:Matrix=new Matrix(2,0,0,3,0,0); var color:ColorTransform=new ColorTransform(1,1,1,1,0,0,0,0); btm_data.draw(stage,matrix,color,BlendMode.NORMAL,rect1,true); addChild(btm_obj);

    • ベストアンサー
    • Flash
  • javascriptで困ってます

    下記のスクリプトでcanvas上で四角を動かすアニメーションをさせたのですが、andoroidに標準のブラウザで見ると、最初の位置に四角が残ってしまいます。この残ってしまう四角を消したたいのですが、どのようにしたらよいのでしょうか、教えてください。よろしくお願いします。 <!doctype html> <html> <head> <meta charset="UTF-8"> <title>canvasアニメーション</title> <script type="text/javascript"> // <![CDATA[ window.onload = function(){ var canvas = document.getElementById("canvas"); var ctx = canvas.getContext("2d"); ctx.fillStyle = "#ffffff"; var point = {x:0,y:0}; var par = {x:3,y:3}; var timer; var delay = 100; function draw(x,y){ ctx.clearRect(0,0,600,600); ctx.fillRect(x,y,50,50); } var loop = function(){ point.x = point.x + par.x; point.y = point.y + par.y; draw(point.x,point.y); clearTimeout(timer); timer = setTimeout(loop,delay); } loop(); } // ]]> </script> <style type="text/css" media="screen"> /* <![CDATA[ */ body{ background-color:#000000; } /* ]]> */ </style> </head> <body> <canvas id="canvas" width="600" height="600"></canvas> </body> </html>

  • 線積分の計算の仕方

    こんにちは。 「A vertical fence is constructed whose base is the curve y=x√x,from (0,0) to (1,1),and whose height above each point (x,y) along the curve is x^3-y^2+27.Find the area of this fence.」 という問題です。 x,yをパラメータ表示すると x=t,y=t√tでtは0から1まで よって、 ds/dt=√((t')^2+((t√t)')^2)=√(1+9/4t) したがって、 ∫(x^3-y^2+27)ds C =∫(0 to 1)(t^3-t^3+27)√(1+9/4t)dt =∫(0 to 1)(27√(1+9/4t)dt =27[8/27(1+9/4t)^(3/2)](0 to 1) =113/2 となったのですが解答には13√13-8となっています。何処を間違っているのでしょう?

  • DirectXで画像表示

    DirextXでゲームを作ってるんですがわからないことがあるんで教えてください。 背景として640×640(ピクセル)の画像を表示したくて(ウィンドウはサイズ640,640で作成) RECT from; D3DXVECTOR3 to; D3DCOLOR color; from = makeRect(0,0,640,640); to = D3DXVECTOR3(0,0,0); color = D3DCOLOR_ARGB(255,255,255,255); if(g_pTexture != NULL) g_pSprite->Draw(g_pTexture, &from, NULL, &to, color); RECT makeRect(int x, int y, int w, int h) { RECT box; box.left = x; box.top = y; box.right = w; box.bottom = h; return (box); } //g_pTexture = D3DXCreateTextureFromFileEx関数で作成したテクスチャオブジェクト。 //g_pSprite = スプライトオブジェクト。 大体こんな感じの流れで背景画像を表示したらウィンドウ全体に画像の一部分だけが拡大されて表示されました。なぜ画像全体がうまく表示されないんでしょうか? 例えば64×64のキャラクタ画像を from = makeRect(0,0,64,64); to = D3DXVECTOR3(0,0,0); で表示したら画面左上にうまく表示されました。 初心者なんであまりうまく説明できないんでかなりわかりにくいかもしれませんが、わかる方よろしくお願いします。

  • java の配列についての質問です。

    java の配列についての質問です。 java 及び C++についての知識は初心者です。 public abstract class Plan implements Shapeable { Shape[] shape = new Shape[5]; Shape[0] = new Rectangle(10,10,10,10); // x,y 座標 及び 長さ、高さ Shape[1] = new Triangle(10,10,30,10,20,20); // 3点間の座標        Shape[2] = new Triangle(20,10,40,10,30,20);        Shape[3] = new Triangle(15,15,35,15,25,25); Shape[4] = new Circle(20,20,20); // 円の座標と半径     public float[] calculaterAreas(){ ??????????????????? } 内容としては複雑なのですが、三角形、四角形、円の面積をShapeというclassの配列にあるデータ(座標や長さなど) を使ってShapeの配列のデータを置き換えてfloatのデータとして返すんですが・・・・。どうやっていいのかさっぱり わかりません。面積については、Rectangle,Triangle,Circleのクラスでそれぞれ計算できるようになっているのですが、それを持ってくる方法もわかりません・・・どうしたらいいのか教えてください 宜しくお願いします。 ちなみに Rectangle,Triangle,Circle class の area の メソットは --- Rectangle class public class Rectangle extends Shape{ int x; int y; int width; int height; public float area(Rectangle r) { return r.width * r.height; } --- Circle class public class Circle extends Shape{ int x; int y; int radius; public float area(Circle c) { return (float) (c.x * c.y * 3.14); } } --- Triangle class public class Triangle extends Shape{ int x; int y; int x2; int y2; int x3; int y3; public float area(Triangle t) { float dt1,dt2,dt3; float s1; float area1; dt1 = Point.distance(x, y); // Point は dt2 = Point.distance(x2, y2); dt3 = Point.distance(x3, y3); s1 = (dt1+dt2+dt3)/2; area1 = (float) Math.sqrt((s1-dt1)*(s1-dt2)*(s1-dt3)); return area1; } } *** Shape class public abstract class Shape implements Shapeable { public abstract float area(Shape obj); } *** Shapeable インターフェイス public interface Shapeable { float area (Shape obj); } ** コンストラクター等は省略してあります。

    • ベストアンサー
    • Java
  • 十進BASICでのsin(x)の近似のグラフ化について

    十進BASICを使っています。 sin(x)=x-x^3/3!+x^5/5!-... について、グラフで確かめようと思いプログラミングしてみたんですが、3行目でt=36以上にするとグラフが描かれなくなってしまいます。 どこを直せばt>35でもグラフが描かれるようになるのか教えていただけないでしょうか。よろしくおねがいします。 LET w=30 LET s=0.1 LET t=30 DIM p1(t) DIM p2(t) SET WINDOW -w,w,-w,w SET POINT STYLE 1 DRAW AXES0 FOR n= 1 TO t LET p1(n)=(-1)^(n+1) LET p2(n)=2*n-1 NEXT n SET LINE COLOR 15 FOR x= -w TO w STEP s LET y=SIN(x) PLOT LINES: x,y; NEXT x PLOT LINES SET LINE COLOR 1 FOR x= -w TO w STEP s WHEN EXCEPTION IN LET y=0 FOR n= 1 TO t LET y=y+p1(n)*x^p2(n)/FACT(p2(n)) NEXT n PLOT LINES: x,y; USE PLOT LINES END WHEN NEXT x END

  • 雑誌のスクリプトの意味がわかりせん2

    スクリプトと解らない点を載せさせていただきました。もしよければ教えて下さい。800字を超えないためにギュウギュウで記述しましたのでかなりややこしくなっていますが、お願いいたします。 ●MCの写りこみを作成するスクリプトです。引数に3つのMCを渡しています。 CreateReflect = function (OriginalTG, DisplayTG, MaskTG) { var OriginalBMP = new flash.display.BitmapData(OriginalTG._width, OriginalTG._height, true, 0); var DisplayBMP = OriginalBMP.clone(); //OriginalBMPと全く同じオブジェクトを新しくDisplayBMPとして作成? var MaskBMP = new flash.display.BitmapData(MaskTG._width, MaskTG._height, true, 0); OriginalBMP.draw(OriginalTG); MaskBMP.draw(MaskTG); DisplayTG.attachBitmap(DisplayBMP, 1); //ここが理解できなかったとこなのですが、これは完全に透明なビットマップを割り当てているって事ではないのでしょうか? var DisplayRectangle = new flash.geom.Rectangle(0, 0, MaskTG._width, MaskTG._height); var OffSetPoint = new flash.geom.Point(0, 0); var BasePoint = new flash.geom.Point(0, 0); //マスクを適用する際のサイズとxとyの値を設定するために定義してる? DisplayBMP.copyPixels(OriginalBMP, DisplayRectangle, OffSetPoint, MaskBMP, BasePoint, true); //これはビットマップオブジェクトのDsplayBMPにOriginalBMPをアルファーをかけた上体でコピーするって事だと思うのですが、この後にDisplayBMPをattachする必要はないのでしょうか?上記の方でDisplayTG.attachBitmap(DisplayBMP, 1);を定義してるから?とここらへんで解らなくなってしまいました。 //attachBitmapをした後にattach元のビットマップを変更すると自動的にattachされたムービークリップに反映されるという事でしょうか?};

    • ベストアンサー
    • Flash
  • C言語で画面がおかしくなる

    最近C言語でプログラムを書き始めました。 二次関数を作るスクリプトなんですが、一定時間がたつと画面がおかしくなります。 どこが問題なのか探しても見つからないので、わかる方教えてください。 WinMainの部分は省いてます #include<windows.h> #include<stdio.h> #include <stdlib.h> #include<time.h> #define TIMER_ID 1 #define spy(num) (wy-num) int rnd(int r); void bset(HDC hdc, int x, int y); LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) { HDC hDC; static int DesktopX ,DesktopY; static HDC hdc; static HDC Mhdc; static HBITMAP BMPhdc; PAINTSTRUCT paint; RECT Rect; LOGPEN lopnPen; POINT CursorP, ScreenP; char str[250]; int i; static int wx, wy ,ky; static double a ,b ,c ,x ,y ,n ,m ,s ,t; switch (msg) { case WM_DESTROY: DeleteObject( BMPhdc ); DeleteDC( Mhdc ); PostQuitMessage(0); return 0; case WM_CREATE: SetTimer(hwnd, TIMER_ID, 10, NULL); hDC = GetDC(hwnd); hdc = CreateCompatibleDC( hDC ); GetClientRect(GetDesktopWindow() ,&Rect); DesktopX = Rect.right ;DesktopY = Rect.bottom; BMPhdc = CreateCompatibleBitmap( hDC, DesktopX, DesktopY ); SelectObject( hdc, BMPhdc ); ReleaseDC( hwnd, hDC ); GetClientRect(hwnd, &Rect); wx = Rect.right ;wy = Rect.bottom; x = rnd(wx); y = rnd(wy); n = rnd(wx); m = rnd(wy); return 0; case WM_TIMER: ScreenP.x = LOWORD(lp); ScreenP.y = HIWORD(lp); GetClientRect(hwnd, &Rect); wx = Rect.right ;wy = Rect.bottom; if( ky == 1 ){ x = rnd(wx); y = rnd(wy); n = rnd(wx); m = rnd(wy); } ClientToScreen(hwnd ,&ScreenP); GetCursorPos(&CursorP); s = CursorP.x-ScreenP.x; t = wy-(CursorP.y-ScreenP.y); InvalidateRect(hwnd, NULL, FALSE); return 0; case WM_RBUTTONDOWN: ky = 1; return 0; case WM_RBUTTONUP: ky = 0; return 0; case WM_PAINT: Mhdc = BeginPaint(hwnd, &paint); SelectObject(hdc , CreateSolidBrush(RGB(255,255,255))); lopnPen.lopnStyle = PS_NULL; SelectObject(hdc , CreatePenIndirect(&lopnPen)); Rectangle(hdc , 0 , 0 , wx+1 , wy+1); SelectObject(hdc , CreateSolidBrush(RGB(255,0,0))); if ((s-n) != 0 && (n-x) != 0 && (s-x) != 0){ a = ((t-m)/(s-n) - (m-y)/(n-x)) / (s-x); b = (m-y)/(n-x) - a*(n+x); c = y - a*x*x -b*x; } bset(hdc, x,spy(y)); bset(hdc, n,spy(m)); bset(hdc, s,spy(t)); lopnPen.lopnStyle = PS_SOLID; lopnPen.lopnColor = RGB(0,0,255); SelectObject(hdc , CreatePenIndirect(&lopnPen)); MoveToEx(hdc , -1 , spy( a + b - c) , NULL); for(i = 0 ; i <= wx ;i++){ LineTo(hdc , i , spy( a*i*i - b*i - c)); } BitBlt(Mhdc, 0, 0, DesktopX, DesktopY, hdc, 0, 0, SRCCOPY ); EndPaint(hwnd, &paint); return 0; } return DefWindowProc(hwnd , msg , wp , lp); } int rnd(int r){ static int flag; if (flag == 0) { srand((unsigned int)time(NULL)); flag = 1; } return (int)(rand()*(r+1.0)/(1.0+RAND_MAX)); } void bset(HDC hdc, int x, int y){ static LOGPEN lopnPen; lopnPen.lopnStyle = PS_NULL; SelectObject(hdc , CreatePenIndirect(&lopnPen)); Rectangle(hdc , x-3 , y-3 , x+3 , y+3); return; }

  • スペック

    知り合いから中古のibookを購入しようと思っているのですが、性能がどの程度なのかよくわかりません。スペックは、 CPU:PowerPC G3 500MHz メモリ:640MB(128MB+512MB) ハードディスク:15GB 光学式ドライブ:DVD-ROM Drive 液晶ディスプレイ:12.1型(1024×768) TFTカラー液晶ディスプレイ thernet (100Base-TX/10Base-T) FireWire400、USB×2、VGA出力(別途アダプタが必要) です。 このスペックはどの程度使えるのでしょうか?word excel power point 、ネットを快適に使いたいと思っています。OSは10.3か10.4を入れようかと考えています。快適に動くでしょうか?よろしくお願いいたします。

    • ベストアンサー
    • Mac

専門家に質問してみよう