# 「[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(); // 更新顯示