Arduino通过u8g2库驱动OLED

2024-03-19 16:20
文章标签 驱动 arduino oled u8g2

本文主要是介绍Arduino通过u8g2库驱动OLED,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

示例ssd-1306

  • Arduino驱动OLED屏幕
      • 关于oled一二
      • oled有两种通讯方式
    • 一、u8g2库控制4线OLED屏幕
      • 引脚
      • 代码:
    • 二、u8g2库控制6线OLED屏幕
      • 引脚介绍:
      • 程序1(显示汉字):
      • 程序2:
    • 三、总结
    • 四、注意事项

Arduino驱动OLED屏幕

参考1:
0. Arduino驱动LED128X64 - U8g2 自定义中文字库_

  1. SPI通讯 + Arduino Uno + 六针 0.96 OLED + U8g2
  2. Arduino驱动OLED屏幕
  3. Arduino使用u8g2库函数驱动4线/6线OLED屏幕
  4. 深入学习Arduino u8g2 OLED库,一篇就够
  5. arduino OLED显示温度 ,二氧化碳,和空气质量,使用u8g2库(4线)
  6. arduino+u8g2库+OLED屏-U8glib库 增强版 U8G2库(6线)
  7. U8G2库官方测试程序,
  8. OLED显示屏与Arduino_蔚蓝慕的博客

常见的OLED通常有两种样式,如下图所示,分别是4线和6线控制

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

本人推荐u8g2这个库函数来控制,不管是4线还是6线都可以用u8g2这个库函数来控制。

关于oled一二

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

在这里插入图片描述
在坐标系中,左上角是原点,向右是X轴,向下是Y轴。

oled有两种通讯方式

只需要了解原理即可,不需要了解很深入。

I2C通讯:I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。

SPI通讯:SPI总线是一种4线总线,因其硬件功能很强,所以与SPI有关的软件就相当简单,使中央处理器(Central Processing Unit,CPU)有更多的时间处理其他事务。

一、u8g2库控制4线OLED屏幕

对于4线OLED,直接使用I2C通讯。(u8g2库)

引脚

OLED0.96 IIC模块使用IIC通信接口,只需要接4根线就可以完成OLED屏数据通信

  • VCC:电源正极(接5V电源)
  • GND:电源负极(接地)
  • SCL:IIC时钟信号线
  • SDA:IIC数据信号线

VCC接到开发板的5V电源引脚上,GND接到开发板GND引脚上,SCL和SDA需要根据不同的开发板引脚定义来接线Arduino – Wire 库 – 太极创客
在这里插入图片描述

代码:

用OLED模块显示英文用的最多,显示汉字、显示图片,这类不常用的。

#include <Arduino.h>
#include <U8g2lib.h>#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endifU8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0,SCL,SDA,U8X8_PIN_NONE);void setup(void) 
{u8g2.begin();
}void loop(void) 
{u8g2.clearBuffer();  //清除缓存         u8g2.setFont(u8g2_font_ncenB08_tr); u8g2.drawStr(0,10,"Hello World!");  u8g2.drawStr(0,20,"This is bro cainiao!");  u8g2.drawStr(0,30,"Welcome to U8G2!");  u8g2.sendBuffer();  //显示      delay(1000);  
}

二、u8g2库控制6线OLED屏幕

对于6线OLED,直接使用SPI通讯。(u8g2库)

六针oled屏没有CS接口,其在硬件中直接接地(只有一个SPI从机时,CS可以不使用);此外,Arduino发送指令和数据到 OLED,OLED 并不需要反馈任何数据。因此, OLED 模块是只有 MOSI(SDA)引脚,没 有 MISO 引脚的。

引脚介绍:

GND:电源地
VCC:2.2V~5.5V
SCL(D0):CLK 时钟 (高电平 2.2V~5.5V)
SDA(D1):MOSI 数据(高电平 2.2V~5.5V)
RST:复位(高电平 2.2V~5.5V)
D/C:数据/命令(高电平 2.2V~5.5V)

接线:颜色对颜色线连接。
在这里插入图片描述

U8G2_SSD1306_128X64_NONAME_1_4W_SW_SPI  u8g2 (U8G2_R0, /* clock=*/ 4, /* data=*/ 5, /* cs=*/ 3, /* dc=*/ 6, /* reset=*/ 7);    //这个定义脚代码细心看就懂了。

U8G2_R0 是一个参数: 指定大局显示的基本布局:

布局描述
U8G2_R0正常显示
U8G2_R190度顺时针旋转
U8G2_R2180度顺时针旋转
U8G2_R3270度顺时针旋转
U8G2_MIRROR正常显示镜像内容(v2.6.x版本以上使用) 注意:U8G2_MIRROR需要与setFlipMode()配搭使用.

U8G2支持的OLED控制芯片: https://github.com/olikraus/u8g2/wiki/gallery
不同芯片的不同脚定义代码: https://github.com/olikraus/u8g2/wiki/u8g2setupcpp

通过这段程序的定义,我们知道:
OLED模块上的 SCL 对应于 clock
OLED模块上的 SDA 对应于 data
OLED模块上的 RES 对应于 reset
OLED模块上的 DC 对应于 dc

其中CS不管,CS是应用在7线OLED屏幕上面的,用的少!((CS脚可以不接)

对于使用SPI通讯控制6线OLED,OLED与主控板的连线可以自定义,读者可以自己编辑。 但这些需要连接到数字IO 上面。

程序1(显示汉字):

/*PrintUTF8.inoUse the (Arduino compatible) u8g2 function "print"  to draw a text.Universal 8bit Graphics Library (https://github.com/olikraus/u8g2/)
*/#include <Arduino.h>
#include <U8g2lib.h>#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif/*U8g2lib Example Overview:Frame Buffer Examples: clearBuffer/sendBuffer. Fast, but may not work with all Arduino boards because of RAM consumptionPage Buffer Examples: firstPage/nextPage. Less RAM usage, should work with all Arduino boards.U8x8 Text Only Example: No RAM usage, direct communication with display controller. No graphics, 8x8 Text only.翻译:U8g2lib 示例概览:帧缓冲区示例:clearBuffer/sendBuffer。速度快,但由于占用 RAM,可能不适用于所有 Arduino 板页面缓冲区示例:firstPage/nextPage。内存占用较少,适用于所有 Arduino 板。U8x8 纯文本示例: 不使用 RAM,直接与显示控制器通信。无图形,仅 8x8 文本。
*/U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);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.setFontDirection(0);u8g2.clearBuffer();u8g2.setCursor(0, 15);u8g2.print("Hello World!");u8g2.setCursor(0, 40);u8g2.print("你好世界");		// Chinese "Hello World" u8g2.sendBuffer();delay(1000);
}

在这里插入图片描述

程序2:

#include <Arduino.h>
#include <SPI.h>
#include <U8g2lib.h>U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);void setup(void) 
{u8g2.begin();   //选择U8G2模式,或者U8X8模式
}void loop(void) 
{u8g2.clearBuffer();         // 清除内部缓冲区u8g2.setFont(u8g2_font_ncenB08_tr); // choose a suitable fontu8g2.drawStr(0,10,"Hello World!");  // write something to the internal memoryu8g2.drawStr(0,20,"This is EHANG!");  // write something to the internal memoryu8g2.drawStr(0,30,"Welcome to U8G2!");  // write something to the internal memoryu8g2.sendBuffer();          // transfer internal memory to the displaydelay(1000);  
}

效果图:
在这里插入图片描述

三、总结

网上很多类似这种的语法,个人建议不要这样使用,代码的移植性会很差的:不要按照此例程来书写!!!

void loop(void) {u8g2.firstPage();do {u8g2.setFont(u8g2_font_ncenB14_tr);u8g2.drawStr(0,15,"Hello World!");} while ( u8g2.nextPage() );delay(1000);
}

用Arduino控制OLED,就用U8G2这个库函数就可以了,直接点击“加载库”,就可以在IDE里面自行安装库函数的。

四、注意事项

使用上述例程就能达到显示多行英文的目的,如果读者做实验出现显示不全等现象,可能是:

U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);

这个引脚定义出了问题。关于如何定义,参考此篇文章:点击进入

前面的一串英文定义很讲究的**(U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI)**
显示不全,就去检查这个函数。

通过SPI通讯时,引脚可以自定义,但是需要接在数字引脚上;使用I2C通讯时,OLED上面的引脚必须要和开发板上面的I2C引脚对应起来接线!

