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

news2024/9/29 23:36:46

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这个任务上
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1407386.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp复选框 实现排他选项

选择了排他选项之后 复选框其他选项不可以选择 <view class"reportData" v-for"(val, index) in obj" :key"index"> <view v-if"val.type 3" ><u-checkbox-group v-model"optionValue" placement"colu…

web系统服务器监控检查

一、检查操作系统是否存在增减文件&#xff0c;是否有shell被上传 要检查操作系统是否存在增减文件或是否有shell被上传&#xff0c;您可以按照以下步骤进行操作&#xff1a; 文件完整性检查&#xff1a; 使用文件系统的完整性检查工具&#xff0c;例如fsck&#xff08;对于ext…

项目一:踏上Java开发之旅

文章目录 一、实战概述二、实战步骤任务1&#xff1a;安装配置JDK并开发第一个Java程序步骤一&#xff1a;安装JDK步骤二&#xff1a;配置JDK环境变量步骤三&#xff1a;开发第一个Java程序 课堂练习任务1、打印个人信息任务2、打印直角三角形任务3、打印一颗爱心任务4、打印史…

git:使用git rebase合并多次commit为一个

git log&#xff1a;找到需要合并的最早 commit 的父级 git rebase -i 73a5cd8597除第一个 pick 外&#xff0c;将其它改成 s&#xff0c;改完后保存退出 保存完后弹出 commit message 合并提示&#xff0c;根据这次合并的目的&#xff0c;重写commit message&#xff0c;改完后…

软考复习之软件工程篇

软件生命周期 问题定义&#xff1a;要示系统分析员与用户进行交流&#xff0c;弄清”用户需要计算机解决什么问题”然后提出关于“系统目标与范围的说明”&#xff0c;提交用户审查和确认 可行性研究&#xff1a;一方面在于把待开发的系统的目标以明确的语言描述出来&#xf…

httpClient忽略https的证书认证

