最近看到在網站上販售一個「黃藍雙色 OLED顯示幕 0.96寸 12864 IIC」,解析度 128*64,價格可以接受,就買一個來做相關的顯示用。螢幕是有點小,可是要顯示英文及數字,利用捲軸功能,大概夠用了,正好利用剛買的 NodeMCU來測試一下這個顯示器的功能。
這個雙色經過測試,不是面板所有位置都是顯示兩個顏色,而是上方約 20pixel 的位置是黃色,下方才是藍色的,感覺被雙色這個名詞所欺騙。
• OLED 顯示幕 0.96寸 12864 IIC x1
• 連接線 x 4條
執行程式前要先安裝兩個 Library:Adafruit_SSD1306 和 Adafruit-GFX-Library。安裝的方法有兩種:
方法一:透過 Arduino IDE畫面進行下載安裝
開啟Arduino IDE畫面,選擇 [草稿碼(Sketch)] → [匯入程式庫(Include Library)]→ [管理程式庫 (Manage Libraries...)] ,出現以下畫面,輸入Adafruit_SSD1306,找到該 Library 後,選擇版本,按下[安裝]即可,如以下畫面:(註:我用第二種方法安裝,版本為1.2.9)
同樣的畫面,輸入 Adafruit-GFX-Library,找到該 Library 後,選擇版本,按下[安裝]即可,如以下畫面:(註:我用第二種方法安裝,版本為1.5.1)
方法二:下載後複製檔案到 Library 目錄
到 Github 下載 Adafruit_SSD1306 壓縮檔,解壓縮後會看到 Adafruit_SSD1306-master 的目錄,更改檔名將 -master刪除後,複製放到 C:\Program Files (x86)\Arduino\libraries。
同樣的到 Github 下載 Adafruit-GFX-Library,解壓縮後會看到 Adafruit-GFX-Library-master的目錄,更改檔名將 -master刪除後,複製放到 C:\Program Files (x86)\Arduino\libraries。
程式範例三,有個瑪莉連夢露 Bitmap 的圖形,如果您有圖檔,可以上傳到 image2cpp,網址:http://javl.github.io/image2cpp/ ,製作 16 進位的 bitmap 點矩陣位元資訊檔。將檔案上傳後,設定成 128 x 64大小的黑白照片,再輸出為 Arduino Code,按下 [Generate Code]就可以看到點矩陣的位元資訊資料。
另一個方法是用小畫家縮小成 128 x64大小的圖,再另存新檔為 Monochrome Bitmap(.bmp)圖檔。再利用另一套工具 LCD assistant 轉成點矩陣的位元資訊資料。
程式二:圖形顯示
程式三:Bitmap 圖形顯示
程式二部分顯示結果:
程式三顯示結果:
這個雙色經過測試,不是面板所有位置都是顯示兩個顏色,而是上方約 20pixel 的位置是黃色,下方才是藍色的,感覺被雙色這個名詞所欺騙。
[材料]
• NodeMCU x 1• OLED 顯示幕 0.96寸 12864 IIC x1
• 連接線 x 4條
[接線圖]
OLED 12864 I2C | NodeMCU |
---|---|
1 – VCC | +3V |
2 – GND | GND |
3 – SCK | Pin D1 |
4 – SDA | Pin D2 |
執行程式前要先安裝兩個 Library:Adafruit_SSD1306 和 Adafruit-GFX-Library。安裝的方法有兩種:
方法一:透過 Arduino IDE畫面進行下載安裝
開啟Arduino IDE畫面,選擇 [草稿碼(Sketch)] → [匯入程式庫(Include Library)]→ [管理程式庫 (Manage Libraries...)] ,出現以下畫面,輸入Adafruit_SSD1306,找到該 Library 後,選擇版本,按下[安裝]即可,如以下畫面:(註:我用第二種方法安裝,版本為1.2.9)
同樣的畫面,輸入 Adafruit-GFX-Library,找到該 Library 後,選擇版本,按下[安裝]即可,如以下畫面:(註:我用第二種方法安裝,版本為1.5.1)
方法二:下載後複製檔案到 Library 目錄
到 Github 下載 Adafruit_SSD1306 壓縮檔,解壓縮後會看到 Adafruit_SSD1306-master 的目錄,更改檔名將 -master刪除後,複製放到 C:\Program Files (x86)\Arduino\libraries。
同樣的到 Github 下載 Adafruit-GFX-Library,解壓縮後會看到 Adafruit-GFX-Library-master的目錄,更改檔名將 -master刪除後,複製放到 C:\Program Files (x86)\Arduino\libraries。
[修改解析度]
這個顯示器有兩種模式:128 x 32跟 128 x 64,要修改顯示的解析度,可打開 C:\Program Files (x86)\Arduino\libraries\Adafruit_SSD1306 目錄下的 Adafruit_SSD1306.h 。如果是透過 Arduino IDE 的函式庫管理[ Manage Library]安裝的,會在 C:\Users\[username]\Documents\Arduino\libraries\Adafruit_SSD1306的目錄內。將 #define SSD1306_128_32 那一行,前面將上雙斜線,當作註解。將 #define SSD1306_128_64 這行的雙斜線刪除,如下圖,顯示就會變成 128 x 64的解析度。
程式範例三,有個瑪莉連夢露 Bitmap 的圖形,如果您有圖檔,可以上傳到 image2cpp,網址:http://javl.github.io/image2cpp/ ,製作 16 進位的 bitmap 點矩陣位元資訊檔。將檔案上傳後,設定成 128 x 64大小的黑白照片,再輸出為 Arduino Code,按下 [Generate Code]就可以看到點矩陣的位元資訊資料。
另一個方法是用小畫家縮小成 128 x64大小的圖,再另存新檔為 Monochrome Bitmap(.bmp)圖檔。再利用另一套工具 LCD assistant 轉成點矩陣的位元資訊資料。
[程式]
程式一:文字顯示#include <splash.h>#include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> Adafruit_SSD1306 display(-1); void setup() { // 設定 I2C addr 0x3C display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // 清除顯示緩衝區 display.clearDisplay(); // 顯示文字 display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,20); display.println("Hi!How are you!"); display.display(); delay(2000); display.clearDisplay(); // Display Inverted Text display.setTextColor(BLACK, WHITE); // 'inverted' text display.setCursor(0,20); display.println("Hello world!"); display.display(); delay(2000); display.clearDisplay(); // 改變字型大小 display.setTextColor(WHITE); display.setCursor(0,10); display.setTextSize(2); display.println("Hello!"); display.display(); delay(2000); display.clearDisplay(); // 顯示數字 display.setTextSize(1); display.setCursor(0,20); display.println(123456789); display.display(); delay(2000); display.clearDisplay(); // 顯示特殊字元 display.setCursor(0,20); display.print("0x"); display.print(0xFF, HEX); display.print("(HEX) = "); display.print(0xFF, DEC); display.println("(DEC)"); display.display(); delay(2000); display.clearDisplay(); // 顯示 ASCII 字元 display.setCursor(0,20); display.setTextSize(2); display.write(3); display.display(); delay(2000); display.clearDisplay(); // 捲動畫面 display.setCursor(0,0); display.setTextSize(1); display.println("Full"); display.println("screen"); display.println("scrolling!"); display.display(); display.startscrollright(0x00, 0x07); delay(2000); display.stopscroll(); delay(1000); display.startscrollleft(0x00, 0x07); delay(2000); display.stopscroll(); delay(1000); display.startscrolldiagright(0x00, 0x07); delay(2000); display.startscrolldiagleft(0x00, 0x07); delay(2000); display.stopscroll(); display.clearDisplay(); // 捲動部分螢幕 display.setCursor(0,0); display.setTextSize(1); display.println("scroll"); display.println("some part"); display.println("of the screen."); display.display(); display.startscrollright(0x00, 0x00); } void loop() {}
程式二:圖形顯示
#include <splash.h>#include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> Adafruit_SSD1306 display(-1); void setup() { // 設定 I2C addr 0x3C display.begin(SSD1306_SWITCHCAPVCC, 0x3C); } void loop() { // 畫空心方形 display.clearDisplay(); display.setTextColor(WHITE); display.setCursor(0,0); display.println("Rectangle"); display.drawRect(0, 15, 60, 40, WHITE); display.display(); delay(2000); // 畫填滿的方形 display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); display.println("Filled Rectangle"); display.fillRect(0, 15, 60, 40, WHITE); display.display(); delay(2000); //圓角空心方形 display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); display.println("Round Rectangle"); display.drawRoundRect(0, 15, 60, 40, 8, WHITE); display.display(); delay(2000); //圓角實心方形 display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); display.println("Filled Round Rectangl"); display.fillRoundRect(0, 15, 60, 40, 8, WHITE); display.display(); delay(2000); //畫空心圓 display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); display.println("Circle"); display.drawCircle(20, 35, 20, WHITE); display.display(); delay(2000); //畫實心圓 display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); display.println("Filled Circle"); display.fillCircle(20, 35, 20, WHITE); display.display(); delay(2000); display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); display.println("Triangle"); display.drawTriangle(30, 15, 0, 60, 60, 60, WHITE); display.display(); delay(2000); //畫實心三角形 display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); display.println("Filled Triangle"); display.fillTriangle(30, 15, 0, 60, 60, 60, WHITE); display.display(); delay(2000); }
程式三:Bitmap 圖形顯示
#include <splash.h>#include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> // 瑪莉連夢露影像 const unsigned char MarilynMonroe [] PROGMEM = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x1f, 0xff, 0xff, 0xf0, 0x41, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x7f, 0xff, 0xff, 0xf8, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0xf8, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xfc, 0x02, 0x78, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x3f, 0xff, 0xff, 0xfe, 0x03, 0x7c, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x07, 0xff, 0xff, 0xfe, 0x01, 0xfe, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xe0, 0x03, 0xff, 0xff, 0xfc, 0x00, 0xfe, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0xe0, 0xff, 0xff, 0xfc, 0x00, 0x06, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xf9, 0xff, 0xff, 0xfc, 0x00, 0x02, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xfc, 0x00, 0xc3, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xe0, 0x0c, 0x00, 0xe7, 0x81, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0f, 0xff, 0xff, 0xe0, 0x02, 0x00, 0x02, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0f, 0xff, 0xff, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x3f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x1e, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0x3f, 0xf8, 0x00, 0x18, 0x7f, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x01, 0x80, 0x03, 0xfc, 0x3f, 0xfc, 0x00, 0x70, 0xfe, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x43, 0xff, 0xff, 0xf8, 0x7f, 0xf8, 0x00, 0x00, 0x7e, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xf0, 0xff, 0xfc, 0x00, 0x00, 0x7c, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0xf1, 0xef, 0xf8, 0x00, 0x01, 0xfc, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0xff, 0xff, 0xff, 0xf3, 0x80, 0xa0, 0x00, 0x07, 0xfc, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0x5f, 0xff, 0xff, 0xe7, 0xf0, 0x00, 0x00, 0x03, 0xfe, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xee, 0x7f, 0xff, 0xff, 0xc7, 0xf8, 0x00, 0x00, 0x03, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xf7, 0xc7, 0xff, 0x06, 0x00, 0x03, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x5f, 0xff, 0xc7, 0x07, 0xff, 0x80, 0x00, 0x07, 0xdb, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, 0x80, 0x03, 0xff, 0xc0, 0x00, 0x03, 0xc3, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x98, 0x03, 0xff, 0xf8, 0x00, 0x07, 0xe0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xfc, 0x01, 0x07, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xef, 0xff, 0xff, 0xe1, 0xff, 0xfc, 0x01, 0x07, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0x7f, 0xf1, 0xff, 0xf8, 0x02, 0x07, 0x88, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xef, 0xf8, 0x0f, 0xff, 0xff, 0xe0, 0x00, 0x07, 0x84, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xef, 0xf0, 0x04, 0x7f, 0xff, 0xc0, 0x00, 0x07, 0x84, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xe0, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x06, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0xe1, 0xf0, 0x07, 0xff, 0x80, 0x00, 0x07, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xfe, 0x03, 0xff, 0x00, 0x00, 0x03, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x3f, 0xc6, 0x7f, 0x81, 0xce, 0x00, 0x00, 0x01, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x3f, 0xc0, 0x07, 0xc1, 0xfe, 0x00, 0x00, 0x0d, 0xc0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x3f, 0xc0, 0x01, 0xe0, 0xfc, 0x00, 0x00, 0x0f, 0xc0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x3f, 0xc0, 0x00, 0x50, 0xfc, 0x00, 0x00, 0x0e, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x3f, 0xc0, 0x00, 0x18, 0xf8, 0x00, 0x00, 0x0e, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x3f, 0xc0, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x66, 0x81, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x1f, 0xc7, 0x80, 0x00, 0xf8, 0x00, 0x01, 0xe0, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x1f, 0xc1, 0xe0, 0x01, 0xf8, 0x00, 0x03, 0xf0, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, 0xc0, 0x3e, 0x03, 0xf0, 0x00, 0x00, 0xe0, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x1f, 0xe0, 0xe0, 0x03, 0xf2, 0x00, 0x00, 0xc0, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, 0xf0, 0x00, 0x07, 0xe6, 0x00, 0x00, 0xc0, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0x00, 0x1f, 0xee, 0x00, 0x00, 0x80, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb8, 0x0f, 0xff, 0xf0, 0x3f, 0xdc, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbc, 0x0f, 0xff, 0xff, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9e, 0x0f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x08, 0x0f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0b, 0xff, 0xff, 0xfe, 0xe0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0b, 0xff, 0xff, 0xf9, 0xc0, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3c, 0x09, 0xff, 0xff, 0xf1, 0x80, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1e, 0x08, 0x3f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x08, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xce, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff }; void setup() { display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // 清除顯示緩衝區 display.clearDisplay(); // 顯示 bitmap display.drawBitmap(0, 0, MarilynMonroe, 128, 64, WHITE); display.display(); } void loop() {}
[執行結果]
程式一部分顯示結果:程式二部分顯示結果:
程式三顯示結果:
張貼留言