15浏览
查看: 15|回复: 0

[Micropython] DFRobot ESP32-P4开发板玩转LVGL Micropython

[复制链接]
FireBeetle 2 ESP32-P4 是一款搭载 ESP32-P4R32 芯片的高性能微控制器开发板,支持单精度 FPU 浮点运算与 AI 指令扩展,边缘 AI 处理能力十分出色,搭配 LVGL-MicroPython 开发图形界面效果最佳
1、开发板速览
  • 双核RISC-V 360MHz + 单核RISC-V 40MHz处理器,提供强劲的计算能力
  • 支持单精度 FPU 和 AI 扩展,具有强大的边缘AI能力
  • 768KB L2MEM + 32MB PSRAM + 16MB FLASH,为数据、指令、代码提供高性能、大容量的存储
  • 板载MIPI-DSI接口,最高支持720p@88fps 或 1080p@30fps图像显示
  • 板载MIPI-CSI接口,最高支持720p@88fps 或 1080p@30fps图像采集
  • 集成ESP32-C6模组,支持WiFi6、Bluetooth 5通讯
  • 集成丰富易用的扩展接口:USB OTG 2.0高速、MIC、TF卡槽

2、LVGL_MicroPython 固件
Micropython官方已支持ESP32-P4,Kevin维护的LVGL-Micropython也已支持ESP32-P4,但是DSI驱动还有点问题。我对源码进行修改并成功编译了lvgl_micropython固件。
编译过程略折腾,附件直接提供已编译好的固件,省去大家动手编译的麻烦。
3、烧录
参考ESP32的烧录方法,注意烧录地址为:0x2000
4、正式体验
LVGL-Micropython 的屏幕与触摸驱动配置较为繁琐,我已将其封装为screen.py驱动模块,通过该模块可快速完成显示屏和触摸功能的初始化,大幅简化开发流程。
先将命名为 screen.py 的屏幕驱动文件上传到开发板根目录,LVGL 官方提供的 DEMO 原本不适配本这块屏幕,我对其进行修改测试:
  1. import lvgl as lv
  2. import screen
  3. # ---------- 初始化 ----------
  4. scr = lv.screen_active()
  5. scr.set_style_bg_color(lv.color_hex(0x000000), 0)
  6. # ---------- Controls 页面 ----------
  7. def controls_create(parent):
  8.     parent.set_flex_flow(lv.FLEX_FLOW.ROW_WRAP)
  9.     parent.set_flex_align(lv.FLEX_ALIGN.SPACE_EVENLY, lv.FLEX_ALIGN.CENTER,
  10.                           lv.FLEX_ALIGN.CENTER)
  11.     # Button
  12.     btn = lv.button(parent)
  13.     btn.set_size(100, 50)
  14.     lbl = lv.label(btn)
  15.     lbl.set_text("Button")
  16.     lbl.center()
  17.     # Switch
  18.     sw = lv.switch(parent)
  19.     # Checkbox
  20.     cb = lv.checkbox(parent)
  21.     cb.set_text("Check")
  22.     # Slider + label
  23.     slider = lv.slider(parent)
  24.     slider.set_range(0, 100)
  25.     slider.set_value(40, False)
  26.     slider.set_size(150, 10)
  27.     lbl_val = lv.label(parent)
  28.     lbl_val.set_text("40")
  29.     slider.add_event_cb(lambda e: lbl_val.set_text(str(slider.get_value())),
  30.                         lv.EVENT.VALUE_CHANGED, None)
  31.     # Text area
  32.     ta = lv.textarea(parent)
  33.     ta.set_size(200, 80)
  34.     ta.set_placeholder_text("Enter text here")
  35.     ta.set_one_line(False)
  36.     # 添加键盘
  37.     kb = lv.keyboard(parent)
  38.     kb.set_size(480, 150)
  39.     kb.set_style_bg_color(lv.color_hex(0x333333), 0)
  40.     kb.set_style_text_color(lv.color_hex(0xFFFFFF), 0)
  41.     kb.set_textarea(ta)  # 将键盘与文本输入框关联
  42.     # 隐藏键盘,直到需要时显示
  43.     kb.add_flag(lv.obj.FLAG.HIDDEN)
  44.     # 为文本输入框添加事件回调
  45.     def ta_event_cb(e):
  46.         code = e.get_code()
  47.         #print(f"Event code: {code}")  # 打印事件代码
  48.         if code == lv.EVENT.FOCUSED:
  49.             print("Text area focused")
  50.             kb.remove_flag(lv.obj.FLAG.HIDDEN)  # 当文本输入框获得焦点时显示键盘
  51.         elif code == lv.EVENT.DEFOCUSED:
  52.             print("Text area defocused")
  53.             kb.add_flag(lv.obj.FLAG.HIDDEN)  # 当文本输入框失去焦点时隐藏键盘
  54.     ta.add_event_cb(ta_event_cb, lv.EVENT.ALL, None)
  55. # ---------- Visuals 页面 ----------
  56. def visuals_create(parent):
  57.     parent.set_flex_flow(lv.FLEX_FLOW.ROW_WRAP)
  58.     parent.set_flex_align(lv.FLEX_ALIGN.SPACE_EVENLY, lv.FLEX_ALIGN.CENTER,
  59.                           lv.FLEX_ALIGN.CENTER)
  60.     # Line chart
  61.     chart = lv.chart(parent)
  62.     chart.set_size(220, 130)
  63.     chart.set_type(lv.chart.TYPE.LINE)
  64.     chart.set_point_count(8)
  65.     chart.set_div_line_count(3, 5)
  66.     ser1 = chart.add_series(lv.color_hex(0x01a2b1), lv.chart.AXIS.PRIMARY_Y)
  67.     ser2 = chart.add_series(lv.color_hex(0x44d1b6), lv.chart.AXIS.PRIMARY_Y)
  68.     for v in [10, 90, 30, 60, 10, 90, 30, 60]:
  69.         chart.set_next_value(ser1, v)
  70.     for v in [32, 66, 5, 47, 32, 66, 5, 47]:
  71.         chart.set_next_value(ser2, v)
  72.     # Arc
  73.     arc = lv.arc(parent)
  74.     arc.set_size(120, 120)
  75.     arc.set_range(0, 100)
  76.     arc.set_value(50)
  77.     # Label with style
  78.     lbl = lv.label(parent)
  79.     lbl.set_text("Styled Label")
  80.     lbl.set_style_text_color(lv.color_hex(0xFF0000), 0)
  81. # ---------- Selectors 页面 ----------
  82. def selectors_create(parent):
  83.     parent.set_flex_flow(lv.FLEX_FLOW.ROW_WRAP)
  84.     parent.set_flex_align(lv.FLEX_ALIGN.SPACE_EVENLY, lv.FLEX_ALIGN.CENTER,
  85.                           lv.FLEX_ALIGN.CENTER)
  86.     # Calendar
  87.     cal = lv.calendar(parent)
  88.     cal.set_size(160, 160)
  89.     # Dropdown
  90.     dd = lv.dropdown(parent)
  91.     dd.set_options("Alpha\nBravo\nCharlie\nDelta")
  92.     dd.set_size(120, 40)
  93.     # Roller
  94.     roller = lv.roller(parent)
  95.     roller.set_options("A\nB\nC\nD\nE", lv.roller.MODE.NORMAL)
  96.     roller.set_size(120, 60)
  97.     # List
  98.     lst = lv.list(parent)
  99.     lst.set_size(200, 150)
  100.     lst.set_style_bg_color(lv.color_hex(0x333333), 0)
  101.     lst.set_style_text_color(lv.color_hex(0xFFFFFF), 0)
  102.     # 添加文本和按钮
  103.     list_btn1 = lst.add_button(lv.SYMBOL.FILE, "File")
  104.     list_btn2 = lst.add_button(lv.SYMBOL.SETTINGS, "Settings")
  105.     list_btn3 = lst.add_button(lv.SYMBOL.BATTERY_FULL, "Battery")
  106. # ---------- 主界面 ----------
  107. tabview = lv.tabview(scr)
  108. tabview.set_size(800, 480)
  109. tab1 = tabview.add_tab("Controls")
  110. tab2 = tabview.add_tab("Visuals")
  111. tab3 = tabview.add_tab("Selectors")
  112. controls_create(tab1)
  113. visuals_create(tab2)
  114. selectors_create(tab3)
复制代码

ESP32-P4 的性能能让 LVGL 的显示效果得到更好的发挥。

lvgl_micropy_ESP32_GENERIC_P4-C6_WIFI-16.zip

1.44 MB, 下载次数: 1

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2026 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail