ESP32 Màn Hình OLED SSD1309 128x64 | Hướng Dẫn OLED I2C 2.42 inch
Màn hình OLED (Organic Light-Emitting Diode) có 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à sự nâng cấp tuyệt vời so với màn hình LCD truyền thống. SSD1309 là IC điều khiển thường được tìm thấy trên các module OLED I2C 2.42-inch (đôi khi được ghi nhãn là 2.4-inch) có độ phân giải 128×64.

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 OLED SSD1309 128×64 với bo mạch ESP32 sử dụng thư viện DIYables_OLED_SSD1309. Cụ thể, chúng ta sẽ tìm hiểu:
- Đấu nối OLED SSD1309 2.42-inch với ESP32 qua I2C
- In text và số trên màn hình
- Căn giữa text theo chiều dọc và ngang
- Vẽ các hình dạng hình học (đường thẳng, hình chữ nhật, hình tròn, tam giác, hình chữ nhật bo góc)
- Hiển thị hình ảnh bitmap đơn sắc
- 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 font tùy chỉnh từ bộ sưu tập font Adafruit GFX
Linh Kiện Cần Thiết
| 1 | × | mô-đun phát triển ESP-WROOM-32 | ||
| 1 | × | Alternatively, ESP32 Uno-form board | ||
| 1 | × | Alternatively, ESP32 S3 Uno-form board | ||
| 1 | × | Cáp USB Type-C | ||
| 1 | × | Màn Hình OLED I2C SSD1309 128x64 (2.42 inch) | ||
| 1 | × | breadboard (bo mạch thí nghiệm) | ||
| 1 | × | Dây Jumper | ||
| 1 | × | (Tùy chọn) Jack Nguồn DC | ||
| 1 | × | (Khuyến nghị) Screw Terminal Expansion Board for ESP32 | ||
| 1 | × | (Khuyến nghị) Breakout Expansion Board for ESP32 | ||
| 1 | × | (Khuyến nghị) Power Splitter for ESP32 |
Or you can buy the following kits:
| 1 | × | DIYables ESP32 Starter Kit (ESP32 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à IC điều khiển OLED CMOS một chip được thiết kế cho các tấm dot-matrix 128×64. Nó tương thích thanh ghi với SSD1306 được sử dụng rộng rãi, do đó nhiều ví dụ code hiện có có thể chuyển đổi với ít thay đổi. Những khác biệt phần cứng chính là:
- Không có charge pump tích hợp — SSD1309 yêu cầu rail VCC bên ngoài, tuy nhiên hầu như tất cả các bo mạch breakout (bao gồm module 2.42-inch và 2.4-inch) đều đi kèm với bộ chuyển đổi boost tích hợp, nên điều này hoàn toàn trong suốt với bạn.
- Khả năng chịu điện áp cao hơn — SSD1309 chấp nhận VCC lên đến 16V, trong khi SSD1306 bị giới hạn khoảng 4.2V.
Module OLED 2.42 inch (2.4 inch) thường sử dụng driver SSD1309 và có độ phân giải 128×64 pixel với giao diện I2C. Màu sắc tấm (trắng, xanh dương, vàng, xanh lá, hoặc hai vùng) được xác định bởi vật liệu OLED vật lý 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 bus I2C, 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.
Pinout OLED SSD1309 (Module I2C)
Module OLED I2C SSD1309 2.42-inch thông thường có bốn chân:
- Chân GND: nên được kết nối với chân ground của ESP32
- Chân VCC: nên được kết nối với chân 3.3V hoặc 5V của ESP32 (kiểm tra thông số kỹ thuật của module)
- Chân SCL: là chân clock I2C. Kết nối với GPIO 22 (SCL mặc định)
- Chân SDA: là chân data I2C. Kết nối với GPIO 21 (SDA mặc định)

※ Lưu ý:
Thứ tự chân có thể khác nhau giữa các nhà sản xuất. Luôn kiểm tra các nhãn được in trên module OLED của bạn.
Sơ Đồ Đấu Nối
- Cách kết nối ESP32 với màn hình OLED SSD1309 128x64 sử dụng breadboard

This image is created using Fritzing. Click to enlarge image
Nếu bạn chưa rõ cách cấp nguồn cho ESP32 và các linh kiện khác, xem: Cách Cung Cấp Nguồn Điện Cho ESP32.
- Cách kết nối ESP32 với màn hình OLED SSD1309 128x64 sử dụng screw terminal block breakout board

This image is created using Fritzing. Click to enlarge image
Cách Lập Trình ESP32 cho OLED SSD1309
Cài Đặt Thư Viện DIYables_OLED_SSD1309
Thư viện DIYables_OLED_SSD1309 được thiết kế riêng cho màn hình SSD1309 và mở rộng Adafruit_GFX để hỗ trợ đồ họa phong phú hơn.
- Mở Arduino IDE
- Điều hướng đến biểu tượng Libraries trên thanh bên trái
- Tìm kiếm DIYables_OLED_SSD1309
- Nhấn Install
- Một lời nhắc dependency sẽ xuất hiện — nhấn Install All để cũng cài đặt Adafruit GFX Library (cần thiết cho vẽ hình dạng và font)

Các Bước Lập Trình
- Include các thư viện cần thiết
- Định nghĩa kích thước màn hình
- Khai báo đối tượng display
- Khởi tạo OLED trong setup()
- Hiển thị nội dung
Code ESP32 — Hello World trên OLED SSD1309
Điểm khởi đầu đơn giản nhất: in vài dòng text với các kích thước khác nhau.
Code ESP32 — Hiển Thị Text trên OLED SSD1309
Ví dụ sau đây minh họa thêm các tính năng text — nhiều kích thước, định dạng số, và macro F() để tiết kiệm RAM.
Tham Khảo Các Hàm Display Hữu Ích
Dưới đây là danh sách tham khảo nhanh các hàm được sử dụng thường xuyên nhất khi làm việc với OLED SSD1309 thông qua thư viện DIYables:
- oled.clearDisplay() — xóa frame buffer (tất cả pixel tắt).
- oled.display() — truyền buffer lên OLED để các thay đổi hiển thị.
- oled.drawPixel(x, y, color) — bật hoặc tắt một pixel riêng lẻ.
- oled.setTextSize(n) — tăng tỷ lệ font theo hệ số *n* (1 = 6×8, 2 = 12×16, …, lên đến 8).
- oled.setCursor(x, y) — di chuyển con trở text đến tọa độ pixel *(x, y)*.
- oled.setTextColor(SSD1309_PIXEL_ON) — chỉ màu foreground của text (background trong suốt).
- oled.setTextColor(SSD1309_PIXEL_OFF, SSD1309_PIXEL_ON) — text với màu background rõ ràng.
- oled.println("message") — in một chuỗi và chuyển đến 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) — cuộn phần cứng sang phải giữa trang *start* và trang *stop*.
- oled.startscrollleft(start, stop) — cuộn phần cứng sang trái.
- oled.startscrolldiagright(start, stop) — cuộn phần cứng chéo sang phải.
- oled.startscrolldiagleft(start, stop) — cuộn phần cứng chéo sang trái.
- oled.stopscroll() — dừng bất kỳ cuộn phần cứng nào đang hoạt động.
- oled.setContrast(value) — điều chỉnh độ sáng màn hình (0–255).
- oled.dim(true/false) — nhanh chóng làm mờ màn hình xuống tối thiểu hoặc khôi phục độ tương phản trước đó.
- oled.invertDisplay(true/false) — đảo màu ở mức phần cứng (pixel bật ↔ pixel tắt).
Cách Căn Giữa Text Theo Chiều Dọc và Ngang trên OLED SSD1309
Code ESP32 — Vẽ Hình Dạng trên OLED SSD1309
Bởi vì thư viện DIYables_OLED_SSD1309 mở rộng Adafruit_GFX, bạn có được một bộ đầy đủ các primitive vẽ hình dạng: pixel, đường thẳng, hình chữ nhật, hình chữ nhật tô đầy, hình tròn, hình tròn tô đầy, tam giác, tam giác tô đầy, và hình chữ nhật bo góc. Sketch dưới đây lặp qua tất cả chúng với các demo có hoạt ảnh.
Code ESP32 — Cuộn Phần Cứng trên OLED SSD1309
SSD1309 có một engine cuộn tích hợp dịch chuyển nội dung màn hình mà không có tải CPU nào. 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 cái nhận tham số trang bắt đầu và trang kết thúc (các trang là các dải ngang cao 8-pixel được đánh số 0–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 — gọi stopscroll() trước.
Code ESP32 — Hiển Thị Hình Ảnh Bitmap trên OLED SSD1309
Để hiển thị bitmap trên OLED SSD1309, bạn phải đầu tiê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 cho việc chuyển đổi này:
- Upload tệp hình ảnh của bạn (PNG, JPG, BMP, v.v.).
- Đặt kích thước canvas thành 128×64 (hoặc nhỏ hơn).
- Chọn Arduino code làm định dạng đầu ra.
- Copy mảng được tạo vào sketch của bạn.

Ví dụ dưới đây xen kẽ giữa biểu tượng trái tim 16×16 và logo DIYables toàn chiều rộng:
※ Lưu ý:
- Kích thước bitmap không được vượt quá độ phân giải màn hình (128×64 cho module 2.42 inch).
Code ESP32 — Độ 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() cho điều khiển chi tiết và dim() cho chuyển đổi nhanh giữa độ sáng tối thiểu và mức đã cấu hình trước đó.
Code ESP32 — Font Tùy Chỉnh Bên Ngoài trên OLED SSD1309
Thư viện Adafruit GFX đi kèm với hàng tá kiểu chữ FreeFont có thể mở rộng (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ỳ font nào trong số chúng trên màn hình SSD1309 bằng cách include header tương ứng và gọi setFont().
※ Lưu ý:
- Khi một font bên ngoài đang hoạt động, tọa độ Y của cursor tham chiếu đến baseline của text, không phải góc trên-trái. Điều này khác với font tích hợp 5×7.
- Các font bên ngoài được lưu trữ trong flash (PROGMEM). ESP32 có bộ nhớ flash dồi dào, vì vậy hãy thoải mái sử dụng nhiều tệp font trong dự án của bạn.
Khắc Phục Sự Cố OLED SSD1309 với ESP32
Nếu không có gì xuất hiện trên OLED SSD1309 2.42 inch sau khi upload sketch của bạn, hãy làm việc qua các kiểm tra này:
- Xác minh đấu nối — xác nhận SDA, SCL, VCC và GND được kết nối đúng chân ESP32.
- Xác nhận chip driver — thư viện này được thiết kế cho SSD1309. Nếu module của bạn sử dụng controller khác (ví dụ SH1106), nó sẽ không phản hồi đúng cách.
- Kiểm tra địa chỉ I2C — hầu hết module SSD1309 mặc định là 0x3C, nhưng một số sử dụng 0x3D. Chạy sketch I2C scanner dưới đây để phát hiện địa chỉ thực tế:
Đầu ra Serial Monitor mong đợi khi SSD1309 được phát hiện:
- Đảm bảo display() được gọi — SSD1309 sử dụng frame buffer. Các hàm vẽ chỉ sửa đổi buffer trong RAM; không có gì xuất hiện trên màn hình cho đến khi bạn gọi oled.display().
- Kiểm tra nguồn điện — module 2.42 inch tiêu thụ nhiều dòng điện hơn các OLED nhỏ hơn. Đảm bảo nguồn điện của bạn có thể cung cấp đủ dòng điện (thường là 20–40 mA ở độ sáng tối đa). Nếu sử dụng nguồn USB, điều này thường không phải vấn đề với ESP32.
- Chân I2C tùy chỉnh (tùy chọn) — Nếu bạn cần sử dụng chân I2C không mặc định, khởi tạo Wire với Wire.begin(SDA_PIN, SCL_PIN) trước khi gọi display.begin().
Tổng Kết
Hướng dẫn này đã bao gồm tất cả những điều cần thiết để sử dụng màn hình OLED SSD1309 2.42-inch (128×64) với ESP32, bao gồm:
- Kết nối phần cứng và đấu nối I2C
- Hiển thị text và số với nhiều kích thước
- Vẽ hình dạng (hình chữ nhật, hình tròn, tam giác)
- Hiển thị hình ảnh bitmap
- Cuộn phần cứng theo bốn hướng
- Điều khiển độ tương phản và độ sáng
- Font tùy chỉnh bên ngoài
Thư viện DIYables_OLED_SSD1309 đơn giản hóa việc lập trình SSD1309 bằng cách cung cấp các hàm cấp cao cho text, đồ họa, và điều khiển màn hình trong khi tận dụng Adafruit GFX cho khả năng vẽ mở rộng.
Để có thêm các dự án và hướng dẫn ESP32, hãy truy cập esp32io.com