Bootstrap

olcd12864的u8g2库_玩转u8g2 OLED库,一篇就够

1.前言

????最近博主听到QQ群里面问得比较多的问题:

????“博哥,有玩过OLED吗?”

????“博哥,有试过在ESP8266上调成功过SSD1306吗?”

????“博哥,OLED上显示天气信息怎么弄?”

????........

????诸如此类的问题,在博主看来,无非都是对OLED库用法的不熟悉甚至不了解。Arduino OLED库众多,博主也曾经介绍过一款 《博哥OLED系列》- 玩转SSD1306-12864 OLED Adafruit_GFX 和 Adafruit_SSD1306库。但是,博主今天要介绍的是目前Arduino平台上使用最广泛的OLED库 —— U8G2库,也是很多初学者容易懵逼的一个第三方库。目前在github上超过1K star,1800次commit,可以说维护热度很高,读者大可放心使用。

????至于这个库为什么这么火爆,请读者认真看完本博文自行评价,博主只能说功能真的很好很强大!!!!

????那么,博主首先立个flag,阅读完本篇博文的最终效果——读者以后在Arduino平台上开发OLED项目的时候,可以考虑U8G2库,并且知道U8G2库的具体用法,甚至可以能够当做工具书来翻阅。

????进入正文之前,博主要给读者灌输两个个非常重要的知识点:

其一 像素点点阵

OLED其实就是一个M x n 的像素点阵,想显示什么就得把具体位置的像素点亮起来。对于每一个像素点,有可能是1点亮,也有可能是0点亮;

其二 坐标系

????在坐标系中,左上角是原点,向右是X轴,向下是Y轴。

????希望读者能仔细理解这两个知识点。

2.U8g2简介

2.1 U8g2是什么

????U8g2是嵌入式设备的单色图形库,一句话简单明了。主要应用于嵌入式设备,包括我们常见的单片机;

2.2 U8g2支持的显示控制器

????U8g2支持单色OLED和LCD,包括以下控制器:SSD1305,SSD1306,SSD1309,SSD1322,SSD1325,SSD1327,SSD1329,SSD1606,SSD1607,SH1106,SH1107,SH1108,SH1122,T6963,RA8835,LC7981,PCD8544,PCF8812,HX1230 ,UC1601,UC1604,UC1608,UC1610,UC1611,UC1701,ST7565,ST7567,ST7588,ST75256,NT7534,IST3020,ST7920,LD7032,KS0108,SED1520,SBN1661,IL3820,MAX7219(有关完整列表,请参见 此处)。

????可以说,基本上主流的显示控制器都支持,比如我们常见的SSD1306 12864,读者在使用该库之前请查阅自己的OLED显示控制器是否处于支持列表中。

2.2 U8g2支持的Arduino主板

????可以说基本上所有Arduino API的主板都得到U8g2的支持。包括:

Aruino Zero,Uno,Mega,Due,101,MKR Zero以及所有其他Arduino官方主板

基于Arduino平台的STM32

基于Arduino平台的ESP8266和ESP32

甚至其他不知名的基于Arduino平台的开发板

????所以说,读者完全不用担心兼容性问题,放心使用。

2.3 U8g2如何在Arduino平台上安装

????Arduino库U8g2可以从Arduino IDE的库管理器安装,读者在库管理器搜索“U8g2”关键字就可以下载安装:

????下载完毕,测试一下库是否安装成功:

#include

void setup() {

// put your setup code here, to run once:

}

void loop() {

// put your main code here, to run repeatedly:

}

????编译成功,证明你本地已经加载了U8G2库。

2.4 U8g2的优势

????为什么要运用U8g2库?也就是说U8g2库能带给我们什么样的开发便利。在博主看来,主要考虑几个方面:

U8g2库平台支持性好,基本上支持绝大部分Arduino开发板,特别也博主比较喜欢的ESP8266;

U8g2库显示控制器支持性好,基本上市面上的OLED都完美支持;

U8g2库 API众多,特别支持了中文,支持了不同字体,这是一个对于开发者俩说不小的福利。

????以下是官方提供的一些U8G2库测试图,博主挑选了几张常见的以及附上U8G2库的配置(读者可以先不用理会配置,等看完博文再次阅读就会了解含义):

ESP32 and SSD1306 OLED

U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2(U8G2_R2, /* clock=*/ 16, /* data=*/ 17, /* reset=*/ U8X8_PIN_NONE); // ESP32 Thing, pure SW emulated I2C

U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R2, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ 16, /* data=*/ 17); // ESP32 Thing, HW I2C with pin remapping

MAX7219 32x8 LED Matrix

U8G2_MAX7219_32X8_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 11, /* data=*/ 12, /* cs=*/ 10, /* dc=*/ U8X8_PIN_NONE, /* reset=*/ U8X8_PIN_NONE);

SSD1305 128x32

U8G2_SSD1305_128X32_NONAME_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);

SSD1306 128x32

U8X8_SSD1306_128X32_UNIVISION_SW_I2C u8x8(/* clock=A5*/ 19, /* data=A4*/ 18);

