Arduino Màn hình OLED SSD1309 128x64 | Hướng dẫn OLED I2C 2,42 inch
Màn hình OLED (diode phát quang hữu cơ) cung cấp các pixel tự phát sáng mang lại màu đen sâu, độ tương phản cao và góc nhìn rộng — làm cho nó trở thành một sự nâng cấp tuyệt vời so với LCD truyền thống. SSD1309 là IC điều khiển phổ biến được tìm thấy trên các module OLED I2C 128×64 có kích thước 2.42-inch (đôi khi được ghi là 2.4-inch).

Trong hướng dẫn từng bước này, bạn sẽ học cách kết nối và lập trình SSD1309 OLED 128×64 với một bo mạch Arduino bằng thư viện DIYables_OLED_SSD1309. Cụ thể, chúng ta sẽ đề cập đến:
- Kết nối OLED SSD1309 2,42 inch với Arduino qua I2C
- Hiển thị văn bản và số lên màn hình
- Căn giữa văn bản theo cả chiều dọc và chiều ngang
- Vẽ các hình học (đường thẳng, hình chữ nhật, hình tròn, hình tam giác, hình chữ nhật bo tròn)
- Hiển thị hình bitmap đen-trắng
- Cuộn phần cứng theo bốn hướng
- Điều chỉnh độ tương phản và làm mờ màn hình
- Sử dụng phông chữ bên ngoài tùy chỉnh từ bộ sưu tập phông chữ Adafruit GFX
Phần cứng cần chuẩn bị
| 1 | × | Arduino Uno R3 | ||
| 1 | × | USB 2.0 cable type A/B (for USB-A PC) | ||
| 1 | × | USB 2.0 cable type C/B (for USB-C PC) | ||
| 1 | × | SSD1309 I2C OLED Display 128x64 (2.42 inch) | ||
| 1 | × | dây jumper | ||
| 1 | × | (Khuyến nghị) Screw Terminal Block Shield for Arduino Uno | ||
| 1 | × | (Khuyến nghị) Breadboard Shield for Arduino Uno | ||
| 1 | × | (Khuyến nghị) Enclosure for Arduino Uno | ||
| 1 | × | (Khuyến nghị) Prototyping Base Plate & Breadboard Kit for Arduino UNO |
Or you can buy the following kits:
| 1 | × | DIYables STEM V3 Starter Kit (Arduino included) | ||
| 1 | × | DIYables Sensor Kit (30 sensors/displays) | ||
| 1 | × | DIYables Sensor Kit (18 sensors/displays) |
Về màn hình OLED SSD1309 2,42 inch
SSD1309 là một IC driver OLED CMOS tích hợp một chip được thiết kế cho bảng ma trận điểm 128×64. Nó tương thích theo thanh ghi với SSD1306 được sử dụng rộng rãi, nên nhiều ví dụ mã hiện có có thể được áp dụng lại với tối thiểu các thay đổi. Các khác biệt phần cứng chủ yếu là:
- Không có bộ tăng áp tích hợp — SSD1309 yêu cầu một nguồn VCC bên ngoài, mặc dù hầu hết các bo mạch breakout (bao gồm các module 2,42 inch và 2,4 inch) đều được trang bị bộ chuyển đổi tăng áp tích hợp, nên điều này sẽ không gây trở ngại cho bạn.
- Dung sai điện áp cao hơn — SSD1309 có thể chấp nhận lên tới 16 V VCC, trong khi SSD1306 bị giới hạn ở khoảng 4,2 V.
Module OLED 2,42 inch (2,4 inch) thường sử dụng trình điều khiển SSD1309 và có độ phân giải 128×64 pixel với giao diện I2C. Màu của bảng hiển thị (trắng, xanh lam, vàng, xanh lá hoặc hai vùng) được xác định bởi vật liệu OLED thực tế và không thể điều khiển bằng phần mềm.
Hướng dẫn này giao tiếp với màn hình qua I2C bus, chỉ yêu cầu hai dây tín hiệu (SDA và SCL) và có thể chia sẻ bus với các thiết bị ngoại vi I2C khác.
Bố trí chân OLED SSD1309 (Mô-đun I2C)
Mô-đun OLED I2C SSD1309 2,42 inch điển hình có bốn chân:
- GND — Kết nối với đường đất của Arduino.
- VCC — Nguồn cấp. Kết nối tới 5 V của Arduino (hoặc 3.3 V, tùy thuộc vào bộ điều chỉnh trên bo mạch của module).
- SCL — Dòng xung đồng hồ I2C.
- SDA — Dòng dữ liệu I2C.

※ Lưu ý:
- Thứ tự chân pin khác nhau giữa các nhà sản xuất. Hãy luôn xác nhận các nhãn in silkscreen trên mô-đun của bạn trước khi nối dây.
- Hướng dẫn này đã được xác minh với màn hình OLED SSD1309 2,42 inch từ DIYables. Các mô-đun dựa trên SSD1309 có kích thước 2,4/2,42 inch khác nhau sẽ hoạt động tương tự.
Sơ đồ nối dây — Arduino và SSD1309 OLED 128×64
- Sơ đồ nối dây giữa Arduino và OLED SSD1309 2,42 inch 128×64

This image is created using Fritzing. Click to enlarge image
- Ảnh chụp dây nối thực tế giữa Arduino và OLED SSD1309 128×64

This image is created using Fritzing. Click to enlarge image
Khi sử dụng một biến thể Arduino khác, các chân I2C sẽ thay đổi. Bảng dưới đây liệt kê các kết nối đúng:
| OLED Module | Arduino Uno, Nano | Arduino Mega |
|---|---|---|
| Vin | 5V | 5V |
| GND | GND | GND |
| SDA | A4 | 20 |
| SCL | A5 | 21 |
Hướng dẫn bắt đầu — SSD1309 OLED với Arduino
Bước 1: Cài đặt thư viện DIYables_OLED_SSD1309
- Mở Arduino IDE và nhấp vào biểu tượng Thư viện ở thanh bên trái.
- Gõ "DIYables_OLED_SSD1309" vào hộp tìm kiếm và tìm thư viện được phát hành bởi DIYables.
- Nhấp vào nút Cài đặt.

- IDE sẽ nhắc bạn cài đặt phụ thuộc bắt buộc (Adafruit GFX Library). Nhấp vào Cài đặt tất cả để tiếp tục.

Bước 2: Mẫu Lập trình Cơ bản
Mọi bản phác thảo điều khiển SSD1309 đều theo cùng một mẫu: bao gồm các header, tạo một đối tượng hiển thị, khởi tạo nó trong setup(), vẽ vào bộ đệm ngoài màn hình, sau đó đẩy bộ đệm lên màn hình bằng display().
- Bao gồm các header bắt buộc:
- Đặt kích thước màn hình (128×64 cho mô-đun 2,42 inch):
- Tạo đối tượng hiển thị (truyền -1 khi không có chân reset được kết nối):
- Khởi tạo màn hình trong hàm setup():
- Từ bây giờ, bạn có thể tự do gọi bất kỳ hàm vẽ nào (clearDisplay(), drawPixel(), print(), v.v.), sau đó gọi oled.display() để cập nhật màn hình.
※ Lưu ý:
Toàn bộ mã ví dụ trong hướng dẫn này nhắm tới OLED SSD1309 128×64 (2,42 inch) và sử dụng thư viện DIYables_OLED_SSD1309.
Mã Arduino — Xin chào thế giới trên OLED SSD1309
Điểm khởi đầu đơn giản nhất: in một vài dòng văn bản với các kích thước khác nhau.
Mã Arduino — Hiển thị văn bản trên OLED SSD1309
Ví dụ sau đây trình diễn thêm các tính năng văn bản — nhiều kích thước chữ, định dạng số và macro F() để tiết kiệm RAM.
Tham khảo các hàm hiển thị hữu ích
Dưới đây là danh sách tham khảo nhanh các hàm được sử dụng nhiều nhất khi làm việc với OLED SSD1309 thông qua thư viện DIYables:
- oled.clearDisplay() — xóa bộ đệm khung hình (tất cả các điểm ảnh đều tắt).
- oled.display() — chuyển bộ đệm lên OLED để các thay đổi được hiển thị.
- oled.drawPixel(x, y, color) — thiết lập hoặc xóa một điểm ảnh riêng lẻ.
- oled.setTextSize(n) — phóng chữ theo hệ số *n* (1 = 6×8, 2 = 12×16, …, tối đa 8).
- oled.setCursor(x, y) — di chuyển con trỏ chữ tới tọa độ pixel *(x, y)*.
- oled.setTextColor(SSD1309_PIXEL_ON) — màu chữ chỉ (nền trong suốt).
- oled.setTextColor(SSD1309_PIXEL_OFF, SSD1309_PIXEL_ON) — chữ có nền màu được chỉ định.
- oled.println("message") — in một chuỗi và xuống dòng tiếp theo.
- oled.println(number) — in một số nguyên ở hệ thập phân.
- oled.println(number, HEX) — in một số nguyên ở hệ thập lục phân.
- oled.startscrollright(start, stop) — bắt đầu cuộn phải theo phần cứng từ trang *start* đến trang *stop*.
- oled.startscrollleft(start, stop) — bắt đầu cuộn trái theo phần cứng từ trang *start* đến trang *stop*.
- oled.startscrolldiagright(start, stop) — bắt đầu cuộn chéo phải theo phần cứng từ trang *start* đến trang *stop*.
- oled.startscrolldiagleft(start, stop) — bắt đầu cuộn chéo trái theo phần cứng từ trang *start* đến trang *stop*.
- oled.stopscroll() — dừng mọi cuộn theo phần cứng đang hoạt động.
- oled.setContrast(value) — điều chỉnh độ sáng hiển thị (0–255).
- oled.dim(true/false) — tối nhanh màn hình về mức tối thiểu hoặc khôi phục độ tương phản trước đó.
- oled.invertDisplay(true/false) — đảo ngược màu ở cấp độ phần cứng (điểm ảnh sáng ↔ tối).
Cách căn giữa chữ theo chiều dọc và chiều ngang trên OLED SSD1309
Xem Cách căn giữa theo chiều dọc và chiều ngang cho văn bản và số trên OLED
Mã Arduino — Vẽ các hình trên OLED SSD1309
Vì thư viện DIYables_OLED_SSD1309 mở rộng Adafruit_GFX, bạn có được một tập hợp đầy đủ các hình cơ bản để vẽ: điểm ảnh, đường thẳng, hình chữ nhật, hình chữ nhật được tô, hình tròn, hình tròn được tô, tam giác, tam giác được tô, và hình chữ nhật bo góc tròn. Bản phác thảo dưới đây sẽ luân phiên hiển thị qua tất cả chúng với các trình diễn động.
Mã Arduino — Cuộn phần cứng trên OLED SSD1309
SSD1309 có một động cơ cuộn tích hợp, cho phép dịch nội dung hiển thị mà không làm tăng tải cho CPU. Thư viện DIYables cung cấp bốn hướng cuộn: phải, trái, chéo phải và chéo trái. Mỗi hướng nhận tham số trang bắt đầu và trang kết thúc (các trang là dải ngang cao 8 pixel được đánh số từ 0 đến 7 trên màn hình cao 64 pixel).
※ Lưu ý:
Luôn gọi display() để đẩy nội dung của bạn lên OLED trước khi bắt đầu cuộn. Tránh vẽ nội dung mới trong khi cuộn đang hoạt động — hãy gọi stopscroll() trước.
Mã Arduino — Hiển thị hình bitmap trên OLED SSD1309
Để hiển thị bitmap trên OLED SSD1309, trước hết bạn cần chuyển đổi hình ảnh của mình thành một mảng byte C. Sử dụng công cụ trực tuyến miễn phí image2cpp online tool để thực hiện việc này:
- Tải lên hình ảnh của bạn (PNG, JPG, BMP, v.v.).
- Đặt kích thước khung vẽ là 128×64 (hoặc nhỏ hơn).
- Chọn Mã Arduino làm định dạng đầu ra.
- Sao chép mảng được tạo ra vào sketch của bạn.

