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

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