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