Arduino使用u8g2库函数驱动4线/6线OLED屏幕(I2C/SPI通讯)附带库函数详解

话不多说,直接入正题:
常见的OLED通常有两种样式,如下图所示,分别是4线和6线控制
4线OLED屏幕
6线OLED屏幕
本人几乎浏览了网上所有关于控制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”,悟性高的读者,通过此例程可以显示任意英文。

#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库)

第一步,接线:

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 上面

第二步,上程序:

#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);  
}

效果图:
在这里插入图片描述
三、总结

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

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的控制,详见此文:点击进入

四、注意事项

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章