Giao tiếp màn hình OLED 0.96 với ESP8266 NodeMCU (Phần 1)

Giao tiếp màn hình OLED 0.96 với ESP8266 NodeMCU (Phần 1)

Màn hình OLED 0.96 được sử dụng phổ biến trong các dự án ESP8266 do tính nhỏ gọn và giá thành phải chăng của nó. 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ẽ cùng mình tìm hiểu cách kết nối và sử dụng màn hình OLED 0.96 với ESP8266 NodeMCU thông qua giao tiếp I2C.

Để 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
ESP8266 NodeMCU 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 thường là 0.96 inch, là kích thước phổ biến được sử dụng trong nhiều ứng dụng yêu cầu nhỏ gọn.

Màn hình OLED 0.96 có độ phân giải 128×64 pixel, có nghĩa 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 điểm đặc biệ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 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 ESP8266 NodeMCU thông qua giao tiếp I2C hoặc SPI. Arduino IDE cung cấp các thư viện hỗ trợ để điều khiển màn hình OLED này.

Bản đồ bộ nhớ OLED (OLED Memory Map)

Để điều khiển màn hình OLED, hiểu về bản đồ bộ nhớ là rất quan trọng.

Bộ điều khiển SSD1306 bao gồm một RAM Dữ liệu Hiển thị Đồ họa (GDDRAM) với 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 đại diện bằng các bit. 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 (ON) hoặc TẮT (OFF).

Sơ đồ đấu nối màn hình OLED 0.96 I2C với ESP8266 NodeMCU

ESP8266 NodeMCU Màn hình OLED SPI
3.3V VCC
GND GND
D2 SDA
D1 SCL

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, bạn có thể làm như sau: Sketch > Include Library > Manage Libraries…

Trong ô tìm kiếm, nhập từ khóa ‘adafruit ssd1306’ và tìm đến thư viện của Adafruit. Chọn phiên bản mới nhất và tiến hành cài đặt.

Ngoài ra, để hiển thị các điểm đồ họa như đường thẳng, hình tròn và hình chữ nhật, bạn cần cài thêm thư viện Adafruit GFX.

Để giao tiếp qua các bus I2C, UART, SPI, bạn cũng cần cài đặt thêm thư viện Adafruit Bus IO.

Code OLED 0.96 với ESP8266 – Hiển thị văn bản

#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
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

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
  }

  // 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>

Khai báo các thư viện cần thiết cho việc điều khiển màn hình OLED SSD1306 thông qua giao tiếp SPI hoặc I2C.

  • Wire.h: Thư viện này cho phép giao tiếp thông qua giao tiếp chuẩn I2C (Inter-Integrated Circuit).
  • Adafruit_GFX.h: Đây là một thư viện đồ họa cung cấp các phương pháp để vẽ và điều khiển các đối tượng đồ họa trên màn hình.
  • Adafruit_SSD1306.h: Đây là thư viện chính để điều khiển màn hình OLED SSD1306. Nó cung cấp các phương pháp để khởi tạo, điều khiển, và hiển thị nội dung lên màn hình.
#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
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

Đoạn mã trên định nghĩa các hằng số và khởi tạo đối tượng Adafruit_SSD1306 để điều khiển màn hình OLED SSD1306 thông qua giao tiếp I2C.

  • SCREEN_WIDTHSCREEN_HEIGHT là hai hằng số được định nghĩa để xác định kích thước của màn hình OLED. Trong trường hợp này, chiều rộng là 128 pixel và chiều cao là 64 pixel.
  • OLED_RESET là hằng số đại diện cho chân reset của màn hình OLED. Giá trị -1 được sử dụng để chỉ định rằng không có chân reset nào được sử dụng.
  • SCREEN_ADDRESS là địa chỉ I2C của màn hình OLED. Trong ví dụ này, địa chỉ 0x3C được sử dụng để xác định màn hình OLED.

Cuối cùng, Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); khởi tạo đối tượng display của lớp Adafruit_SSD1306. Đối tượng này sẽ được sử dụng để giao tiếp và điều khiển màn hình OLED SSD1306 thông qua giao tiếp I2C.

// initialize the OLED object
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
	Serial.println(F("SSD1306 allocation failed"));
	for(;;); // Don't proceed, loop forever
}

// Clear the buffer.
display.clearDisplay();

Thực hiện khởi tạo và xóa bộ nhớ đệm của màn hình OLED.

  • display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS) được sử dụng để khởi tạo màn hình OLED. Tham số SSD1306_SWITCHCAPVCC chỉ định cách cấp nguồn cho màn hình và SCREEN_ADDRESS là địa chỉ I2C của màn hình. Nếu khởi tạo không thành công, dòng lệnh Serial.println(F("SSD1306 allocation failed")); được thực hiện để thông báo lỗi và sau đó chương trình sẽ dừng lại ở vòng lặp vô hạn (for(;;);) để không tiếp tục thực hiện các câu lệnh tiếp theo.
  • display.clearDisplay() được sử dụng để xóa bộ nhớ đệm của màn hình OLED. Điều này đảm bảo rằng màn hình sẽ hiển thị một trạng thái trắng trống ban đầu mà không có bất kỳ nội dung nào.

Bài viết liên quan

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments