程式碼在右側下方 — 可切換 Adafruit / U8g2 格式、複製或下載 .ino
| OLED 腳位 | 接到 UNO | 說明 |
|---|---|---|
| GND | GND | 共地 |
| VCC | 5V | 供電(模組內建穩壓,3.3V 也可) |
| SCL | A5 | I2C 時脈線 |
| SDA | A4 | I2C 資料線 |
⚠️ 不同廠牌模組的腳位順序不一定相同(有的 GND-VCC-SCL-SDA、有的 VCC-GND…)。一定要看板子上的絲印文字,接反 VCC/GND 可能燒毀模組。
💛 藍黃雙色的真相:這塊螢幕其實是單色螢幕 — 面板上方 16 行的螢光材料是黃色、下方 48 行是藍色,位置固定、不能改變顏色。所以設計畫面時:狀態列/標題放上方黃區(y 0–15),主內容放下方藍區(y 16–63)。兩區中間有一條細細的物理分隔線。
工具 → 管理程式庫 → 搜尋 Adafruit SSD1306 → INSTALL(會自動一併安裝 Adafruit GFX)。本工具產生的程式碼預設使用這套函式庫;若你偏好 U8g2,程式碼面板可切換格式。
// ═══ OLED 快速測試 — 雙色分區 ═══
// 0.96" SSD1306 128x64 I2C:GND→GND VCC→5V SCL→A5 SDA→A4(位址 0x3C)
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display(128, 64, &Wire, -1);
void setup() {
Serial.begin(9600);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 大多數模組位址是 0x3C
Serial.println("X 找不到 SSD1306:檢查接線 / 位址");
while (true) {}
}
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(1);
display.setCursor(10, 4);
display.print("YELLOW ZONE y0-15"); // 這行會是黃色
display.setTextSize(2);
display.setCursor(16, 26);
display.print("HELLO!"); // 這行會是藍色
display.setTextSize(1);
display.setCursor(22, 50);
display.print("BLUE ZONE y16-63");
display.drawRect(0, 0, 128, 64, SSD1306_WHITE); // 螢幕外框
display.display(); // 把緩衝區推上螢幕(必要!)
}
void loop() {}// ═══ I2C 掃描器 — 找出螢幕位址 ═══
#include <Wire.h>
void setup() {
Wire.begin();
Serial.begin(9600);
Serial.println("掃描中...");
for (byte a = 8; a < 120; a++) {
Wire.beginTransmission(a);
if (Wire.endTransmission() == 0) {
Serial.print("找到裝置:0x");
Serial.println(a, HEX); // OLED 通常是 0x3C(少數 0x3D)
}
}
Serial.println("掃描完成");
}
void loop() {}| 問題 | 原因 | 解法 |
|---|---|---|
| 完全沒畫面 | 位址不對 / 接線錯 / 忘了 display.display() | 跑 I2C 掃描器;檢查 SDA=A4、SCL=A5;每次畫完要呼叫 display.display() |
| 畫面雪花雜訊 | 沒共地 / 杜邦線接觸不良 | GND 一定要接;換線再試 |
| 只亮上半部 / 畫面錯位 | 初始化寫成 128x32 | 宣告要用 display(128, 64, &Wire, -1) |
| 畫面上下顛倒 | 模組安裝方向 | setup 加一行 display.setRotation(2); |
| 上傳後越跑越慢 | RAM 不足(UNO 只有 2KB,畫面緩衝占 1KB) | 減少全域陣列 / 改用 uint8_t / 避免 String |