个人小站

最新碎语:你好三月

您的位置:个人小站 >Arduino> oled12864使用lvgl

oled12864使用lvgl

关于lvgl库在oled单色屏幕上的使用,代码只测试了label, button控件以及动画功能,

oled驱动为ssd1306,单片机使用esp8266-12f,

编程环境arduino ide,

需要的库: Adafruit_SSD1306, Adafruit_GFX, Lvgl


QQ截图20221228204813.png


lv_conf.h配置中修改:LV_COLOR_DEPTH 为 1

参考链接: https://www.cnblogs.com/caiya/p/15978839.html

测试代码:

#include <lvgl.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define I2C_SDA 4
#define I2C_SCL 5

#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C

#define LV_BUFF_SIZE (SCREEN_WIDTH * 16)

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

static lv_disp_draw_buf_t draw_buf;
static lv_color_t buf[LV_BUFF_SIZE];

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

  //Send colors
  for (uint16_t y = area->y1; y <= area->y2; y++) {
    for (uint16_t x = area->x1; x <= area->x2; x++) {
      display.drawPixel(x, y, color_p->full);
      color_p++;
    }
  }

  display.display();
  lv_disp_flush_ready(disp);
}

#if LV_USE_LOG != 0
void my_print(const char *buf) {
  Serial.printf(buf);
  Serial.flush();
}
#endif

static void gui_init() {
  lv_init();

#if LV_USE_LOG != 0
  lv_log_register_print_cb(my_print); /* register print function for debugging */
#endif

  lv_disp_draw_buf_init(&draw_buf, buf, NULL, LV_BUFF_SIZE);

  /*Initialize the display*/
  static lv_disp_drv_t disp_drv;
  lv_disp_drv_init(&disp_drv);
  /*Change the following line to your display resolution*/
  disp_drv.hor_res = SCREEN_WIDTH;
  disp_drv.ver_res = SCREEN_HEIGHT;
  disp_drv.flush_cb = my_disp_flush;
  disp_drv.draw_buf = &draw_buf;
  lv_disp_drv_register(&disp_drv);
}

static void oled_init() {
  Wire.begin(I2C_SDA, I2C_SCL);
  if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS, false, false)) {
    for (;;) {
      Serial.println(F("SSD1306 allocation failed"));
      delay(1000);
    };
  } else {
    Serial.println(F("SSD1306 allocation success"));
  }

  display.display();
  delay(2000);
  display.clearDisplay();
}

lv_obj_t *gui_page_create()
{
    lv_obj_t *root = lv_obj_create(NULL);
    lv_obj_set_size(root, SCREEN_WIDTH, SCREEN_HEIGHT);
    lv_obj_clear_flag(root, LV_OBJ_FLAG_SCROLLABLE);
    lv_obj_set_style_bg_color(root, lv_color_black(), LV_PART_MAIN);
    lv_obj_center(root);

    return root;
}

static void anim_x_cb(void * var, int32_t v)
{
    lv_obj_set_x((lv_obj_t*)var, v);
}

static void anim_size_cb(void * var, int32_t v)
{
    lv_obj_set_size((lv_obj_t*)var, v, v);
}

static void gui_test() {
    lv_obj_t * root = gui_page_create();

    //Label
    lv_obj_t * label = lv_label_create(root);
    lv_label_set_text( label, "Hello LVGL");
    lv_obj_set_style_text_color(label, lv_color_white(), LV_PART_MAIN);
    lv_obj_set_style_text_font(label, &lv_font_montserrat_10, LV_PART_MAIN);
    lv_obj_align( label, LV_ALIGN_TOP_MID, 0, 0 );

    //Button
    lv_obj_t * btn1 = lv_btn_create(root);
    lv_obj_set_size(btn1, LV_SIZE_CONTENT, LV_SIZE_CONTENT);
    lv_obj_align(btn1, LV_ALIGN_BOTTOM_MID, 0, 0);

    lv_obj_t* label1 = lv_label_create(btn1);
    lv_label_set_text(label1, "Btn");
    lv_obj_set_style_text_color(label1, lv_color_black(), LV_PART_MAIN);
    lv_obj_set_style_text_font(label1, &lv_font_montserrat_10, LV_PART_MAIN);
    lv_obj_center(label1);

    //Animation
    lv_obj_t * obj = lv_obj_create(root);
    lv_obj_set_style_bg_color(obj, lv_color_black(), LV_PART_MAIN);
    lv_obj_set_style_radius(obj, LV_RADIUS_CIRCLE, LV_PART_MAIN);

    lv_obj_align(obj, LV_ALIGN_LEFT_MID, 5, -5);

    lv_anim_t a;
    lv_anim_init(&a);
    lv_anim_set_var(&a, obj);
    lv_anim_set_values(&a, 5, 20);
    lv_anim_set_time(&a, 1000);
    lv_anim_set_playback_delay(&a, 100);
    lv_anim_set_playback_time(&a, 300);
    lv_anim_set_repeat_delay(&a, 500);
    lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE);
    lv_anim_set_path_cb(&a, lv_anim_path_ease_in_out);

    lv_anim_set_exec_cb(&a, anim_size_cb);
    lv_anim_start(&a);
    lv_anim_set_exec_cb(&a, anim_x_cb);
    lv_anim_set_values(&a, 5, 120);
    lv_anim_start(&a);

    lv_scr_load(root);

}

void setup() {
  Serial.begin(115200);
  delay(2000);
  Serial.println();

  //OLED初始化
  oled_init();

  //GUI初始化
  gui_init();

  gui_test();
}

void loop() {
  lv_timer_handler();
  delay(2);
  lv_tick_inc(2);
}
视频:






---

转载请注明本文标题和链接:《oled12864使用lvgl

分享到:

发表评论

路人甲 表情
看不清楚?点图切换 Ctrl+Enter快速提交