---
# System prepended metadata

title: OLED螢幕使用

---

# 「[Avionic 101](https://hackmd.io/@Jackiempty/avionic-101-list)」：OLED螢幕使用
本文將簡單介紹OLED螢幕的連接方式以及最初階的程式控制方式，讓需要的人可以快速地了解如何印出需要的訊息。
## 使用U8g2
U8g2是什麼?
U8g2 是一個用於單色圖形顯示器的 Arduino/C++ 函式庫，支援多款主流的顯示器，使用u8g2可以非常直觀的在你需要的位置顯示文字、線條或是圖案。
## 建立物件
```cpp
#include <U8g2lib.h>

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);
```
- SSD1306：指定 OLED 控制晶片型號。
- 128X64：螢幕解析度。
- NONAME：表示這是無品牌（通用版本）的 SSD1306 模組。
- F：Full buffer 模式（一次將整個畫面資料寫到 RAM，再一次送到螢幕）。
- HW_I2C：表示使用開法版預設的 I2C 腳位。
    也可以使用 SW_I2C，指定自己需要的接腳，但通常不會使用。
- U8G2_R0：表示畫面旋轉角度
    R0：不旋轉（0°）
    R1：順時針旋轉 90°
    R2：旋轉 180°
    R3：逆時針旋轉 90°
- U8X8_PIN_NONE：代表 Reset 腳位
    如果 OLED 模組已內部接上 Reset（或和 MCU 的 Reset 共用），就可以用 U8X8_PIN_NONE 表示「不用額外接 reset 腳位」。
    如果你要自己控制 Reset 腳位，可以改成該腳位的編號，例如 4 表示使用 D4 控制 Reset。
## 物件方法
### 1. 初始化與更新
| 指令 | 功能 | 範例 |
|------|------|------|
| `begin()` | 啟動 u8g2，必須在 `setup()` 內呼叫一次 | `u8g2.begin();` |
| `clearBuffer()` | 清除畫面緩衝區（不會馬上更新螢幕） | `u8g2.clearBuffer();` |
| `sendBuffer()` | 將緩衝區內容一次性送到螢幕顯示 | `u8g2.sendBuffer();` |

---

### 2. 文字顯示
| 指令 | 功能 | 範例 |
|------|------|------|
| `setFont(fontname)` | 設定字型 | `u8g2.setFont(u8g2_font_ncenB08_tr);` |
| `drawStr(x, y, "字串")` | 在 `(x, y)` 顯示文字 | `u8g2.drawStr(0, 15, "Hello");` |
| `setCursor(x, y)` | 設定游標位置，搭配 `print()` 用 | `u8g2.setCursor(0, 15);` |
| `print("字串或數字")` | 從游標位置印出文字或數字 | `u8g2.print(123);` |

---

### 3. 基本繪圖
| 指令 | 功能 | 範例 |
|------|------|------|
| `drawPixel(x, y)` | 畫單一像素 | `u8g2.drawPixel(10, 10);` |
| `drawLine(x1, y1, x2, y2)` | 畫直線 | `u8g2.drawLine(0, 0, 127, 63);` |
| `drawFrame(x, y, w, h)` | 畫空心矩形 | `u8g2.drawFrame(10, 10, 50, 30);` |
| `drawBox(x, y, w, h)` | 畫實心矩形 | `u8g2.drawBox(10, 10, 50, 30);` |
| `drawCircle(cx, cy, r, option)` | 畫圓（`option` 可指定部分圓） | `u8g2.drawCircle(64, 32, 20, U8G2_DRAW_ALL);` |
| `drawDisc(cx, cy, r, option)` | 畫實心圓 | `u8g2.drawDisc(64, 32, 10, U8G2_DRAW_ALL);` |

---

### 4. 進階圖形
| 指令 | 功能 | 範例 |
|------|------|------|
| `drawTriangle(x1, y1, x2, y2, x3, y3)` | 畫三角形 | `u8g2.drawTriangle(10, 10, 50, 30, 20, 40);` |
| `drawBitmap(x, y, w/8, h, data[])` | 顯示自訂位元圖像 | `u8g2.drawBitmap(0, 0, 16/8, 16, my_bitmap);` |
| `drawXBMP(x, y, w, h, data[])` | 顯示 XBM 格式圖像 | `u8g2.drawXBMP(0, 0, 16, 16, my_xbm);` |

---

### 5. 設定與控制
| 指令 | 功能 | 範例 |
|------|------|------|
| `setDrawColor(c)` | 設定畫筆顏色（1=白，0=黑，2=反色） | `u8g2.setDrawColor(1);` |
| `setFontMode(mode)` | 設定字型繪製模式（0=透明背景，1=填滿背景） | `u8g2.setFontMode(0);` |
| `setFontDirection(dir)` | 文字方向（0=左到右，1=下到上，2=右到左，3=上到下） | `u8g2.setFontDirection(0);` |

---

### 6. 基本使用範例
```cpp
u8g2.clearBuffer();                     // 清空畫面
u8g2.setFont(u8g2_font_ncenB08_tr);      // 設定字型
u8g2.drawStr(0, 15, "Hello, OLED!");     // 顯示文字
u8g2.drawFrame(0, 20, 128, 20);          // 畫矩形框
u8g2.sendBuffer();                       // 更新顯示