Hướng dẫn sử dụng màn hình OLED 0.96 với Arduino (Phần 1)
Màn hình OLED 0.96 là một loại màn hình hiển thị đồ họa nhỏ gọn và giá thành rẻ được sử dụng rộng rãi trong các dự án Arduino. Với khả năng hiển thị văn bản, đồ họa và biểu đồ, màn hình OLED cho phép bạn tạo ra các giao diện tương tác một cách trực quan.
Trong hướng dẫn này, các bạn sẽ tìm hiểu cách kết nối và sử dụng OLED 0.96 với Arduino thông qua giao tiếp I2C hoặc SPI, và thực hiện nhiều dự án vô cùng thú vị.
Linh kiện cần thiết cho dự án
TÊN LINH KIỆN | SỐ LƯỢNG | NƠI BÁN |
Arduino Uno R3 | 1 | Shopee | Cytron |
Màn hình OLED I2C + SPI | 1 | Shopee | Cytron |
Dây cắm | 10-20 | Shopee | Cytron |
Breadboard | 1 | Shopee | Cytron |
Tổng quan về màn hình OLED 0.96
Màn hình OLED 0.96 là một loại màn hình hiển thị sử dụng công nghệ Organic Light Emitting Diode (OLED). Kích thước màn hình thường là 0.96 inch, đây là kích thước phổ biến được sử dụng trong nhiều ứng dụng nhỏ gọn.
OLED 0.96 có độ phân giải thường là 128×64 pixel, tức là có 128 điểm ảnh trên chiều ngang và 64 điểm ảnh trên chiều dọc. Với độ phân giải này, màn hình có thể hiển thị các đồ họa, ký tự và biểu đồ đơn giản.
Một trong những đặc điểm nổi bật của màn hình OLED là khả năng tự phát sáng của các pixel. Mỗi pixel trên màn hình OLED có thể tự phát ra ánh sáng mà không cần đèn nền phụ trợ như các loại màn hình khác. Điều này cho phép màn hình OLED có độ tương phản cao, màu sắc tươi sáng và góc nhìn rộng.
Màn hình OLED 0.96 thường được kết nối với Arduino thông qua giao tiếp I2C hoặc SPI. Có sẵn các thư viện hỗ trợ để điều khiển màn hình OLED trên Arduino IDE.
Nguồn (Power)
Màn hình OLED không yêu cầu đèn nền như màn hình LCD ký tự, vì nó tự phát sáng. Điều này giúp màn hình OLED có độ tương phản cao, góc nhìn rộng và khả năng hiển thị màu đen sâu. Bởi vì không có đèn nền, năng lượng tiêu thụ của màn hình giảm đáng kể. Trung bình, màn hình OLED sử dụng khoảng 20mA, nhưng điều này có thể thay đổi tùy thuộc vào độ sáng của màn hình.
Bộ điều khiển SSD1306 hoạt động ở điện áp từ 1,65V đến 3,3V, trong khi tấm nền OLED yêu cầu điện áp nguồn từ 7V đến 15V. Các yêu cầu nguồn cấp khác nhau này được đáp ứng bởi mạch bơm sạc (Charge pump) bên trong màn hình. Điều này cho phép kết nối màn hình OLED với Arduino hoặc bất kỳ bộ vi điều khiển logic 5V nào khác mà không cần sử dụng bộ chuyển đổi mức logic.
Bản đồ bộ nhớ OLED (OLED Memory Map)
Để điều khiển màn hình OLED, việc hiểu bản đồ bộ nhớ là rất quan trọng.
Dù kích thước của màn hình OLED là bao nhiêu, bộ điều khiển SSD1306 bao gồm một RAM Dữ liệu Hiển thị Đồ họa (GDDRAM) có dung lượng 1KB để lưu trữ các mẫu bit sẽ được hiển thị trên màn hình. Vùng nhớ 1KB này được chia thành 8 trang (từ 0 đến 7). Mỗi trang có 128 cột/đoạn (khối 0 đến 127). Và, mỗi cột có thể lưu trữ 8 bit dữ liệu (từ 0 đến 7). Tổng cộng:
8 trang x 128 cột x 8 bit = 8192 bit = 1024 byte = 1KB bộ nhớ
Toàn bộ bộ nhớ 1KB này, bao gồm các trang, cột và dữ liệu, được đánh dấu như sau:
Mỗi bit đại diện cho một pixel OLED duy nhất trên màn hình và có thể được chương trình BẬT hoặc TẮT.
Thông số kỹ thuật
Display Technology | OLED (Organic LED) |
MCU Interface | I2C / SPI |
Screen Size | 0.96 Inch Across |
Resolution | 128×64 pixels |
Operating Voltage | 3.3V – 5V |
Operating Current | 20mA max |
Viewing Angle | 160° |
Characters Per Row | 21 |
Number of Character Rows | 7 |
Sơ đồ chân màn hình OLED 0.96
Màn hình OLED 0.96 I2C
- VCC: là nguồn cấp cho màn hình có thể là 3.3V hoặc 5V
- GND: chân nối đất
- SCL: chân xung clock
- SDA: chân dữ liệu nối tiếp
Màn hình OLED 0.96 SPI
- VCC: là nguồn cấp cho màn hình có thể là 3.3V hoặc 5V
- GND: chân nối đất
- D0/CLK: chân xung clock
- D1/MOSI: được sử dụng để gửi dữ liệu từ Arduino đến màn hình OLED
- RES (Reset): được sử dụng để thiết lập lại màn hình OLED
- CS: được sử dụng để chọn màn hình OLED trong giao tiếp SPI
- DC: được sử dụng để xác định liệu dữ liệu đang được gửi qua bus SPI là một lệnh hay dữ liệu hiển thị
Sơ đồ đấu nối màn hình OLED với Arduino
Sơ đồ đấu nối màn hình OLED I2C
Arduino UNO R3 | Màn hình OLED SPI |
5V | VCC |
GND | GND |
A4 | SDA |
A5 | SCL |
Sơ đồ đấu nối màn hình OLED SPI
Arduino UNO R3 | Màn hình OLED I2C |
5V | VCC |
GND | GND |
9 | D1/MOSI |
10 | D0/CLK |
11 | DC |
12 | CS |
13 | RES (Reset) |
Cài đặt thư viện
Một trong những thư viện hỗ trợ để điều khiển màn hình OLED đó là Adafruit SSD1306. Để cài đặt các bạn truy cập vào đường dẫn sau: Sketch > Include Library > Manage Libraries…
Nhập từ khóa ‘adafruit ssd1306‘ vào ô tìm kiếm, tìm đến thư viện của Adafruit và tiến hành cài đặt.
Để hiển thị các điểm đồ họa như: đường thẳng, hình tròn và hình chữ nhật…các bạn cần cài thêm thư viện Adafruit GFX.
Cài đặt thêm thư viện Adafruit Bus IO để giao tiếp các bus I2C, UART, SPI.
Code hiển thị văn bản trên màn hình OLED 0.96
#include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels // Declaration for SSD1306 display connected using I2C #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) #define SCREEN_ADDRESS 0x3C Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // Declaration for SSD1306 display connected using software SPI: //#define OLED_MOSI 9 //#define OLED_CLK 10 //#define OLED_DC 11 //#define OLED_CS 12 //#define OLED_RESET 13 //Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS); void setup() { Serial.begin(9600); // initialize the OLED object if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { Serial.println(F("SSD1306 allocation failed")); for(;;); // Don't proceed, loop forever } // Uncomment this if you are using SPI //if(!display.begin(SSD1306_SWITCHCAPVCC)) { // Serial.println(F("SSD1306 allocation failed")); // for(;;); // Don't proceed, loop forever //} // Clear the buffer. display.clearDisplay(); // Display Text display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,28); display.println("Hello world!"); display.display(); delay(2000); display.clearDisplay(); // Display Inverted Text display.setTextColor(BLACK, WHITE); // 'inverted' text display.setCursor(0,28); display.println("Hello world!"); display.display(); delay(2000); display.clearDisplay(); // Changing Font Size display.setTextColor(WHITE); display.setCursor(0,24); display.setTextSize(2); display.println("Hello!"); display.display(); delay(2000); display.clearDisplay(); // Display Numbers display.setTextSize(1); display.setCursor(0,28); display.println(123456789); display.display(); delay(2000); display.clearDisplay(); // Specifying Base For Numbers display.setCursor(0,28); display.print("0x"); display.print(0xFF, HEX); display.print("(HEX) = "); display.print(0xFF, DEC); display.println("(DEC)"); display.display(); delay(2000); display.clearDisplay(); // Display ASCII Characters display.setCursor(0,24); display.setTextSize(2); display.write(3); display.display(); delay(2000); display.clearDisplay(); // Scroll full screen display.setCursor(0,0); display.setTextSize(1); display.println("Full"); display.println("screen"); display.println("scrolling!"); display.display(); display.startscrollright(0x00, 0x07); delay(2000); display.stopscroll(); delay(1000); display.startscrollleft(0x00, 0x07); delay(2000); display.stopscroll(); delay(1000); display.startscrolldiagright(0x00, 0x07); delay(2000); display.startscrolldiagleft(0x00, 0x07); delay(2000); display.stopscroll(); display.clearDisplay(); // Scroll part of the screen display.setCursor(0,0); display.setTextSize(1); display.println("Scroll"); display.println("some part"); display.println("of the screen."); display.display(); display.startscrollright(0x00, 0x00); } void loop() { }
Giải thích Code
#include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h>
Sử dụng #include khai báo các thư viện cần thiết để sử dụng các chức năng và phương pháp điều khiển màn hình OLED 0.96 trong chương trình Arduino.
#define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels // Declaration for SSD1306 display connected using I2C #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) #define SCREEN_ADDRESS 0x3C Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
SCREEN_WIDTH 128
và SCREEN_HEIGHT 64
, định nghĩa cho chiều rộng và chiều cao của màn hình OLED.
Giá trị -1 cho biến này có nghĩa là không sử dụng chân reset riêng lẻ của Arduino, và chân reset của Arduino sẽ được sử dụng chung với màn hình OLED.
Địa chỉ 0x3C được sử dụng trong trường hợp kết nối màn hình OLED thông qua giao tiếp I2C.
// Declaration for SSD1306 display connected using software SPI: //#define OLED_MOSI 9 //#define OLED_CLK 10 //#define OLED_DC 11 //#define OLED_CS 12 //#define OLED_RESET 13 //Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
Code này mình đang sử dụng màn hình I2C để làm ví dụ, trong trường hợp bạn muốn sử dụng màn hình SPI thì bỏ comment phía trước.
// initialize the OLED object if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { Serial.println(F("SSD1306 allocation failed")); for(;;); // Don't proceed, loop forever } // Uncomment this if you are using SPI //if(!display.begin(SSD1306_SWITCHCAPVCC)) { // Serial.println(F("SSD1306 allocation failed")); // for(;;); // Don't proceed, loop forever //} // Clear the buffer. display.clearDisplay();
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) Đây là lệnh khởi tạo màn hình OLED và cấu hình nó để sử dụng giao tiếp I2C. Hàm begin() trả về giá trị true nếu khởi tạo thành công và false nếu không thành công. Trong trường hợp không thành công, dòng mã Serial.println(F(“SSD1306 allocation failed”)); được sử dụng để in thông báo lỗi ra cổng Serial.
for(;;);
Trong trường hợp khởi tạo màn hình OLED không thành công, sử dụng vòng lặp vô hạn for(;;); để dừng lại và không thực hiện bất kỳ hành động nào tiếp theo. Điều này đảm bảo rằng chương trình không tiếp tục chạy nếu không thể khởi tạo màn hình.
display.clearDisplay();
Được sử dụng để xóa bộ đệm của màn hình OLED. Điều này đảm bảo rằng màn hình sẽ bắt đầu với nền trắng và không có nội dung được hiển thị.
Xem phần 2: Hướng dẫn sử dụng màn hình OLED 0.96 với Arduino (Phần 2)