忽略https证书认证代码: /*** 创建模拟客户端&#xff08;针对 https 客户端禁用 SSL 验证&#xff09;* return* throws Exception*/public static CloseableHttpClient createHttpClientWithNoSsl() throws Exception {// Create a trust manager that does not validate cer…

【C++】初步认识基于C的优化

C祖师爷在使用C语言时感觉到了不方便的一些点&#xff0c;于是一步一步改进优化&#xff0c;最后形成了C 本文将盘点一下基于C的语法优化 目录 命名空间&#xff1a;命名空间定义&#xff1a;命名空间使用&#xff1a; C输入&输出&#xff1a;cout&#xff1a;endl&#…

司铭宇老师:门店服装销售技巧培训:卖衣服销售方法和技巧

门店服装销售技巧培训&#xff1a;卖衣服销售方法和技巧 在服装零售行业&#xff0c;销售方法和技巧对于提升销售业绩和增强顾客满意度至关重要。一个成功的销售人员需要掌握如何吸引顾客、如何展示商品、如何促成交易等多方面的技能。以下是关于卖衣服的销售方法和技巧的详细…

ai智能写作软件有分享吗?分享4款解放双手的软件!

随着人工智能技术的不断发展&#xff0c;AI智能写作软件逐渐成为内容创作者们的新宠。这些软件不仅能够帮助我们快速生成高质量的文本内容&#xff0c;还能在优化搜索引擎排名等方面发挥重要作用。本文将为大家介绍几款常用的AI智能写作软件&#xff0c;让您轻松提升内容创作效…

如何在飞书创建企业ChatGPT智能问答助手应用并实现公网远程访问(1)

文章目录 前言环境列表1.飞书设置2.克隆feishu-chatgpt项目3.配置config.yaml文件4.运行feishu-chatgpt项目5.安装cpolar内网穿透6.固定公网地址7.机器人权限配置8.创建版本9.创建测试企业10. 机器人测试 前言 在飞书中创建chatGPT机器人并且对话&#xff0c;在下面操作步骤中…

Unity | 渡鸦避难所-8 | URP 中利用 Shader 实现角色受击闪白动画

1. 效果预览 当角色受到攻击时&#xff0c;为了增加游戏的视觉效果和反馈&#xff0c;可以添加粒子等动画&#xff0c;也可以使用 Shader 实现受击闪白动画&#xff1a;受到攻击时变为白色&#xff0c;逐渐恢复为正常颜色 本游戏中设定英雄受击时播放粒子效果&#xff0c;怪物…

pytorch实战-6手写数字加法机-迁移学习

1 概述 迁移学习概念&#xff1a;将已经训练好的识别某些信息的网络拿去经过训练识别另外不同类别的信息 优越性&#xff1a;提高了训练模型利用率&#xff0c;解决了数据缺失的问题&#xff08;对于新的预测场景&#xff0c;不需要大量的数据&#xff0c;只需要少量数据即可…

IP代理可以保护信息安全吗?

“随着互联网的普及和发展&#xff0c;网络安全问题已经成为众多企业和个人所面临的严峻挑战。保护信息安全已成为企业的核心竞争力之一&#xff0c;而IP代理正成为实现这一目标的有效手段。” 一、IP代理真的可以保护用户信息安全吗&#xff1f; IP代理作为一种网络工具&…

CSS基本知识总结

目录 一、CSS语法 二、CSS选择器 三、CSS样式表 1.外部样式表 2.内部样式表 3.内联样式 四、CSS背景 1.背景颜色&#xff1a;background-color 2.背景图片&#xff1a;background-image 3.背景大小&#xff1a;background-size 4.背景图片是否重复&#xff1a;backg…

鸿蒙应用开发学习:获取手机位置信息

一、前言 移动应用中经常需要获取设备的位置信息&#xff0c;因此在鸿蒙应用开发学习中&#xff0c;如何获取手机的位置信息是必修课。之前我想偷懒从别人那里复制黏贴代码&#xff0c;于是在百度上搜了一下&#xff0c;可能是我输入的关键字不对&#xff0c;结果没有找到想要…

离线编译 onnxruntime-with-tensortRT

记录为centos7的4090开发机离线编译onnxruntime的过程&#xff0c;因为在离线的环境&#xff0c;所以踩了很多坑。 https://onnxruntime.ai/docs/execution-providers/TensorRT-ExecutionProvider.html 这里根据官网的推荐安装1.15 版本的onnx 因为离线环境&#xff0c;所以很…

10个常考的前端手写题,你全都会吗?(下)

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 今天接着上篇再来分享一下10个常见的JavaScript手写功能。 目录 1.实现继承 ES5继…

【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏2(附项目源码)

本节最终效果演示 文章目录 本节最终效果演示系列目录前言添加小动物模型动画动物AI脚本效果 添加石头石头模型拾取物品效果 源码完结 系列目录 【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏1&#xff08;附项目源码&#xff09; 【制作100个unity游戏之23】…

卓振江:我的大数据能力提升之路 | 提升之路系列(二)

导读 为了发挥清华大学多学科优势&#xff0c;搭建跨学科交叉融合平台&#xff0c;创新跨学科交叉培养模式&#xff0c;培养具有大数据思维和应用创新的“π”型人才&#xff0c;由清华大学研究生院、清华大学大数据研究中心及相关院系共同设计组织的“清华大学大数据能力提升项…

x-cmd pkg | perl - 具有强大的文本处理能力的通用脚本语言

目录 介绍首次用户技术特点竞品进一步阅读 介绍 Perl 是一种动态弱类型编程语言。Perl 内部集成了正则表达式的功能&#xff0c;以及巨大的第三方代码库 CPAN;在处理文本领域,是最有竞争力的一门编程语言之一 生态系统&#xff1a;综合 Perl 档案网络 (CPAN) 提供了超过 25,0…