Hướng dẫn sử dụng màn hình OLED 0.96 với Arduino (Phần 1)

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ị.

Để tạo động lực cho Team Arduino KIT ra nhiều bài viết chất lượng hơn, các bạn có thể ủng hộ mình bằng cách Donate qua MoMo, Ngân hàng, Paypal…Nhấn vào link bên dưới nhé.

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 128SCREEN_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)

Bài viết liên quan

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments