本文主要是介绍Arduino通过u8g2库驱动OLED,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
示例ssd-1306
- Arduino驱动OLED屏幕
- 关于oled一二
- oled有两种通讯方式
- 一、u8g2库控制4线OLED屏幕
- 引脚
- 代码:
- 二、u8g2库控制6线OLED屏幕
- 引脚介绍:
- 程序1(显示汉字):
- 程序2:
- 三、总结
- 四、注意事项
Arduino驱动OLED屏幕
参考1:
0. Arduino驱动LED128X64 - U8g2 自定义中文字库_
- SPI通讯 + Arduino Uno + 六针 0.96 OLED + U8g2
- Arduino驱动OLED屏幕
- Arduino使用u8g2库函数驱动4线/6线OLED屏幕
- 深入学习Arduino u8g2 OLED库,一篇就够
- arduino OLED显示温度 ,二氧化碳,和空气质量,使用u8g2库(4线)
- arduino+u8g2库+OLED屏-U8glib库 增强版 U8G2库(6线)
- U8G2库官方测试程序,
- 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_R1 | 90度顺时针旋转 |
U8G2_R2 | 180度顺时针旋转 |
U8G2_R3 | 270度顺时针旋转 |
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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!