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.

ESP32 ssd1309 2.42-inch oLED

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:

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)
ssd1309 oLED sơ đồ chân

※ 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
ESP32 ssd1309 oLED 128x64 sơ đồ đấu dây

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.

how to connect ESP32 and ssd1309 oLED

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)
ESP32 ssd1309 oLED thư viện

Các Bước Lập Trình

  1. Include các thư viện cần thiết
#include <Wire.h> #include <Adafruit_GFX.h> #include <DIYables_OLED_SSD1309.h>
  1. Định nghĩa kích thước màn hình
#define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64
  1. Khai báo đối tượng display
#define OLED_RESET -1 // Reset pin không được sử dụng trên hầu hết module I2C #define SCREEN_ADDRESS 0x3C DIYables_OLED_SSD1309 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
  1. Khởi tạo OLED trong setup()
if (!display.begin(SSD1309_SWITCHCAPVCC, SCREEN_ADDRESS)) { Serial.println(F("SSD1309 allocation failed")); for (;;); // dừng }
  1. Hiển thị nội dung
display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1309_PIXEL_ON); display.setCursor(0, 20); display.println(F("Hello ESP32")); display.display(); // đẩy buffer lên màn hình

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.

/* * Mã ESP32 này được phát triển bởi newbiely.vn * Mã ESP32 này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/esp32/esp32-ssd1309-oled-display */ /* * DIYables OLED SSD1309 – Hello World * Prints text in two sizes on the 2.42 inch 128x64 I2C OLED with ESP32. */ #include <Wire.h> #include <Adafruit_GFX.h> #include <DIYables_OLED_SSD1309.h> #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_RESET -1 #define SCREEN_ADDRESS 0x3C DIYables_OLED_SSD1309 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); void setup() { Serial.begin(115200); if (!display.begin(SSD1309_SWITCHCAPVCC, SCREEN_ADDRESS)) { Serial.println(F("SSD1309 allocation failed")); for (;;); } display.clearDisplay(); display.setTextSize(1); // 6x8 pixels per character display.setTextColor(SSD1309_PIXEL_ON); // turn pixels on display.setCursor(0, 0); display.println(F("Hello, World!")); display.println(); display.setTextSize(2); // 12x16 pixels per character display.println(F("DIYables")); display.setTextSize(1); display.println(); display.println(F("SSD1309 OLED 128x64")); display.display(); // push buffer to screen } void loop() { }

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.

/* * Mã ESP32 này được phát triển bởi newbiely.vn * Mã ESP32 này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/esp32/esp32-ssd1309-oled-display */ /* * DIYables OLED SSD1309 – Display Text * Displays text in various sizes and formats on the 2.42" SSD1309 OLED with ESP32. */ #include <Wire.h> #include <Adafruit_GFX.h> #include <DIYables_OLED_SSD1309.h> #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_RESET -1 #define SCREEN_ADDRESS 0x3C DIYables_OLED_SSD1309 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); void setup() { Serial.begin(115200); if (!display.begin(SSD1309_SWITCHCAPVCC, SCREEN_ADDRESS)) { Serial.println(F("SSD1309 allocation failed")); for (;;); } display.clearDisplay(); // Various text sizes display.setTextSize(1); display.setTextColor(SSD1309_PIXEL_ON); display.setCursor(0, 0); display.println(F("Size 1 - DIYables")); display.setTextSize(2); display.println(F("Size 2")); display.setTextSize(3); display.println(F("Sz3")); display.display(); delay(3000); // Number formatting display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); int value = 42; float pi = 3.14159; display.print(F("Integer: ")); display.println(value); display.print(F("Float: ")); display.println(pi, 2); // 2 decimal places display.print(F("Hex: 0x")); display.println(value, HEX); display.print(F("Binary: 0b")); display.println(value, BIN); display.display(); } void loop() { }

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

Xem Cách căn giữa dọc/ngang trên OLED

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.

