【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的使用步骤
- 初始化显示屏:根据具体的显示设备,设置U8g2库的初始化参数。
- 发送命令和数据:通过SPI、I2C或其他接口发送命令和数据到显示屏。
- 绘制图形和文本:使用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)》无法点亮解决办法