.
SSD1306 簡介
SSD1306是一款單芯片CMOS OLED / PLED驅動控制器,用於有機/聚合物發光
二極管點陣圖形顯示系統。 由128 segments和64個commons組成
能支持最大顯示解析度為128(RGB)* 64像素。
IC是專為共陰極型OLED面板設計
SSD1306嵌入了對比度控制,顯示RAM和振盪器,減少
外部元件的數量和功耗。 具有256級亮度控制。 數據指令是
各MCU通用,使用硬體可選6800/8000系列兼容並行接口發送
或串行外設接口。 適用於許多緊湊型便攜式應用,例如
手機子顯示屏,MP3播放器和計算機等
此篇用的OLED 為 I2C通訊,當然也有 SPI通訊介面的,看個人需求選用
此OLED使用上主要輝搭配以下幾中函式庫
1. Adafruit_SSD1306 、 Adafruit_GFX
2. U8Glib
兩種都可以用來操作 SSD1306,可看個人習慣挑選,本篇使用項目一的組合來作演示
系統架構
---------------前置設定--------------------------
下載以下兩個函式庫
接著進行Config檔設定
路徑為 arduino-nightly\libraries\Adafruit_SSD1306-master\Adafruit_SSD1306.h
將 SSD1306_128_64 註解拿掉 註解 SSD1306_128_32 (預設為128 * 32
接著存檔
-------------以下開始實作-----------------
做一個簡單的範例,在螢幕上顯示文字與數字
以下做一個類似計數器的功能
會計算系統啟動所經過的秒數,每經過一秒會讓數值加一
由於該OLED是屬於雙色LED,上半部是黃色,下半部是藍色
因此下面印出來的文字都會依照以下顏色分布
附上程式碼
- #include <SPI.h>
- #include <Wire.h>
- #include <Adafruit_GFX.h>
- #include <Adafruit_SSD1306.h>
- #define OLED_RESET 4
- Adafruit_SSD1306 display(OLED_RESET);
-
- #define NUMFLAKES 10
- #define XPOS 0
- #define YPOS 1
- #define DELTAY 2
-
-
- #define LOGO16_GLCD_HEIGHT 16
- #define LOGO16_GLCD_WIDTH 16
-
- #define imageWidth 96
- #define imageHeight 64
-
- int count = 0;
-
- static const unsigned char PROGMEM logo16_glcd_bmp[] =
- { B00000000, B11000000,
- B00000001, B11000000,
- B00000001, B11000000,
- B00000011, B11100000,
- B11110011, B11100000,
- B11111110, B11111000,
- B01111110, B11111111,
- B00110011, B10011111,
- B00011111, B11111100,
- B00001101, B01110000,
- B00011011, B10100000,
- B00111111, B11100000,
- B00111111, B11110000,
- B01111100, B11110000,
- B01110000, B01110000,
- B00000000, B00110000 };
-
-
- #if (SSD1306_LCDHEIGHT != 64)
- #error("Height incorrect, please fix Adafruit_SSD1306.h!");
- #endif
-
- void setup() {
- // put your setup code here, to run once:
- display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr
- 0x3C (for the 128x64)
- // init done
- display.setTextColor(WHITE);
- // Show image buffer on the display hardware.
- // Since the buffer is intialized with an Adafruit splashscreen
- // internally, this will display the splashscreen.
- display.display();
- delay(2000);
-
- // Clear the buffer.
- display.clearDisplay();
- }
-
- void loop() {
- // put your main code here, to run repeatedly:
-
- display.setTextSize(2); //設置字體大小
- display.setCursor(0,0);
- display.println("OLED Test"); //輸出文字
-
- display.setTextSize(2);
- display.setCursor(0,20); //設置文字位置
- display.print("sec:");
-
- display.setTextSize(2);
- display.setTextColor(WHITE);
- display.setCursor(60,20);
- display.println(count++);
- display.display();
-
- delay(1000);
- display.clearDisplay();
-
- }
接著為本篇的主題,可以呈現自己畫的圖片或是從網路上抓下來的圖片
Step1: 先打開小畫家,調整大小 選擇 像素 128 * 64
Step2: 開始畫圖,想畫什麼都可以,隨意
繪圖一: 隨便拉兩個幾何形狀
繪圖二: 用鉛筆畫
Step3: 畫完之後選擇 另存新檔 -> 單色點陣圖
Step4: 下載 LCD Assistant
載點: LCD Assistant
Step5: 轉換圖片為位元組
開啟 LCD Assistant -> Load image 接著都如下圖設定
Step6: 設定完成後選擇 Save output 並輸入檔名,例如 test.txt
Step7: 打開剛剛儲存的檔案,會看到轉換好的 圖片陣列
Step8: 將此陣列引入程式碼中,如以下範例
- #include <SPI.h>
- #include <Wire.h>
- #include <Adafruit_GFX.h>
- #include <Adafruit_SSD1306.h>
- #define OLED_RESET 4
- Adafruit_SSD1306 display(OLED_RESET);
-
- #define NUMFLAKES 10
- #define XPOS 0
- #define YPOS 1
- #define DELTAY 2
-
-
- #define LOGO16_GLCD_HEIGHT 16
- #define LOGO16_GLCD_WIDTH 16
-
- #define imageWidth 96
- #define imageHeight 64
-
- int count = 0;
-
- static const unsigned char PROGMEM logo16_glcd_bmp[] =
- { B00000000, B11000000,
- B00000001, B11000000,
- B00000001, B11000000,
- B00000011, B11100000,
- B11110011, B11100000,
- B11111110, B11111000,
- B01111110, B11111111,
- B00110011, B10011111,
- B00011111, B11111100,
- B00001101, B01110000,
- B00011011, B10100000,
- B00111111, B11100000,
- B00111111, B11110000,
- B01111100, B11110000,
- B01110000, B01110000,
- B00000000, B00110000 };
-
-
- const unsigned char PROGMEM test_2 [] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00,
- 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF,
- 0xFC, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF,
- 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,
- 0x3F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00,0x00, 0x00,
- 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x03, 0xFF,
- 0x80, 0x00,0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00,
- 0x03, 0xFF, 0x80, 0x00,0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x7C, 0x00,
- 0x00, 0x00, 0x07, 0xEF, 0xC0, 0x00,0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00,
- 0x7C, 0x00, 0x00, 0x00, 0x0F, 0xE7, 0xE0, 0x00,0x00, 0x00, 0x00, 0x00, 0x3E, 0x00,
- 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x0F, 0xC7, 0xE0, 0x00,0x00, 0x00, 0x00, 0x00,
- 0x3E, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x1F, 0x83, 0xF0, 0x00,0x00, 0x00,
- 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x03, 0xFF, 0xFF, 0x81, 0xFF, 0xFF,
- 0x80, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x0F, 0xFF, 0xFF, 0x01,
- 0xFF, 0xFF,0xE0, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x0F, 0xFF,
- 0xFE, 0x00, 0xFF, 0xFF,0xE0, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x7C, 0x00,
- 0x0F, 0xFF, 0xFE, 0x00, 0x7F, 0xFF,0xE0, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00,
- 0x7C, 0x00, 0x07, 0xFF, 0xFC, 0x00, 0x7F, 0xFF,0xC0, 0x00, 0x00, 0x00, 0x3E, 0x00,
- 0x00, 0x00, 0x7C, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x0F,0xC0, 0x00, 0x00, 0x00,
- 0x3E, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x1F,0x80, 0x00,
- 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x1F,
- 0x80, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x01, 0xF8, 0x00, 0x00,
- 0x00, 0x3F,0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0xF8,
- 0x00, 0x00, 0x00, 0x3E,0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00,
- 0x00, 0xFC, 0x00, 0x00, 0x00, 0x7E,0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF,
- 0xFC, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0xFC,0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF,
- 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0xFC,0x00, 0x00, 0x00, 0x00,
- 0x3F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x01, 0xF8,0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x01, 0xF8,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00,
- 0x00, 0xFC,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E,
- 0x00, 0x00, 0x00, 0xFC,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0xFC, 0x00, 0x00, 0x00, 0x7E,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x3E,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x3F,0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x1F,0x80, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x1F,
- 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00,
- 0x00, 0x0F,0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF,
- 0xFC, 0x00, 0x7F, 0xFF,0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0F, 0xFF, 0xFC, 0x00, 0x7F, 0xFF,0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x0F, 0xFF, 0xFE, 0x00, 0xFF, 0xFF,0xE0, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0x01, 0xFF, 0xFF,0xE0, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0x01, 0xFF, 0xFF,0xC0, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x83, 0xF0, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xC7,
- 0xE0, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0F, 0xE7, 0xE0, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x07, 0xEF, 0xC0, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x00,0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x00,0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
- 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00
- };
-
- #if (SSD1306_LCDHEIGHT != 64)
- #error("Height incorrect, please fix Adafruit_SSD1306.h!");
- #endif
-
- void setup() {
- // put your setup code here, to run once:
- display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
- // init done
- display.setTextColor(WHITE);
- // Show image buffer on the display hardware.
- // Since the buffer is intialized with an Adafruit splashscreen
- // internally, this will display the splashscreen.
- display.display();
- delay(2000);
-
- // Clear the buffer.
- display.clearDisplay();
- }
-
- void loop() {
- // put your main code here, to run repeatedly:
-
- display.drawBitmap(0, 0, test_2 , 128, 64, 1);
-
- display.display();
-
- }
Step9: 執行,以下呈現剛剛在小畫家畫的那兩張圖片
原圖
OLED呈現:
原圖:
OLED呈現:
最後再做幾個其他圖像直接做轉換的結果