Ví dụ dưới đây luân phiên giữa một biểu tượng hình trái tim kích thước 16×16 và một logo DIYables có chiều rộng toàn bộ:
※ Lưu ý:
- Kích thước bitmap không được vượt quá độ phân giải màn hình (128×64 cho mô-đun 2,42 inch).
Mã Arduino — Độ tương phản và làm mờ trên OLED SSD1309
SSD1309 hỗ trợ 256 mức độ tương phản (0–255). Thư viện DIYables cung cấp setContrast() để kiểm soát chi tiết và dim() để chuyển nhanh giữa mức sáng tối thiểu và mức đã được cấu hình trước đó.
Mã Arduino — Phông chữ bên ngoài tùy chỉnh trên OLED SSD1309
Thư viện Adafruit GFX đi kèm với hàng chục kiểu chữ FreeFont có thể phóng to thu nhỏ (Serif, Sans, Mono — mỗi loại có Regular, Bold, Italic và bốn kích thước). Bạn có thể kích hoạt bất kỳ kiểu chữ nào trong số chúng trên màn hình SSD1309 bằng cách bao gồm header tương ứng và gọi setFont().
※ Lưu ý:
- Khi một phông chữ bên ngoài đang được kích hoạt, tọa độ Y của con trỏ tham chiếu đến đường cơ sở của chữ, không phải góc trên-trái. Điều này khác với phông chữ 5×7 tích hợp sẵn.
- Các phông chữ bên ngoài được lưu trong flash (PROGMEM). Trên các bo mạch AVR có bộ nhớ giới hạn (Arduino Uno = 32 KB flash), hãy sử dụng chúng một cách tiết kiệm.
Khắc phục sự cố OLED SSD1309
Nếu không thấy gì trên màn hình OLED SSD1309 2,42 inch sau khi tải lên bản phác thảo của bạn, hãy thực hiện các kiểm tra sau:
- Kiểm tra dây dẫn — xác nhận SDA, SCL, VCC và GND được kết nối đúng với các chân trên Arduino.
- Xác nhận chip điều khiển — thư viện này được thiết kế cho SSD1309. Nếu mô-đun của bạn sử dụng một bộ điều khiển khác (ví dụ SH1106), nó sẽ không đáp ứng đúng.
- Kiểm tra địa chỉ I2C — hầu hết các module SSD1309 có địa chỉ mặc định là 0x3C, nhưng một số dùng 0x3D. Chạy đoạn mã quét I2C dưới đây để phát hiện địa chỉ thực:
Kết quả mong đợi trên Serial Monitor khi phát hiện SSD1309:
- Đảm bảo gọi hàm display() — SSD1309 sử dụng một bộ đệm khung hình. Các hàm vẽ chỉ chỉnh sửa bộ đệm trong RAM; không có gì hiển thị trên màn hình cho đến khi bạn gọi oled.display().
- Kiểm tra nguồn cấp điện — mô-đun 2,42 inch tiêu thụ nhiều dòng điện hơn so với các OLED nhỏ hơn. Đảm bảo nguồn cung cấp của bạn có thể cung cấp đủ dòng điện (thông thường từ 20–40 mA ở độ sáng tối đa).