學習時間 : 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>
- Adafruit_SSD1306 物件名稱;
此指令將OLED的函示庫名稱,宣告成自己的物件名稱。
- 物件名稱.begin(SSD1306_SWITCHCAPVCC, 0x3D)
初始化OLED顯示模組,並設定掃I2C地址為0X3D。
- 物件名稱.display();
OLED模組顯示圖案或文字。
- 物件名稱.clearDisplay();
清空畫面圖案與文字。
- 物件名稱.drawPixel(10, 10, WHITE);
- 物件名稱.setTextSize(1);
設定OLED顯示模組的文字大小。
- 物件名稱.setTextColor(WHITE);
- 物件名稱.println("Hello, world!");
- 物件名稱.drawBitmap(30, 16, logo16_glcd_bmp, 16, 16, 1);
====================原理知識====================
以下解釋提供給有需要知道背後原理的人:
以下解釋提供給有需要知道背後原理的人:
OLED的驅動IC為SSD1306,它是一塊OLED通用的專用驅動器點陣圖形顯示系統。這個IC是專為共陰極型OLED面板設計。SSD1306嵌入了對比度控制,顯示記憶體和振盪器,減少了數量外部元件和功耗。 它具有256級亮度控制。 指令是通用MCU透過I2C或SPI介面發送。由於面積小的關係, 它適用於許多精緻型裝上的應用,例如MP3播放器和計算器等。
模組電路圖如下所示:
====================範例實作(一)====================
了解模組功能(原理)後,我們用以下範例來展示模組的功能:
目標:
目標:
(1) OLED螢幕上顯示 "Hello fayalab!"
接線:
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: 將文字顯示方式設定成黑底白字,如果黑白對換的話,會變成白底黑字,底下範例白底的部分顏色不均是因為顯示器利用掃描的方式透過視覺暫留顯示,手機相機由於沒有視覺暫留的現象,因此完整的呈現拍攝瞬間的影像。
Arduino_A5 ===> OLED顯示模組_CLK
(上傳程式前請記得下載[Adafruit_GFX]和下載[Adafruit_SSD1306]函示庫,解壓縮並複製整個資料夾到Arduino的Libraries資料夾)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Date: 2019/2/15 | |
// Faya-Nugget 範例程式(oled_1.ino) | |
// 單元:模組介紹-faya OLED顯示模組 | |
// 網址: https://fayalab.blogspot.com/2019/02/oled.html | |
// 目標 (1) 讓OLED顯示Hello fayalab! | |
// 接線: Arduino ==> faya OLED模組 | |
// A3 ==> RST | |
// A4 ==> Data | |
// A5 ==> CLK | |
#include <SPI.h> | |
#include <Wire.h> | |
#include <Adafruit_GFX.h> | |
#include <Adafruit_SSD1306.h> | |
#define SCREEN_WIDTH 128 // OLED display width, in pixels | |
#define SCREEN_HEIGHT 64 // OLED display height, in pixels | |
//OLED設定 | |
#define OLED_RESET A3 | |
Adafruit_SSD1306 faya_OLED(OLED_RESET); | |
//螢幕設定,定義顯示高度跟寬度 | |
void setup() { | |
faya_OLED.begin(SSD1306_SWITCHCAPVCC, 0x3D); // 宣告OLED物件,並設定I2C位址 = 0x3D | |
faya_OLED.clearDisplay(); //清除初始畫面,重新繪圖 | |
faya_OLED.setTextSize(2); //設置字體大小 | |
faya_OLED.setTextColor(WHITE, BLACK); //設置字體為白色,字體背景為黑色 | |
faya_OLED.setCursor(10, 10); //將游標移動第(x=10, y=10)位置 | |
faya_OLED.print("Hello"); //輸出文字 | |
faya_OLED.setCursor(24, 42); //將游標移動第(x=24, y=24)位置 | |
faya_OLED.print("fayalab!"); //輸出文字 | |
faya_OLED.display(); //顯示畫面 | |
} | |
void loop() { | |
} |
備註:
- 組譯前請先確認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的函式庫提供了五花八門的功能讓使用者呼叫,大家有需要的時候,可以參考此範例,例如畫線條,畫方形,畫圓圈等等....依樣畫葫蘆的修改使用,大家可以參考以下範例與結果。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Date: 2019/2/15 | |
// Faya-Nugget 範例程式(oled_2.ino) | |
// 單元:模組介紹-faya OLED顯示模組 | |
// 網址: https://fayalab.blogspot.com/2019/02/oled.html | |
// 目標 (1) 讓OLED顯示Hello fayalab! | |
// 接線: Arduino ==> faya OLED模組 | |
// A3 ==> RST | |
// A4 ==> Data | |
// A5 ==> CLK | |
#include <SPI.h> | |
#include <Wire.h> | |
#include <Adafruit_GFX.h> | |
#include <Adafruit_SSD1306.h> | |
#define SCREEN_WIDTH 128 // OLED display width, in pixels | |
#define SCREEN_HEIGHT 64 // OLED display height, in pixels | |
//OLED設定 | |
#define OLED_RESET A3 | |
Adafruit_SSD1306 faya_OLED(OLED_RESET); | |
//螢幕設定,定義顯示高度跟寬度 | |
void setup() { | |
faya_OLED.begin(SSD1306_SWITCHCAPVCC, 0x3D); // 宣告OLED物件,並設定I2C位址 = 0x3D | |
faya_OLED.clearDisplay(); //清除初始畫面,重新繪圖 | |
// 畫直線 | |
faya_OLED.drawLine(0, faya_OLED.height()/2, faya_OLED.width()-1, faya_OLED.height()/2, WHITE); | |
// 畫方形 | |
faya_OLED.drawRect(0, 0, faya_OLED.width()-1, faya_OLED.height()-1, WHITE); | |
// 畫圓形 | |
faya_OLED.drawCircle(faya_OLED.width()/2, faya_OLED.height()/2, 5, WHITE); | |
// 畫圓角方形 | |
faya_OLED.drawRoundRect(5, 5, faya_OLED.width()-11, faya_OLED.height()-11, faya_OLED.height()/10, WHITE); | |
// 畫三角形 | |
faya_OLED.drawTriangle(100,10, 90, 25, 110, 25, WHITE); | |
faya_OLED.setTextSize(2); //設置字體大小 | |
faya_OLED.setTextColor(WHITE, BLACK); //設置字體為白色,字體背景為黑色 | |
faya_OLED.setCursor(12, 10); //將游標移動第(x=10, y=10)位置 | |
faya_OLED.print("Hello"); //輸出文字 | |
faya_OLED.setCursor(20, 42); //將游標移動第(x=24, y=24)位置 | |
faya_OLED.print("fayalab!"); //輸出文字 | |
faya_OLED.display(); //顯示畫面 | |
} | |
void loop() { | |
} |
- OLED顯示模組的解析度比起其他顯示類的模組(例如16x2 LCD、串列四位數七字節顯示器)高上許多,當作品中需要一次顯示比較多的資訊時,此模組是一個不錯的選擇。
也歡迎大家在底下留言或到我們的粉絲團留言喔!
沒有留言:
張貼留言