在Arduino世界中,图形界面的显示通常是一项关键的任务。为了简化这个过程,提高开发效率,许多库被开发出来,其中U8g2库就是其中之一。U8g2库是一个功能强大的图形库,为Arduino用户提供了简便而高效的图形界面解决方案。本文将介绍U8g2库的基本概念、特性以及如何在Arduino项目中使用它。
U8g2库是一款用于Arduino平台的图形库,旨在简化液晶显示器的驱动与控制。它支持各种显示器类型,包括液晶、OLED和其他一些图形显示设备。U8g2库的设计理念是提供一套通用的API,使用户能够方便地在不同类型的显示屏上创建图形界面。
多种显示器支持
U8g2库支持各种不同类型的显示器,包括但不限于LCD、OLED、LED等。这使得用户能够在不同项目中选择最适合的显示设备。
强大的文本和图形支持
U8g2库提供了丰富的文本和图形支持,使得用户能够轻松地在屏幕上显示文本、图标、图形等元素,实现更复杂的用户界面。
简单的API
U8g2库的API设计简单易用,使得即使是初学者也能迅速上手。通过一系列简单的函数调用,用户可以完成各种屏幕显示任务,而无需深入了解底层驱动的细节。
跨平台支持
U8g2库不仅支持Arduino平台,还可以在其他嵌入式平台上使用,这增加了其灵活性和可移植性。
使用U8g2库非常简单,只需按照以下步骤进行:
在Arduino IDE中,打开“工具”菜单,选择“管理库”,搜索U8g2并安装。
在你的Arduino项目中包含U8g2库的头文件,如下所示:
#include
选择你使用的显示器类型,并进行初始化。例如,如果你使用的是SSD1306 OLED屏,初始化代码如下:
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引脚。
通过U8g2库的函数,你可以在显示器上绘制文本、图形等。例如,显示“Hello, Arduino!”的代码如下:
u8g2.setFont(u8g2_font_ncenB14_tr);
u8g2.drawStr(0, 20, "Hello, Arduino!");
最后,使用下面的代码刷新显示:
u8g2.sendBuffer();
#include
// 使用 U8g2库 创建 OLED 对象
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
void setup() {
// 初始化 OLED 对象
u8g2.begin();
}
void loop() {
// 清空显示屏内容
u8g2.clearBuffer();
// 添加文本
u8g2.setFont(u8g2_font_ncenB08_tr);
u8g2.drawStr(0, 10, "Hello, ESP32!");
// 延时一段时间
delay(1000);
}
U8g2库提供了丰富的API,用于控制各种显示器并在屏幕上绘制文本、图形等元素。以下是U8g2库中一些常用的API:
U8G2
U8G2(display, rotation, [,reset [, clock, data, cs, dc, reset, cs1, cs2, cs3]])
初始化U8g2对象,其中display
表示所使用的显示器型号,rotation
表示显示器的旋转方向,其他参数是可选的,包括复位引脚、时钟引脚、数据引脚等。
setFont(font)
u8g2.setFont(font)
设置当前使用的字体,font
是一个字体对象,例如:u8g2_font_ncenB14_tr
。
drawStr(x, y, str)
u8g2.drawStr(x, y, str)
在指定位置(x, y)
上绘制字符串str
。
drawXBM(x, y, width, height, bitmap)
u8g2.drawXBM(x, y, width, height, bitmap)
在指定位置(x, y)
上绘制X BitMap(XBM)格式的图像,width
和height
是图像的宽度和高度,bitmap
是存储图像数据的数组。
drawLine(x1, y1, x2, y2)
u8g2.drawLine(x1, y1, x2, y2)
在屏幕上绘制一条直线,起始点为(x1, y1)
,终止点为(x2, y2)
。
drawFrame(x, y, width, height)
u8g2.drawFrame(x, y, width, height)
在指定位置(x, y)
上绘制一个矩形,width
和height
分别为矩形的宽度和高度。
clearBuffer()
u8g2.clearBuffer()
清空绘图缓冲区,但不清空屏幕。
sendBuffer()
u8g2.sendBuffer()
将绘图缓冲区的内容发送到屏幕,刷新显示。
firstPage()
, nextPage()
u8g2.firstPage();
do {
// 在这里添加你的显示内容
u8g2.setFont(u8g2_font_ncenB08_tr); // 设置字体
u8g2.drawStr(0, 10, "Hello, U8g2!"); // 在指定位置绘制文本
} while (u8g2.nextPage());
firstPage
用于开始绘制多页内容,nextPage
用于切换到下一页,这两个函数通常一起使用。
以上仅是U8g2库中一些常用的API,实际上库提供了更多的函数和选项,以满足不同场景下的需求。在使用时,可以参考U8g2库的文档和示例代码,深入了解每个函数的参数和用法。
在 U8g2 库中,多页绘制是通过 firstPage()
和 nextPage()
这两个函数来实现的。这种机制允许用户在每一页上绘制不同的内容,从而实现多页的显示效果。以下是关于如何多页绘制的详细步骤:
使用 firstPage()
函数初始化多页绘制。它会设置绘图指针并返回一个布尔值,表示是否有更多的页面需要绘制。
u8g2.firstPage(); // 初始化多页绘制
在 do-while
循环中,你可以在当前页面上绘制各种文本、图形等内容。这个循环会一直执行,直到 nextPage()
返回 false
,表示没有更多的页面需要绘制。
do {
// 在当前页面上绘制内容
// 绘制文本、图形等
} while (u8g2.nextPage()); // 如果还有更多的页面,继续下一页
使用 nextPage()
函数切换到下一页,然后在新的页面上绘制不同的内容。这个过程可以在一个大的 while
循环中重复,以实现连续多页的显示效果。
do {
// 在新的页面上绘制不同的内容
// 绘制文本、图形等
} while (u8g2.nextPage()); // 切换到下一页
下面是一个简单的例子,演示了如何使用 firstPage()
和 nextPage()
绘制两页不同的内容:
#include
U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
void setup() {
u8g2.begin(); // 初始化U8g2库
}
void loop() {
u8g2.firstPage(); // 初始化多页绘制
do {
// 在第一页上绘制内容
u8g2.setFont(u8g2_font_ncenB14_tr);
u8g2.drawStr(10, 20, "Page 1");
u8g2.drawCircle(64, 40, 10);
} while (u8g2.nextPage()); // 如果还有更多的页面,继续下一页
delay(1000); // 等待一秒钟
// 在这里可以绘制第二页的内容
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_ncenB14_tr);
u8g2.drawStr(10, 20, "Page 2");
u8g2.drawTriangle(40, 40, 80, 40, 60, 80);
} while (u8g2.nextPage());
delay(1000); // 等待一秒钟
}
在这个例子中,loop()
函数不断地在两个页面之间切换,每个页面上都绘制了不同的内容。这样就实现了基本的多页绘制效果。
#include
// 使用 U8g2库 创建 OLED 对象
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
void oledTask(void * pvParam) {
// 初始化 OLED 对象
u8g2.begin();
for (;;) {
// 清空显示屏内容
u8g2.clearBuffer();
// 添加文本
u8g2.setFont(u8g2_font_ncenB08_tr);
u8g2.drawStr(0, 10, "Hello, ESP32!");
u8g2.sendBuffer();
// 延时一段时间
vTaskDelay(1000);
}
}
void setup() {//setup运行在核心1
xTaskCreatePinnedToCore(oledTask,"OLED Task",1024*6,NULL,1,NULL,1);
vTaskDelete(NULL);
}
void loop() {
}
FreeRTOS 任务,负责控制 OLED 屏幕的显示。在一个无限循环中,首先清空显示屏的内容,然后添加一行文本,最后将缓冲区的内容发送到显示屏。任务会每隔 1000 毫秒(1秒)执行一次。
setup
函数中,使用 xTaskCreatePinnedToCore
函数创建了一个在核心 1 上运行的任务。创建任务后,调用 vTaskDelete(NULL)
使得 setup 函数结束时任务不会继续执行,这样单片机资源全部运作在oledTask
这个任务上