【esp32 学习笔记】入门 Arduino框架 u8g2库(以OLED驱动芯片SSD1306为例)

图 文首图

〇、u8g2 简介

U8g2是一个用于嵌入式设备的单色图形库,全称为“Universal 8bit Graphics Library version2”。它由Oliver Kraus开发,专门为微控制器设计,用于驱动各种单色LCD和OLED显示屏。U8g2库支持多种不同的显示设备,包括各种尺寸和分辨率的显示屏。

U8g2库的特点包括:

  • 跨平台性:U8g2可以在不同的微控制器平台上运行,如Arduino、STM32、ESP32/ESP8266等
  • 多种显示支持:支持多种单色显示设备,包括LCD和OLED。
  • 字体支持:U8g2内置了多种字体,包括不同大小的字体和特殊字体(包括中文)
  • 易用性:U8g2的API设计简单易用,方便开发者快速上手。
  • 低内存占用:U8g2在设计中考虑到了嵌入式设备的资源限制,尽量减少了内存的使用。
  • 开源:U8g2是开源的,可以自由使用和修改。

U8g2的使用步骤

  1. 初始化显示屏:根据具体的显示设备,设置U8g2库的初始化参数。
  2. 发送命令和数据:通过SPI、I2C或其他接口发送命令和数据到显示屏。
  3. 绘制图形和文本:使用U8g2提供的函数,可以绘制点、线、矩形、圆等基本图形,以及显示文本。

一、常用API

U8g2库提供了丰富的API,用于控制各种显示器并在屏幕上绘制文本、图形等元素。以下是U8g2库中一些常用的API:

1. 初始化

U8G2(display, rotation, [,reset [, clock, data, cs, dc, reset, cs1, cs2, cs3]])

初始化U8g2对象,其中display表示所使用的显示器型号,rotation表示显示器的旋转方向,其他参数是可选的,包括复位引脚、时钟引脚、数据引脚等。

另外,对于不同的驱动芯片,不同的接口(SPI或者I2C, 硬件I2C还是模拟I2C),初始化的方式有所不同,如下图所示:

图 u8g2的初始化

2. 清屏

//清空绘图缓冲区,但不清空屏幕。
clearBuffer()
u8g2.clearBuffer()

3. 发送并刷新缓存

//将绘图缓冲区的内容发送到屏幕,刷新显示。
u8g2.sendBuffer()

 4. 字体设置和显示文本

u8g2.setFont(font)// 设置当前使用的字体,font是一个字体对象,例如:u8g2_font_ncenB14_tr。
u8g2.drawStr(x, y, str)//在指定位置(x, y)上绘制字符串str。
u8g2.drawUTF8(x,y, str );//在指定位置(x, y)上绘制 utf8 编码的字符串str(可显示汉字)。

5. 画图形、线、矩形

u8g2.drawLine(x1, y1, x2, y2) //在屏幕上绘制一条直线,起始点为(x1, y1),终止点为(x2, y2)。
u8g2.drawFrame(x, y, width, height)//在指定位置(x, y)上绘制一个矩形,width和height分别为矩形的宽度和高度。

//在指定位置(x, y)上绘制X BitMap(XBM)格式的图像,width和height是图像的宽度和高度,bitmap是存储图像数据的数组。
u8g2.drawXBM(x, y, width, height, bitmap)

以上仅是U8g2库中一些常用的API,实际上库提供了更多的函数和选项,以满足不同场景下的需求。在使用时,可以参考U8g2库的文档和示例代码,深入了解每个函数的参数和用法。

二、使用 u8g2 的流程 & 简单例程

步骤1:安装U8g2库,并包含U8g2头文件

在Arduino IDE中,打开“工具”菜单,选择“管理库”,搜索U8g2并安装。在你的Arduino项目中包含U8g2库的头文件:#include <U8g2lib.h>

步骤2:初始化 OLED 显示参数和引脚

