话不多说,直接入正题:
常见的OLED通常有两种样式,如下图所示,分别是4线和6线控制
本人几乎浏览了网上所有关于控制OLED模块的教程,并都经过了项目实测:大力推荐u8g2这个库函数来控制,文章末尾给出了安装包,请自取(其余的库函数要么安装很费力,要么使用起来不友好,再个就是参考资料不齐全)
- 不管是4线还是6线都可以用u8g2这个库函数来控制,非常方便
在此,读者先熟悉两种通讯方式,这两种将用在控制OLED上,只需要了解原理即可,不需要了解很深入。
-
I2C通讯:I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。
-
SPI通讯:SPI总线是一种4线总线,因其硬件功能很强,所以与SPI有关的软件就相当简单,使中央处理器(Central Processing Unit,CPU)有更多的时间处理其他事务。
好戏开场啦!
一、u8g2库控制4线OLED屏幕
对于4线OLED,直接使用I2C通讯。(u8g2库)
第一步,接线:5V、GND大家都知道如何连接,另外两根SCL、SDA需要连接到Arduino指定的IO口上面,不能用户自定义。
SCL和SDA直接对应连接至开发板即可,SCL和SDA对应于哪两个IO,如下图所示:
第二步,上代码:
个人觉得用OLED模块显示英文用的最多,显示汉字、显示图片,这类不常用的,本文不介绍,文章末尾会给出链接,本文都是干货!下面给出让OLED显示“HELLO WORLE”,悟性高的读者,通过此例程可以显示任意英文。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include <Arduino.h> #include <U8g2lib.h> #ifdef U8X8_HAVE_HW_I2C #include <Wire.h> #endif U8G2_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库)
第一步,接线:
1 | U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); |
通过这段程序的定义,我们知道:
OLED模块上的 SCL 对应于 clock
OLED模块上的 SDA 对应于 data
OLED模块上的 RES 对应于 reset
OLED模块上的 DC 对应于 dc
其中CS不管,CS是应用在7线OLED屏幕上面的,用的少!
对于使用SPI通讯控制6线OLED,OLED与主控板的连线可以自定义,读者可以自己编辑。 但这些需要连接到数字IO 上面。
第二步,上程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #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 font u8g2.drawStr(0,10,"Hello World!"); // write something to the internal memory u8g2.drawStr(0,20,"This is EHANG!"); // write something to the internal memory u8g2.drawStr(0,30,"Welcome to U8G2!"); // write something to the internal memory u8g2.sendBuffer(); // transfer internal memory to the display delay(1000); } |
效果图:
三、总结
网上很多类似这种的语法,个人建议不要这样使用,代码的移植性会很差的:不要按照此例程来书写!!!
1 2 3 4 5 6 7 8 | 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库函数的语法,详见此文:点击进入!
关于4线OLED的控制,详见此文:点击进入
关于6线OLED的控制,详见此文:点击进入
四、注意事项
使用上述例程就能达到显示多行英文的目的,如果读者做实验出现显示不全等现象,可能是:
1 | 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引脚对应起来接线!
U8G2这个库功能强大,目前在github上超过1K star,1800次commit,可以说维护热度很高,读者大可放心使用。
详情请关注亿航创客官方抖音账号:EhangGroup