2019年2月19日 星期二

模組介紹 : faya OLED顯示模組




學習目標 : 認識faya OLED顯示模組的功能及使用方式
學習時間 : 70 min
示範模組 : (1) fayaduino Nano
                   (2) faya OLED顯示模組


====================功能介紹====================
faya OLED顯示模組的解析度為128 x 64 像素,透過I2C或SPI的接線,就能從Arduino的函式庫下指令畫出圖形與印出文字,並可以自由變化字體大小,下一段僅解釋範例中用到的指令,更多的函示庫指令用法可參考官方說明


介紹指令前,先看一下faya OLED顯示模組的外觀,它的左邊有五個埠,分別是CLK、Data、RST、CS、D/C。右邊的短路夾用來選擇通訊方式,當使用I2C介面時J1、J2需短路,當使用SPI介面時,J1、J2需斷路 (不要連接),圖中由於J1、J2是短路的,因此使用的通訊界面為I2C (位址為0x3D)

接下來介紹使用指令
  • #include <Adafruit_GFX.h> 
引入圖形文字的函示庫。
  • #include <Adafruit_SSD1306.h> 
引入OLED的函示庫。
  • #include <SPI.h> 
引入SPI函式,讓Arduino打開SPI的通訊界面。
  • #include <Wire.h> 
          引入I2C介面,讓Arduino打開I2C的通訊界面。
  • Adafruit_SSD1306 物件名稱; 
此指令將OLED的函示庫名稱,宣告成自己的物件名稱。
  • 物件名稱.begin(SSD1306_SWITCHCAPVCC, 0x3D)
初始化OLED顯示模組,並設定掃I2C地址為0X3D。
  • 物件名稱.display(); 
OLED模組顯示圖案或文字。
  • 物件名稱.clearDisplay(); 
清空畫面圖案與文字。
  • 物件名稱.drawPixel(10, 10, WHITE); 
          畫出像素在座標10,10顏色為白。
  • 物件名稱.setTextSize(1); 
設定OLED顯示模組的文字大小。
  • 物件名稱.setTextColor(WHITE); 
          設定OLED顯示模組的顏色。
  • 物件名稱.println("Hello, world!"); 
          設定OLED顯示模組印出Hello, world!的字樣。
  • 物件名稱.drawBitmap(30, 16,  logo16_glcd_bmp, 16, 16, 1); 
          OLED模組畫出點陣圖。

====================原理知識====================
以下解釋提供給有需要知道背後原理的人:

OLED的驅動IC為SSD1306,它是一塊OLED通用的專用驅動器點陣圖形顯示系統。這個IC是專為共陰極型OLED面板設計。SSD1306嵌入了對比度控制,顯示記憶體和振盪器,減少了數量外部元件和功耗。 它具有256級亮度控制。 指令是通用MCU透過I2C或SPI介面發送。由於面積小的關係, 它適用於許多精緻型裝上的應用,例如MP3播放器和計算器等。

模組電路圖如下所示:


====================範例實作(一)====================
了解模組功能(原理)後,我們用以下範例來展示模組的功能:

目標:
(1) OLED螢幕上顯示 "Hello fayalab!"

接線:
(1) 電源線連接如下圖所示,連接的說明請看這篇文章簡易版


(2) 訊號線連接
                   Arduino_A3 ===> OLED顯示模組_RST
                   Arduino_A4 ===> OLED顯示模組_Data
                   Arduino_A5 ===> OLED顯示模組_CLK


範例程式:
(上傳程式前請記得下載[Adafruit_GFX]和下載[Adafruit_SSD1306]函示庫,解壓縮並複製整個資料夾到Arduino的Libraries資料夾)


備註:
- 組譯前請先確認Adafruit_SSD1306函式庫底下的Adafruit_SSD1306.h檔案裏面螢幕大小的設定是否和一致,由於我們用的是128x64像素的顯示器,因此第28行的 #define SSD1306_128_64不能標註,第29和30行所定義的另外兩個解析度則要標註起來,如下圖所示




- 在OLED上顯示文字的順序和16x2的LCD模組很類似,首先定義游標位置,然後告知要顯示那些字串,但由於OLED的解析度較高,有足夠的空先可以設定字型大小,因此在程式中需要宣告,否則系統將會以字型大小預設值1來顯示。另外,我們可以在顯示中設定白底黑字或黑底白字,這是和LCD模組不同的地方。

- L29: 設定字型大小,1代表每個點以1像素為單位,2代表每個點以2像素為單位,3代表每個點以3像素為單位,從驚嘆號下面的圈圈可以看出像素與字型大小的關係:
字型大小設為1時,用1個像素 (1x1)顯示圈圈
字型大小設為2時,用4個像素 (2x2)顯示圈圈
字型大小設為3時,用9個像素 (3x3)顯示圈圈


- L30: 將文字顯示方式設定成黑底白字,如果黑白對換的話,會變成白底黑字,底下範例白底的部分顏色不均是因為顯示器利用掃描的方式透過視覺暫留顯示,手機相機由於沒有視覺暫留的現象,因此完整的呈現拍攝瞬間的影像。


- L41 游標位置,此顯示器的解析度為128x64像素,X的座標的可設定範圍為 0~127,Y座標的可設定範圍為 0~63。

範例結果:


====================範例實作(二)====================
目標:
(1) 透過函式庫內建的範例,直接顯示函式的各項功能

接線:
(1) 電源線連接 : 和範例實作(一)相同
(2) 訊號線連接 : 和範例實作(一)相同

範例程式:

直接在[Examples]資料匣選取範例,如下圖所示,選到範例後,可直接下載與執行觀看其結果功能。


範例結果:


討論:
  • Adafruit的函式庫提供了五花八門的功能讓使用者呼叫,大家有需要的時候,可以參考此範例,例如畫線條,畫方形,畫圓圈等等....依樣畫葫蘆的修改使用,大家可以參考以下範例與結果。
     
  • OLED顯示模組的解析度比起其他顯示類的模組(例如16x2 LCD、串列四位數七字節顯示器)高上許多,當作品中需要一次顯示比較多的資訊時,此模組是一個不錯的選擇。

    也歡迎大家在底下留言或到我們的粉絲團留言喔!
    ====================================

    沒有留言:

    張貼留言