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.
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.
- 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 2)
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.
SPI.h
: Thư viện này cho phép giao tiếp thông qua giao tiếp chuẩn SPI (Serial Peripheral Interface).
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_WIDTH
vàSCREEN_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ệnhSerial.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.