avatar

松果工作室

欢迎光临

  • 首页
  • ESP
  • LVGL
  • CubeMX
  • freeRTOS
  • 快速笔记
  • 个人收藏
  • 我的服务
  • 所见所闻
Home (ESP-IDF)LVGL 对接 编码器
文章

(ESP-IDF)LVGL 对接 编码器

Posted 2024-04-21 Updated 2026-02- 18
By YCP
5~7 min read

驱动编码器

这里使用 ESP-IDF 提供的驱动

#include "dev_knob.h"
#include "esp_log.h"

static const char *TAG = "dev_knob";

#define GPIO_KNOB_A 6
#define GPIO_KNOB_B 10

knob_handle_t knob_handle = NULL;

static void knob_left_cb(void *arg, void *data) {
    ESP_LOGI(TAG, "knob left");
}

static void knob_right_cb(void *arg, void *data) {
    ESP_LOGI(TAG, "knob right");
}

void lvdev_knob_init(void) {
    knob_config_t cfg = {
            .default_direction = 0,
            .gpio_encoder_a = GPIO_KNOB_A,
            .gpio_encoder_b = GPIO_KNOB_B,
    };

    knob_handle = iot_knob_create(&cfg);
    iot_knob_register_cb(knob_handle, KNOB_LEFT, knob_left_cb, NULL);
    iot_knob_register_cb(knob_handle, KNOB_RIGHT, knob_right_cb, NULL);
}

对接 LVGL

indev_encoder需要引出被外部调用

static void encoder_init(void) {
    lvdev_knob_init();
}

static void encoder_read(lv_indev_t *indev_drv, lv_indev_data_t *data) {
    static int32_t last_encoder_count = 0;
    knob_event_t current_event = iot_knob_get_event(knob_handle);
    int32_t current_count = iot_knob_get_count_value(knob_handle);

    // 计算编码器差值
    int32_t encoder_diff = current_count - last_encoder_count;

    // 根据事件类型设置编码器差值
    switch (current_event) {
        case KNOB_LEFT:
            data->enc_diff = -1;
            break;
        case KNOB_RIGHT:
            data->enc_diff = 1;
            break;
        case KNOB_NONE:
            data->enc_diff = encoder_diff;
            break;
        default:
            data->enc_diff = 0;
            break;
    }
    last_encoder_count = current_count;
    data->state = module_button_get_press_state() ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED;
    data->continue_reading = false;

}

lv_indev_t *indev_encoder;

void lv_port_knob_init(void) {
    encoder_init();

    indev_encoder = lv_indev_create();
    lv_indev_set_type(indev_encoder, LV_INDEV_TYPE_ENCODER);
    lv_indev_set_read_cb(indev_encoder, encoder_read);
}

控件加入组并接入编码器

// 创建组
lv_group_t *group = lv_group_create();
lv_group_set_wrap(group, true);

// 组绑定编码器
lv_indev_set_group(encoder_indev, group); 

// 把控件加入组
lv_group_add_obj(lvsc_main.group, page);

// 添加聚焦事件
lv_obj_add_event_cb(page, lvsc_event_cb, LV_EVENT_FOCUSED, NULL);

// 初始聚焦哪个控件
lv_group_focus_obj(lv_group_get_focused(group));
LVGL ESP
License:  CC BY 4.0
Share

Further Reading

OLDER

(Elec)电子技术讲座

NEWER

(ESP-IDF)LVGL 对接 显示

Recently Updated

  • [CubeMX] SPI
  • [CubeMX] 串口 DMA
  • [CubeMX] 基础工程配置
  • (LVGL)接口预览 样式
  • (LVGL)案例预览 页面滚动吸附

Trending Tags

LVGL WCH Linux Elec ThatProject freeRTOS STM ESP Flutter Others

Contents

©2026 松果工作室. Some rights reserved.

Using the Halo theme Chirpy