/* * Mã ESP32 này được phát triển bởi newbiely.vn * Mã ESP32 này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/esp32/esp32-ssd1309-oled-display */ /* * DIYables OLED SSD1309 – Draw Shapes * Demonstrates drawing pixels, lines, rectangles, circles, and triangles on the 2.42" OLED with ESP32. */ #include <Wire.h> #include <Adafruit_GFX.h> #include <DIYables_OLED_SSD1309.h> #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_RESET -1 #define SCREEN_ADDRESS 0x3C DIYables_OLED_SSD1309 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); void setup() { Serial.begin(115200); if (!display.begin(SSD1309_SWITCHCAPVCC, SCREEN_ADDRESS)) { Serial.println(F("SSD1309 allocation failed")); for (;;); } display.clearDisplay(); display.display(); } void loop() { // Draw pixels display.clearDisplay(); for (int i = 0; i < 20; i++) { display.drawPixel(random(SCREEN_WIDTH), random(SCREEN_HEIGHT), SSD1309_PIXEL_ON); } display.display(); delay(2000); // Draw lines display.clearDisplay(); for (int y = 0; y < SCREEN_HEIGHT; y += 8) { display.drawLine(0, 0, SCREEN_WIDTH - 1, y, SSD1309_PIXEL_ON); } display.display(); delay(2000); // Draw rectangles display.clearDisplay(); display.drawRect(10, 10, 40, 30, SSD1309_PIXEL_ON); // outline display.fillRect(60, 10, 40, 30, SSD1309_PIXEL_ON); // filled display.drawRoundRect(10, 45, 40, 15, 5, SSD1309_PIXEL_ON); // rounded corners display.display(); delay(2000); // Draw circles display.clearDisplay(); display.drawCircle(32, 32, 20, SSD1309_PIXEL_ON); // outline display.fillCircle(96, 32, 20, SSD1309_PIXEL_ON); // filled display.display(); delay(2000); // Draw triangles display.clearDisplay(); display.drawTriangle(20, 10, 10, 50, 30, 50, SSD1309_PIXEL_ON); // outline display.fillTriangle(90, 10, 70, 50, 110, 50, SSD1309_PIXEL_ON); // filled display.display(); delay(2000); }

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.

/* * Mã ESP32 này được phát triển bởi newbiely.vn * Mã ESP32 này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/esp32/esp32-ssd1309-oled-display */ /* * DIYables OLED SSD1309 – Scroll Text * Demonstrates all four hardware scroll directions on the 2.42" OLED with ESP32. */ #include <Wire.h> #include <Adafruit_GFX.h> #include <DIYables_OLED_SSD1309.h> #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_RESET -1 #define SCREEN_ADDRESS 0x3C DIYables_OLED_SSD1309 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); void setup() { Serial.begin(115200); if (!display.begin(SSD1309_SWITCHCAPVCC, SCREEN_ADDRESS)) { Serial.println(F("SSD1309 allocation failed")); for (;;); } display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1309_PIXEL_ON); display.setCursor(10, 24); display.println(F("DIYables")); display.display(); delay(2000); } void loop() { // Scroll right across all pages display.startscrollright(0x00, 0x07); delay(3000); display.stopscroll(); delay(500); // Scroll left display.startscrollleft(0x00, 0x07); delay(3000); display.stopscroll(); delay(500); // Diagonal scroll right display.startscrolldiagright(0x00, 0x07); delay(3000); display.stopscroll(); delay(500); // Diagonal scroll left display.startscrolldiagleft(0x00, 0x07); delay(3000); display.stopscroll(); delay(500); }

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:

  1. Upload tệp hình ảnh của bạn (PNG, JPG, BMP, v.v.).
  2. Đặt kích thước canvas thành 128×64 (hoặc nhỏ hơn).
  3. Chọn Arduino code làm định dạng đầu ra.
  4. Copy mảng được tạo vào sketch của bạn.
image to bitmap array

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:

/* * Mã ESP32 này được phát triển bởi newbiely.vn * Mã ESP32 này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/esp32/esp32-ssd1309-oled-display */ /* * DIYables OLED SSD1309 – Display Bitmap Image * Shows a 16x16 heart icon and 128x64 DIYables logo on the 2.42" OLED with ESP32. */ #include <Wire.h> #include <Adafruit_GFX.h> #include <DIYables_OLED_SSD1309.h> #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_RESET -1 #define SCREEN_ADDRESS 0x3C DIYables_OLED_SSD1309 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // 16x16 heart icon bitmap const unsigned char heart_icon[] PROGMEM = { 0x00, 0x00, 0x0c, 0x30, 0x1e, 0x78, 0x3f, 0xfc, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0x3f, 0xfc, 0x1f, 0xf8, 0x0f, 0xf0, 0x03, 0xc0, 0x00, 0x00 }; // 128x64 DIYables logo bitmap const unsigned char diyables_logo[] PROGMEM = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x07, 0xff, 0xc1, 0xff, 0xe0, 0x7f, 0xf0, 0x1f, 0xfc, 0x03, 0x00, 0x7f, 0xff, 0xff, 0xfc, 0x00, 0x1f, 0xff, 0xf7, 0xff, 0xf9, 0xff, 0xfc, 0x7f, 0xff, 0x0f, 0x80, 0x3f, 0xff, 0xff, 0xf8, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xff, 0x9f, 0xc0, 0x1f, 0xff, 0xff, 0xf8, 0x00, 0x7f, 0x80, 0xff, 0x00, 0x7f, 0xc0, 0x3f, 0xf0, 0x0f, 0xfc, 0x00, 0x1f, 0xff, 0xff, 0xf0, 0x00, 0xfe, 0x00, 0x7f, 0x00, 0x3f, 0x80, 0x1f, 0xe0, 0x07, 0xf8, 0x00, 0x0f, 0xff, 0xff, 0xe0, 0x01, 0xfc, 0x00, 0x3e, 0x00, 0x1f, 0x00, 0x0f, 0xc0, 0x03, 0xf0, 0x00, 0x0f, 0xff, 0xff, 0xe0, 0x03, 0xf8, 0x00, 0x3e, 0x00, 0x1f, 0x00, 0x0f, 0xc0, 0x03, 0xf0, 0x00, 0x07, 0xff, 0xff, 0xc0, 0x07, 0xf8, 0x00, 0x3e, 0x00, 0x1f, 0x00, 0x0f, 0xc0, 0x03, 0xf0, 0x00, 0x03, 0xff, 0xff, 0xc0, 0x0f, 0xf8, 0x00, 0x3e, 0x00, 0x1f, 0x00, 0x0f, 0xc0, 0x03, 0xf0, 0x00, 0x03, 0xff, 0xff, 0x80, 0x0f, 0xf8, 0x00, 0x3e, 0x00, 0x1f, 0x00, 0x0f, 0xc0, 0x03, 0xf0, 0x00, 0x01, 0xff, 0xff, 0x80, 0x1f, 0xf8, 0x00, 0x3e, 0x00, 0x1f, 0x00, 0x0f, 0xc0, 0x03, 0xf0, 0x00, 0x01, 0xff, 0xff, 0x00, 0x3f, 0xf8, 0x00, 0x3e, 0x00, 0x1f, 0x00, 0x0f, 0xc0, 0x03, 0xf0, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xf8, 0x00, 0x3e, 0x00, 0x1f, 0x00, 0x0f, 0xc0, 0x03, 0xf0, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x7f, 0xf8, 0x00, 0x3e, 0x00, 0x1f, 0x00, 0x0f, 0xc0, 0x03, 0xf0, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x7f, 0xf8, 0x00, 0x3e, 0x00, 0x1f, 0x00, 0x0f, 0xc0, 0x03, 0xf0, 0x00, 0x00, 0xff, 0xfc, 0x00, 0xff, 0xf8, 0x00, 0x3e, 0x00, 0x1f, 0x00, 0x0f, 0xc0, 0x03, 0xf0, 0x00, 0x00, 0xff, 0xfc, 0x00, 0xff, 0xf8, 0x00, 0x3e, 0x00, 0x1f, 0x00, 0x0f, 0xc0, 0x03, 0xf0, 0x00, 0x00, 0xff, 0xfc, 0x01, 0xff, 0xf8, 0x00, 0x3e, 0x00, 0x1f, 0x00, 0x0f, 0xc0, 0x03, 0xf0, 0x00, 0x00, 0xff, 0xf8, 0x01, 0xff, 0xf8, 0x00, 0x3e, 0x00, 0x1f, 0x00, 0x0f, 0xc0, 0x03, 0xf0, 0x00, 0x00, 0xff, 0xf8, 0x03, 0xff, 0xf8, 0x00, 0x3e, 0x00, 0x1f, 0x00, 0x0f, 0xc0, 0x03, 0xf0, 0x00, 0x00, 0xff, 0xf0, 0x03, 0xff, 0xfc, 0x00, 0x7e, 0x00, 0x1f, 0x80, 0x1f, 0xe0, 0x07, 0xf8, 0x00, 0x00, 0xff, 0xf0, 0x07, 0xff, 0x7f, 0x80, 0xff, 0x00, 0x7f, 0xc0, 0x3f, 0xf0, 0x0f, 0xfc, 0x00, 0x00, 0xff, 0xf0, 0x07, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xff, 0x9f, 0xc0, 0x00, 0xff, 0xe0, 0x0f, 0xfc, 0x1f, 0xff, 0xf7, 0xff, 0xf9, 0xff, 0xfc, 0x7f, 0xff, 0x0f, 0x80, 0x00, 0xff, 0xe0, 0x0f, 0xf8, 0x07, 0xff, 0xc1, 0xff, 0xe0, 0x7f, 0xf0, 0x1f, 0xfc, 0x03, 0x00, 0x00, 0xff, 0xe0, 0x1f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc0, 0x1f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc0, 0x3f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc0, 0x3f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x80, 0x7f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x7f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xfe, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xfc, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf8, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf0, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x03, 0xe0, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x07, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0f, 0x80, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3e, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x7c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf8, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x81, 0xf0, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xe0, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; void setup() { Serial.begin(115200); if (!display.begin(SSD1309_SWITCHCAPVCC, SCREEN_ADDRESS)) { Serial.println(F("SSD1309 allocation failed")); for (;;); } display.clearDisplay(); display.display(); } void loop() { // Display small heart icon centered display.clearDisplay(); display.drawBitmap((SCREEN_WIDTH - 16) / 2, (SCREEN_HEIGHT - 16) / 2, heart_icon, 16, 16, SSD1309_PIXEL_ON); display.display(); delay(3000); // Display full-screen DIYables logo display.clearDisplay(); display.drawBitmap(0, 0, diyables_logo, SCREEN_WIDTH, SCREEN_HEIGHT, SSD1309_PIXEL_ON); display.display(); delay(3000); // Invert display display.invertDisplay(true); delay(2000); display.invertDisplay(false); delay(1000); }

