码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • [ESP32 Arduino] LVGL Button的使用


    目录

    说明

    先决条件

    硬件部分

    软件部分

    Button

    lv_btn_create

    背景知识

    lv_scr_act

    背景知识

    触摸部分

    背景知识

    实现过程


    说明

    官方文档:

    Widgets — LVGL documentation

    中文版翻译:

    🎨百问网LVGL中文教程手册文档 — 百问网LVGL中文教程手册文档 1.0 文档 (100ask.net)

    先决条件

    硬件部分

    ESP32, 240x320电容触摸LCD屏,驱动IC为ILI9341.

    软件部分

    ESP32 Aruduino移植好了LVGL, 使用TFT_eSPI库作为LCD驱动库.

    (其实在此之前我还做了一系列的准备活动,但是篇幅有限不一一展开,有兴趣的可以自行摸索)

    Button

    按键的一般行为有如下几种:

    1. pressed;

    2. released;

    3. long pressed.

    官方example的实例

    实现代码

    1. static void event_handler(lv_event_t * e)
    2. {
    3. lv_event_code_t code = lv_event_get_code(e);
    4. if(code == LV_EVENT_CLICKED) {
    5. LV_LOG_USER("Clicked");
    6. }
    7. else if(code == LV_EVENT_VALUE_CHANGED) {
    8. LV_LOG_USER("Toggled");
    9. }
    10. }
    11. void lv_example_btn_1(void)
    12. {
    13. lv_obj_t * label;
    14. lv_obj_t * btn1 = lv_btn_create(lv_scr_act());
    15. lv_obj_add_event_cb(btn1, event_handler, LV_EVENT_ALL, NULL);
    16. lv_obj_align(btn1, LV_ALIGN_CENTER, 0, -40);
    17. label = lv_label_create(btn1);
    18. lv_label_set_text(label, "Button");
    19. lv_obj_center(label);
    20. lv_obj_t * btn2 = lv_btn_create(lv_scr_act());
    21. lv_obj_add_event_cb(btn2, event_handler, LV_EVENT_ALL, NULL);
    22. lv_obj_align(btn2, LV_ALIGN_CENTER, 0, 40);
    23. lv_obj_add_flag(btn2, LV_OBJ_FLAG_CHECKABLE);
    24. lv_obj_set_height(btn2, LV_SIZE_CONTENT);
    25. label = lv_label_create(btn2);
    26. lv_label_set_text(label, "Toggle");
    27. lv_obj_center(label);
    28. }

    lv_btn_create

    函数原型:

    背景知识

     关于该函数的parent参数,需要先通过下面的说明了解基础概念:

    对象(Objects) — 百问网LVGL中文教程手册文档 1.0 文档 (100ask.net)

    其中描述到LVGL的Object的工作机制:

    1. 亲子结构:

    2. 追随原则:

    3. 子对象仅在父对象的范围内可见

    lv_scr_act

    在这里调用的时候使用的lv_scr_act函数,函数原型如下:

    背景知识

    需要先阅读下面两篇文章有基础概念:

    显示接口 — 百问网LVGL中文教程手册文档 1.0 文档 (100ask.net)

    显示(Displays) — 百问网LVGL中文教程手册文档 1.0 文档 (100ask.net)

    这里面涉及到了Multiple display,而一般来说只用默认的一个显示使用lv_src_act获取当前活跃显示的屏幕即可.

    触摸部分

    这部分非常关键,可以分为两个部分,第一个部分:如果不是触摸屏,只有硬件的按键应该怎么将Button控件和硬件的按键关联起来;第二个部分:触摸屏如何点击按键触发.

    下面这篇博文基本把以上两个问题都覆盖到了,这里就不展开:

     ESP32 LVGL8.1 ——Input devices 输入设备 (Input devices 18)_请叫我啸鹏的博客-CSDN博客_lvgl输入设备

    背景知识

    在 LVGL 中输入设备,有下面几种类型:

    • 指针式输入设备,如触摸板或鼠标

    • 键盘,如普通键盘或简单的数字键盘

    • 带有左/右转向和推入选项的编码器

    • 外部硬件按钮,分配给屏幕上的特定点

    详细的介绍查看如下两篇文章:

    ​​​​​输入设备接口 — 百问网LVGL中文教程手册文档 1.0 文档 (100ask.net)

    输入设备(Input devices) — 百问网LVGL中文教程手册文档 1.0 文档 (100ask.net)

    实现过程

    初始化输入设备:

    其中touch pad的type为LV_INDEV_TYPE_POINTER; 注册touch pad的回调函数,

    1. static lv_indev_drv_t indev_drv;
    2. lv_indev_drv_init( &indev_drv );
    3. indev_drv.type = LV_INDEV_TYPE_POINTER;
    4. indev_drv.read_cb = my_touchpad_read;
    5. lv_indev_drv_register( &indev_drv );

    my_touchpad_read的实现:

    注册回调的时候,如果是touch pad类型的输入, 需要将触摸的x, y坐标通过data参数传给LVGL,我这里使用的是TFT_eSPI库的接口getTouch,可以直接获取点击的坐标:

    1. void my_touchpad_read( lv_indev_drv_t * indev_driver, lv_indev_data_t * data )
    2. {
    3. uint16_t touchX, touchY;
    4. bool touched = tft.getTouch( &touchX, &touchY );
    5. if( !touched )
    6. {
    7. data->state = LV_INDEV_STATE_REL;
    8. }
    9. else
    10. {
    11. data->state = LV_INDEV_STATE_PR;
    12. /*Set the coordinates*/
    13. data->point.x = touchX;
    14. data->point.y = touchY;
    15. }
    16. }

  • 相关阅读:
    读Shape-Guided代码②
    从源码的角度回答“mybatis的#{} 和${}有什么区别”?
    数据库脏读、不可重复读、幻读以及对应的隔离级别
    Mysql_Note7
    如何通过一个项目征服Java
    vis 右键节点展开菜单
    Spring Boot 实现定时任务
    DockerFile与build命令
    「聊设计模式」之模板方法模式(Template Method)
    基于YOLOV8模型和CCPD数据集的车牌目标检测系统(PyTorch+Pyside6+YOLOv8模型)
  • 原文地址:https://blog.csdn.net/qq_38609565/article/details/126314353
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号