这篇关于Arduino通过u8g2库驱动OLED的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/826569

相关文章

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

arduino ide安装详细步骤

​ 大家好,我是程序员小羊! 前言: Arduino IDE 是一个专为编程 Arduino 微控制器设计的集成开发环境,使用起来非常方便。下面将介绍如何在不同平台上安装 Arduino IDE 的详细步骤,包括 Windows、Mac 和 Linux 系统。 一、在 Windows 上安装 Arduino IDE 1. 下载 Arduino IDE 打开 Arduino 官网

驱动(RK3588S)第七课时:单节点设备树

目录 需求一、设备树的概念1、设备树的后缀名:2、设备树的语法格式3、设备树的属性(重要)4、设备树格式举例 二、设备树所用函数1、如何在内核层种获取设备树节点:2、从设备树上获取 gpio 口的属性3、获取节点上的属性只针对于字符串属性的4、函数读取 np 结点中的 propname 属性的值,并将读取到的 u32 类型的值保存在 out_value 指向的内存中,函数的返回值表示读取到的

驱动安装注册表指令

HKCR: HKEY_CLASSES_ROOT HKCU: HKEY_CURRENT_USER HKLM: HKEY_LOCAL_MACHINE HKU: HEKY_USER HER: 相对根键

UMDF驱动安装

VS2013 + WDF8.1,UMDF驱动选择User Mode Driver,不要选User Mode Driver 2.0,否则Win7安装有问题,如图 另外,在驱动安装时不要忘记WUDFUpdate_<主版本号><次版本号>.dll文件,具体文件名在INF中查找。此文件可在WDF的安装目录中找到。注意:在WDF的安装目录中会有3个WUDFUpdate_xxx.dll文件,x86,x6

电脑驱动分类

电脑驱动程序(驱动程序)是操作系统与硬件设备之间的桥梁,用于使操作系统能够识别并与硬件设备进行通信。以下是常见的驱动分类: 1. 设备驱动程序 显示驱动程序:控制显卡和显示器的显示功能,负责图形渲染和屏幕显示。 示例:NVIDIA、AMD 显示驱动程序。打印机驱动程序:允许操作系统与打印机通信,控制打印任务。 示例:HP、Canon 打印机驱动程序。声卡驱动程序:管理音频输入和输出,与声卡硬件

麒麟系统安装GPU驱动

1.nvidia 1.1显卡驱动 本机显卡型号:nvidia rtx 3090 1.1.1下载驱动 打开 https://www.nvidia.cn/geforce/drivers/ 也可以直接使用下面这个地址下载 https://www.nvidia.com/download/driverResults.aspx/205464/en-us/ 1.1.3安装驱动 右击,

windows10 卸载网络驱动以及重新安装

右键桌面此电脑的图标,点击管理,设备管理器—网络适配器,找到下图中的驱动(不同的系统或者显卡会导致网卡驱动名称与下图不一样,多为Realtek开头),右键选择卸载设备,然后重启电脑,系统会自动重新安装驱动 新电脑首次安装驱动: 根据主板厂家,比如华硕,进入华硕官网,点击服务支持,点击下载中心,选择型号,点击右侧驱动程序和工具软件,选择windows版本,下载相应的驱动,下载完之后在对应文件中找

笔记整理—内核!启动!—kernel部分(1)驱动与内核的关系

首先,恭喜完成了uboot部分的内容整理,其次补充一点,uboot第一部分和第二部分的工作不是一定的,在不同的版本中,可能这个初始化早一点,那个的又放在了第二部分,版本不同,造成的工作顺序不同,但终归是要完成基本内容初始化并传参给kernel的。         那么至于驱动与内核的关系,用一张图来说明最适合不过:         驱动位于OS层的中下层与硬件相接。驱动是内

读源码笔记--文件过滤驱动FileSpy第1篇 -- DriverEntry

今天只读FileSpy的DriverEntry,位于源文件:filespy.c。 // // 全局变量. // ULONG gFileSpyDebugLevel = DEFAULT_FILESPY_DEBUG_LEVEL; #if WINVER >= 0x0501 ULONG gFileSpyAttachMode = FILESPY_ATTACH_ALL_VOLUMES; #else ULON