※ 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 đó.

/* * Mã ESP32 này được phát triển bởi newbiely.vn * Mã ESP32 này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/esp32/esp32-ssd1309-oled-display */ /* * DIYables OLED SSD1309 – Contrast & Dim * Sweeps contrast from 0→255→0 then toggles dim mode on the 2.42" OLED with ESP32. */ #include <Wire.h> #include <Adafruit_GFX.h> #include <DIYables_OLED_SSD1309.h> #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_RESET -1 #define SCREEN_ADDRESS 0x3C DIYables_OLED_SSD1309 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); void setup() { Serial.begin(115200); if (!display.begin(SSD1309_SWITCHCAPVCC, SCREEN_ADDRESS)) { Serial.println(F("SSD1309 allocation failed")); for (;;); } // Draw a test pattern so the contrast changes are visible display.clearDisplay(); display.fillRect(0, 0, 64, 32, SSD1309_PIXEL_ON); display.fillRect(64, 32, 64, 32, SSD1309_PIXEL_ON); display.setTextSize(1); display.setTextColor(SSD1309_PIXEL_INVERSE); display.setCursor(16, 28); display.println(F("Contrast Demo")); display.display(); delay(2000); } void loop() { // Ramp up for (int c = 0; c <= 255; c += 5) { display.setContrast((uint8_t)c); delay(30); } delay(1000); // Ramp down for (int c = 255; c >= 0; c -= 5) { display.setContrast((uint8_t)c); delay(30); } delay(1000); // Quick dim toggle display.dim(true); // minimum brightness delay(2000); display.dim(false); // restore delay(2000); }

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.
/* * Mã ESP32 này được phát triển bởi newbiely.vn * Mã ESP32 này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/esp32/esp32-ssd1309-oled-display */ /* * DIYables OLED SSD1309 – External Fonts * Cycles through three FreeFont typefaces on the 2.42" SSD1309 OLED with ESP32. */ #include <Wire.h> #include <Adafruit_GFX.h> #include <DIYables_OLED_SSD1309.h> #include <Fonts/FreeSerif9pt7b.h> #include <Fonts/FreeSansBold12pt7b.h> #include <Fonts/FreeMono9pt7b.h> #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_RESET -1 #define SCREEN_ADDRESS 0x3C DIYables_OLED_SSD1309 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); void setup() { Serial.begin(115200); if (!display.begin(SSD1309_SWITCHCAPVCC, SCREEN_ADDRESS)) { Serial.println(F("SSD1309 allocation failed")); for (;;); } display.clearDisplay(); display.display(); } void loop() { // ── Built-in 5×7 font ── display.clearDisplay(); display.setFont(NULL); display.setTextSize(1); display.setTextColor(SSD1309_PIXEL_ON); display.setCursor(0, 0); display.println(F("Built-in 5x7 font")); display.println(); display.setTextSize(2); display.println(F("DIYables")); display.display(); delay(3000); // ── FreeSerif 9pt ── display.clearDisplay(); display.setFont(&FreeSerif9pt7b); display.setTextSize(1); display.setTextColor(SSD1309_PIXEL_ON); display.setCursor(0, 14); // Y = baseline display.println(F("FreeSerif 9pt")); display.setCursor(0, 38); display.println(F("DIYables OLED")); display.setCursor(0, 58); display.println(F("Hello World!")); display.display(); delay(3000); // ── FreeSansBold 12pt ── display.clearDisplay(); display.setFont(&FreeSansBold12pt7b); display.setTextSize(1); display.setTextColor(SSD1309_PIXEL_ON); display.setCursor(0, 20); display.println(F("SansBold")); display.setCursor(0, 52); display.println(F("DIYables")); display.display(); delay(3000); // ── FreeMono 9pt ── display.clearDisplay(); display.setFont(&FreeMono9pt7b); display.setTextSize(1); display.setTextColor(SSD1309_PIXEL_ON); display.setCursor(0, 14); display.println(F("FreeMono 9pt")); display.setCursor(0, 34); display.println(F("0123456789")); display.setCursor(0, 54); display.println(F("!@#$%^&*()")); display.display(); delay(3000); }

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, VCCGND đượ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ế:
// I2C address scanner — in mọi thiết bị được phát hiện ra Serial Monitor #include <Wire.h> void setup() { Wire.begin(); Serial.begin(9600); Serial.println("I2C Scanner"); } void loop() { byte error, address; int nDevices = 0; Serial.println("Scanning..."); for (address = 1; address < 127; address++) { Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { Serial.print("I2C device found at address 0x"); if (address < 16) Serial.print("0"); Serial.print(address, HEX); Serial.println(" !"); nDevices++; } else if (error == 4) { Serial.print("Unknown error at address 0x"); if (address < 16) Serial.print("0"); Serial.println(address, HEX); } } if (nDevices == 0) Serial.println("No I2C devices found"); else Serial.println("done"); delay(5000); }

Đầu ra Serial Monitor mong đợi khi SSD1309 được phát hiện:

COM6
Send
Scanning... I2C device found at address 0x3C ! done
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Đả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