PCD8544 84x48 (Nokia 5110) LCD

U8G2_PCD8544_84X48_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Nokia 5110 Display

ST7920 128x64 LCD in 8080 parallel mode

U8G2_ST7920_128X64_1_8080 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 18 /* A4 */, /*cs=*/ U8X8_PIN_NONE, /*dc/rs=*/ 17 /* A3 */, /*reset=*/ 15 /* A1 */); // Remember to set R/W to 0

????这只是一些常见的显示器,可以说,已经足够覆盖到我们常见的范围了。

3.U8g2库详解

3.1 U8g2库百度脑图

老规则,先上一个图:

方法可以分为四大类:

基本函数

绘制相关函数

显示配置相关函数

缓存相关函数

3.2 U8g2库函数详解

3.2.1 基本函数

3.2.1.1 u8g2.begin() —— 构造U8G2

函数说明:

/**

* 初始化U8g2库

* @Note 关联方法 initDisplay clearDisplay setPowerSave

*/

bool U8G2::begin(void)

源码说明:

bool begin(void) {

/* note: call to u8x8_utf8_init is not required here, this is done in the setup procedures before */

initDisplay(); //初始化显示器

clearDisplay(); // 重置清屏

setPowerSave(0); //唤醒屏幕

return 1;

}

3.2.1.2 u8g2.beginSimple() —— 构造U8G2

函数说明:

/**

* 简单初始化U8g2库

* @Note 关联方法 beginSimple

*/

void U8G2::beginSimple(void);

源码说明:

void beginSimple(void) {

/* does not clear the display and does not wake up the display */

/* user is responsible for calling clearDisplay() and setPowerSave(0) */

initDisplay();//初始化显示器

}

注意点:

读者可以看到和begin()函数的区别,需要用户自行控制初始化过程,给了一定的自由度,不过博主建议大家还是直接用begin函数吧。

3.2.1.3 u8g2.initDisplay() —— 初始化显示控制器

函数说明:

/**

* 初始化显示控制器

*/

void U8G2::initDisplay(void)

注意点:

这个方法不需要我们单独调用,会在begin函数主动调用一次,我们主要理解即可,会在里面针对具体的OLED进行配置;

3.2.1.4 u8g2.clearDisplay() —— 清除屏幕内容

函数说明:

/**

* 清除屏幕

*/

void U8G2::clearDisplay(void)

注意点:

这个方法不需要我们单独调用,会在begin函数主动调用一次,我们主要理解即可;

不要在 firstPage 和 nextPage 函数之间调用该方法;

3.2.1.5 u8g2.setPowerSave() —— 是否开启省电模式

函数说明:

/**

* 清除显示缓冲区

* @param is_enable

* 1 表示启用显示器的省电模式,屏幕上看不到任何东西

* 0 表示禁用省电模式

*/

void U8G2::setPowerSave(uint8_t is_enable)

注意点:

不管是启用还是禁用,显示器需要的内存消耗是不会变的,说到底就是为了关闭屏幕,做到省电;

所以这里就可以理解为什么初始化需要 setPowerSave(0);

3.2.1.6 u8g2.clear() —— 清除操作

函数说明:

/**

* 清除屏幕显示,清除缓冲区,光标回到左上角原点位置(0,0)

* @Note 关联方法 home clearDisplay clearBuffer

*/

void U8G2::clear(void)

源码说明:

void clear(void) {

home(); //回到原点

clearDisplay(); //清除屏幕上的显示

clearBuffer(); //清除缓冲区

}

3.2.1.7 u8g2.clearBuffer() —— 清除缓冲区

函数说明:

/**

* 清除内存中数据缓冲区

*/

void U8G2::clearBuffer(void)

注意点:

一般这个函数是与sendBuffer函数配对使用,通常用法如下:

void loop(void) {

u8g2.clearBuffer();

// ... write something to the buffer

u8g2.sendBuffer();

delay(1000);

}

3.2.1.8 u8g2.disableUTF8Print() —— 禁用 UTF8打印

函数说明:

/**

* 禁用Arduino平台下支持输出UTF8字符集,默认是开启

*/

void U8G2::disableUTF8Print(void)

3.2.1.9 u8g2.enableUTF8Print() —— 启用 UTF8打印

函数说明:

/**

* 开启Arduino平台下支持输出UTF8字符集

*/

void U8G2::enableUTF8Print(void)

注意点:

我们的中文字符就是UTF8;

常见例子

void setup(void) {

u8g2.begin();

u8g2.enableUTF8Print(); // enable UTF8 support for the Arduino print() function

}

void loop(void) {

u8g2.setFont(u8g2_font_unifont_t_chinese2); // use chinese2 for all the glyphs of "你好世界"

u8g2.firstPage();

do {

u8g2.setCursor(0, 40);

u8g2.print("你好世界"); // Chinese "Hello World"

} while ( u8g2.nextPage() );

delay(1000);

}

3.2.1.10 u8g2.home() —— 重置显示光标的位置

函数说明:

/**

;