选择你使用的显示器类型,并进行初始化。例如,如果你使用的是SSD1306 OLED屏,并采用硬件I2C(且为Arduino 默认初始化代码如下:

U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

注意:你会看到 U8G2_SSD1306_128X64_NONAME_F_HW_I2C 的构造函数中没有明确指定SDA和SCL引脚,这是因为U8g2库默认使用了硬件I2C,并且根据不同的硬件平台,会自动使用默认的I2C引脚。例如,ESP32上的默认硬件I2C引脚为SDA:21,SCL:22。

如果你有特殊要求需要使用其他引脚,你可以在构造函数中指定具体的引脚,例如:

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ 22, /* data=*/ 21);
//注:clock 对应SCL引脚,data 对应SDA引脚。

另外,上面是硬件 I2C(包含字符HW),下面是SSD1306 的软件I2C的初始化语句。

#define BOARD_I2C_SCL   14
#define BOARD_I2C_SDA   4     

U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ BOARD_I2C_SCL, /* data=*/ BOARD_I2C_SDA, /* reset=*/ U8X8_PIN_NONE);  

步骤3:使用U8g2库函数进行绘制文本、图形

通过U8g2库的函数,你可以在显示器上绘制文本、图形等。例如,显示“Hello, Arduino!”的代码如下:

u8g2.setFont(u8g2_font_ncenB14_tr);
u8g2.drawStr(0, 20, "Hello, Arduino!");

步骤4:刷新显示(注意:不能少!!!否则无法显示!!前功尽弃)

最后,使用下面的代码刷新显示:

u8g2.sendBuffer();

完整简单例程(显示英文)如下:

#include <U8g2lib.h>
// 使用 U8g2库 创建 OLED 对象
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
//如果不使用默认的 SCL、SDA,请使用如下函数
//U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ 22, /* data=*/ 21);

void setup() {
  // 初始化 OLED 对象
  u8g2.begin();
}

void loop() {
  // 清空显示屏内容
  u8g2.clearBuffer();

  // 添加文本
  u8g2.setFont(u8g2_font_ncenB08_tr);
  u8g2.drawStr(0, 10, "Hello, ESP32!");
    
  //发送并刷新缓存
   u8g2.sendBuffer();
  
  // 延时一段时间
  delay(1000);
}

显示中文例程如下:

#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>

#define BOARD_I2C_SCL   14
#define BOARD_I2C_SDA   4      

void displayWelcome();
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ BOARD_I2C_SCL, /* data=*/ BOARD_I2C_SDA, /* reset=*/ U8X8_PIN_NONE);   // All Boards without Reset of the Display


void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  Serial.println("Init u8g2 ....");


  u8g2.setFont( u8g2_font_wqy12_t_gb2312 );//设置为中文字体
  u8g2.begin();
  u8g2.enableUTF8Print();
  displayWelcome();               /* 显示欢迎语,用于当前测试*/

  delay(100);
}

void loop() {
    Serial.println("u8g2 showing chars ....");
    delay(1000);
}


 
void displayWelcome() {
  char *str = "正在启动...";
  u8g2.clearBuffer();
  /* 将字符串显示在屏幕中央 */
  u8g2.drawUTF8( u8g2.getDisplayWidth() / 2 - u8g2.getUTF8Width( str ) / 2, u8g2.getDisplayHeight() / 2 + u8g2.getMaxCharHeight() / 2, str );
  u8g2.sendBuffer();
}

三、高级API----分页和滚动

主要是以下两个函数:

firstPage(), nextPage()

firstPage用于开始绘制多页内容,nextPage用于切换到下一页,这两个函数通常一起使用,如:

u8g2.firstPage();
  do {
    // 在这里添加你的显示内容
    u8g2.setFont(u8g2_font_ncenB08_tr); // 设置字体
    u8g2.drawStr(0, 10, "Hello, U8g2!"); // 在指定位置绘制文本
  } while (u8g2.nextPage());

 

 

 

参考文章:

0. 《基于STM32移植U8g2图形库——OLED显示(HAL库)》:https://blog.csdn.net/2301_77119177/article/details/139562778

1. 《Arduino U8g2库:图形界面库的强大利器》:https://blog.csdn.net/m0_60134435/article/details/135824311

2. 《esp32,esp8266使用金逸晨OLED(ssd1315)》无法点亮解决办法

posted @ 2024-06-13 17:34  FBshark  阅读(670)  评论(0编辑  收藏  举报