Arduino U8g2库:图形界面库的强大利器,

本文介绍了U8g2库,一款强大的图形界面库,专为Arduino平台设计,支持多种显示设备。文章详细讲解了U8g2库的原理、特性、安装方法,以及如何在项目中使用它进行文本和图形显示,包括多页绘制和FreeRTOS集成示例。
摘要由CSDN通过智能技术生成

Arduino U8g2库:图形界面库的强大利器

介绍

在Arduino世界中,图形界面的显示通常是一项关键的任务。为了简化这个过程,提高开发效率,许多库被开发出来,其中U8g2库就是其中之一。U8g2库是一个功能强大的图形库,为Arduino用户提供了简便而高效的图形界面解决方案。本文将介绍U8g2库的基本概念、特性以及如何在Arduino项目中使用它。

什么是U8g2库?

U8g2库是一款用于Arduino平台的图形库,旨在简化液晶显示器的驱动与控制。它支持各种显示器类型,包括液晶、OLED和其他一些图形显示设备。U8g2库的设计理念是提供一套通用的API,使用户能够方便地在不同类型的显示屏上创建图形界面。

U8g2库的特性

  1. 多种显示器支持
    U8g2库支持各种不同类型的显示器,包括但不限于LCD、OLED、LED等。这使得用户能够在不同项目中选择最适合的显示设备。

  2. 强大的文本和图形支持
    U8g2库提供了丰富的文本和图形支持,使得用户能够轻松地在屏幕上显示文本、图标、图形等元素,实现更复杂的用户界面。

  3. 简单的API
    U8g2库的API设计简单易用,使得即使是初学者也能迅速上手。通过一系列简单的函数调用,用户可以完成各种屏幕显示任务,而无需深入了解底层驱动的细节。

  4. 跨平台支持
    U8g2库不仅支持Arduino平台,还可以在其他嵌入式平台上使用,这增加了其灵活性和可移植性。

如何使用U8g2库?

使用U8g2库非常简单,只需按照以下步骤进行:

步骤1:安装U8g2库

在Arduino IDE中,打开“工具”菜单,选择“管理库”,搜索U8g2并安装。

步骤2:包含U8g2头文件

在你的Arduino项目中包含U8g2库的头文件,如下所示:

#include <U8g2lib.h>

步骤3:初始化显示器

选择你使用的显示器类型,并进行初始化。例如,如果你使用的是SSD1306 OLED屏,初始化代码如下:

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

注意:你会看到 U8G2_SSD1306_128X64_NONAME_F_HW_I2C 的构造函数中没有明确指定SDASCL引脚,这是因为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引脚。

步骤4:使用U8g2库函数进行屏幕操作

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

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

步骤5:刷新显示

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

u8g2.sendBuffer();

基本例程

#include <U8g2lib.h>
// 使用 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);
}

效果展示:

请添加图片描述

常用API

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

1. 初始化

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

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

2. 字体设置

setFont(font)
u8g2.setFont(font)

设置当前使用的字体,font是一个字体对象,例如:u8g2_font_ncenB14_tr

3. 显示文本

drawStr(x, y, str)
u8g2.drawStr(x, y, str)

在指定位置(x, y)上绘制字符串str

4. 绘制图像

drawXBM(x, y, width, height, bitmap)
u8g2.drawXBM(x, y, width, height, bitmap)

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

5. 画线

drawLine(x1, y1, x2, y2)
u8g2.drawLine(x1, y1, x2, y2)

在屏幕上绘制一条直线,起始点为(x1, y1),终止点为(x2, y2)

6. 画矩形

drawFrame(x, y, width, height)
u8g2.drawFrame(x, y, width, height)

在指定位置(x, y)上绘制一个矩形,widthheight分别为矩形的宽度和高度。

7. 清屏

clearBuffer()
u8g2.clearBuffer()

清空绘图缓冲区,但不清空屏幕。

8. 刷新显示

sendBuffer()
u8g2.sendBuffer()

将绘图缓冲区的内容发送到屏幕,刷新显示。

9. 滚动

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() 这两个函数来实现的。这种机制允许用户在每一页上绘制不同的内容,从而实现多页的显示效果。以下是关于如何多页绘制的详细步骤:

1. 初始化多页绘制

使用 firstPage() 函数初始化多页绘制。它会设置绘图指针并返回一个布尔值,表示是否有更多的页面需要绘制。

u8g2.firstPage();  // 初始化多页绘制

2. 在当前页面上绘制内容

do-while 循环中,你可以在当前页面上绘制各种文本、图形等内容。这个循环会一直执行,直到 nextPage() 返回 false,表示没有更多的页面需要绘制。

do {
    // 在当前页面上绘制内容
    // 绘制文本、图形等

} while (u8g2.nextPage());  // 如果还有更多的页面,继续下一页

3. 在下一页上绘制内容

使用 nextPage() 函数切换到下一页,然后在新的页面上绘制不同的内容。这个过程可以在一个大的 while 循环中重复,以实现连续多页的显示效果。

do {
    // 在新的页面上绘制不同的内容
    // 绘制文本、图形等

} while (u8g2.nextPage());  // 切换到下一页

示例代码

下面是一个简单的例子,演示了如何使用 firstPage()nextPage() 绘制两页不同的内容:

#include <U8g2lib.h>

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); // 等待一秒钟
}

效果演示

请添加图片描述
U8g2多页绘制项目地址

在这个例子中,loop() 函数不断地在两个页面之间切换,每个页面上都绘制了不同的内容。这样就实现了基本的多页绘制效果。

使用freeRTOS运行

#include <U8g2lib.h>
// 使用 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这个任务上
在这里插入图片描述

Arduino与ESP8266之间进行通信可以使用多种方式,其中一种常见的方式是使用串口通信。你可以将ESP8266连接到Arduino的串口引脚(如D1和D2),然后使用Arduino的Serial来进行通信。以下是一个简单的示例代码: ```cpp #include <SoftwareSerial.h> SoftwareSerial espSerial(D1, D2); // 设置ESP8266的串口引脚 void setup() { Serial.begin(9600); // 初始化Arduino的串口 espSerial.begin(9600); // 初始化ESP8266的串口 } void loop() { if (espSerial.available()) { char c = espSerial.read(); Serial.print(c); // 将ESP8266接收到的数据发送到Arduino的串口 } if (Serial.available()) { char c = Serial.read(); espSerial.print(c); // 将Arduino接收到的数据发送到ESP8266的串口 } } ``` 在这个示例中,我们使用了SoftwareSerial来创建一个虚拟的串口对象espSerial,将ESP8266连接到Arduino的D1和D2引脚。然后在主循环中,我们检查ESP8266和Arduino的串口是否有数据可用,如果有,就进行相应的读取和发送操作。 请注意,以上只是一个简单的示例,实际的通信可能需要更复杂的协议和逻辑。具体的通信方式还取决于你的应用需求和硬件连接。 #### 引用[.reference_title] - *1* [Arduino为什么无法用u8g2驱动12864OLED屏?求找出错误](https://blog.csdn.net/weixin_39805387/article/details/111733564)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宁子希

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值