ESP32 Multiplexer – Cách sử dụng bộ ghép kênh I2C với màn hình OLED

Trong bài hướng dẫn chủ đề ESP32 Multiplexer I2C này, chúng ta cùng tìm hiểu cách mở rộng các cổng I2C trên mạch ESP32 (hoặc ESP8266 và Arduino), bằng cách sử dụng bộ Multiplexer TCA9458A. Đây là một module khá hiệu ích khi bạn muốn điều khiển nhiều thiết bị I2C có cùng địa chỉ I2C, ví dụ như dùng nhiều màn hình OLED hoặc nhiều cảm biến nhiệt độ độ ẩm DHT20 trong cùng 1 dự án.

Bộ ghép kênh I2C TCA9548A 1 to 8 là gì?

Giao thức truyền thông I2C cho phép bạn giao tiếp với nhiều thiết bị I2C khác nhau trên cùng 1 bus, miễn là mỗi thiết bị có 1 địa chỉ I2C duy nhất. Tuy nhiên, nếu các thiết bị này có cùng địa chỉ thì giao thức này sẽ không phục vụ hết được.

Module bộ ghép kênh I2C TCA9548A 1 to 8 được ra đời để giải quyết vấn đề đó. Module này giúp hệ thống giao tiếp với tối đa 8 thiết bị I2C có cùng địa chỉ I2C.

Bộ ghép kênh I2C giao tiếp với mạch lập trình như ESP32 thông qua giao thức I2C. Khi đó, bạn có thể chọn cổng I2C bất kỳ trên bộ ghép kênh mà mình muốn xử lý.

Để đánh địa chỉ cụ thể của một cổng, bạn cần gửi 1 byte đơn tới bộ ghép kênh, với số cổng đầu ra mình muốn:

Bộ ghép kênh I2C TCA9548A 1 to 8 là gì?

Thông tin của bộ ghép kênh ESP32 Multiplexer TCA9548A 1 to 8:

  • 1 đến 8 công tắc dịch 2 chiều
  • Reset input hoạt động ở mức thấp
  • Hỗ trợ tối đa 8 thiết bị I2C
  • Hỗ trợ chọn kênh thông qua bus I2C
  • Điện áp hoạt động: 1.65V – 5.5V

Địa chỉ I2C của bộ ghép kênh I2C TCA9548A 1 to 8

Bộ ghép kênh I2C TCA9548A giao tiếp với vi mạch điều khiển thông qua giao thức truyền thông I2C, chỉ với 1 cổng I2C duy nhất.

Bạn có thể cấu hình địa chỉ I2C này, bằng cách chọn giá trị từ 0x70 đến 0x77 thông qua giá trị của các chân A0, A1 và A2 như bảng bên dưới:

A0A1A2Địa chỉ I2C
LOWLOWLOW0x70
HIGHLOWLOW0x71
LOWHIGHLOW0x72
HIGHHIGHLOW0x73
LOWLOWHIGH0x74
HIGHLOWHIGH0x75
LOWHIGHHIGH0x76
HIGHHIGHHIGH0x77

Do đó, bạn có thể kết nối tối đa 8 bộ ghép kênh I2C với cùng 1 bus I2C, điều đó giúp bạn kết nối 64 thiết bị có cùng địa chỉ thông qua 1 bus I2C của bộ vi điều khiển.

Ví dụ: Nếu bạn kết nối A0, A1 và A2 sang GND, chúng đặt địa chỉ 0x70 cho bộ ghép kênh.

Sơ đồ chân

Dưới đây là bảng mô tả chi tiết về sơ đồ chân:

PinMô tả
VINCấp nguồn cho bộ ghép kênh I2C
GNDKết nối với GND
SDAKết nối với chân SDA của vi điều khiển chính
SCLKết nối với chân SCL của vi điều khiển chính
RSTChân RST thấp đang hoạt động—có thể được sử dụng để đặt lại bộ ghép kênh
A0Chọn địa chỉ I2C của bộ ghép kênh—kết nối với GND hoặc VCC
A1Chọn địa chỉ I2C của bộ ghép kênh—kết nối với GND hoặc VCC
A2Chọn địa chỉ I2C của bộ ghép kênh—kết nối với GND hoặc VCC
SD0SDA cho kênh 0
SC0SCL cho kênh 0
SD1SDA cho kênh 1
SC1SCL cho kênh 1
SD2SDA cho kênh 2
SC2SCL cho kênh 2
SD3SDA cho kênh 3
SC3SCL cho kênh 3
SD4SDA cho kênh 4
SC4SCL cho kênh 4
SD5SDA cho kênh 5
SC5SCL cho kênh 5
SD6SDA cho kênh 6
SC6SCL cho kênh 6
SD7SDA cho kênh 7
SC7SCL cho kênh 7

Chọn bus I2C cho bộ ghép kênh I2C TCA9548A

Như đã đề cập trước đó, chúng ta cần gửi 1 byte đơn đến bộ ghép kênh với số cổng output I2C mong muốn (từ 0 đến 7), ví dụ:

void TCA9548A(uint8_t bus){
  Wire.beginTransmission(0x70);  // Địa chỉ của TCA9548A là 0x70
  Wire.write(1 << bus);          // Gửi byte đơn để chọn bus I2C
  Wire.endTransmission();
  Serial.print(bus);
}

Sau đó, bạn cần gọi hàm và chuyển đổi làm đối số (là số bus I2C mà bạn muốn kiểm soát), trước khi gửi lệnh.

Ví dụ, muốn điều khiển linh kiện được kết nối với ESP32 Multiplexer qua cổng bus số 3, bạn sẽ ghi thêm dòng sau trước khi gọi các lệnh I2C:

TCA9548A(2);

Dưới đây, mình sẽ làm 1 ví dụ minh họa về dự án ESP32 Multiplexer này để bạn dễ hình dung hơn.

Dự án ESP32 Multiplexer – Điều khiển nhiều màn hình OLED

Mình sẽ hướng dẫn bạn cách điều khiển nhiều màn hình OLED, chỉ với 1 mạch ESP32. Như ví dụ dưới, mình sẽ điều khiển 4 OLED, còn bạn có thể điều khiển nhiều hơn (tối đa là 8 màn hình).

Chuẩn bị phần cứng

  • Mạch ESP32
  • Bộ ghép kênh I2C TCA9548A
  • Nhiều màn hình OLED tùy thích (tối đa là 8)
  • Breadboard
  • Dây Jumper

Kết nối phần cứng

Bạn kết nối 4 màn hình OLED như hình minh họa bên dưới (mình đang dùng bus số 2, 3, 4 và 5 để minh họa, bạn có thể chọn bất kỳ cổng nào khác).

Ngoài ra, mình cũng kết nối A0, A1 và A2 tới cổng GND. Điều này có nghĩa là mình đang chọn địa chỉ 0x70 cho bộ ghép kênh:

Dự án ESP32 Multiplexer - Nhiều màn hình OLED kết nối qua bộ ghép kênh I2C

Nếu bạn sử dụng mạch lập trình khác, không phải là ESP32, bạn có thể tham khảo cách kết nối sau:

Loại vi điều khiểnI2C Pins
ESP32GPIO 22 (SCL), GPIO 21 (SDA)
ESP8266GPIO 5 (D1) (SCL), GPIO 4 (D2) (SDA)
Arduino UnoA5 (SCL), A4 (SDA)

Cài đặt thư viện

Để tiến hành dự án ESP32 Multiplexer này, bạn cần cài đặt các thư viện sau:

Bạn có thể mở Arduino IDE, click theo đường dẫn Sketch > Include Library > Manage Libraries và tìm kiếm tên thư viện trên rồi cài đặt nhé!

Nếu bạn đang dùng VS Code trên PlatformIO, bạn copy đoạn code sau vào file platformio.ini nhé:

lib_deps = adafruit/Adafruit SSD1306@^2.4.6
	adafruit/Adafruit GFX Library@^1.10.10

Lập trình

Sau khi cài thư viện xong, bạn copy đoạn code sau vào Arduino IDE của mình và upload code lên mạch là được:

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

// Chọn I2C BUS
void TCA9548A(uint8_t bus){
  Wire.beginTransmission(0x70);  // Địa chỉ TCA9548A 
  Wire.write(1 << bus);          // Gửi byte để chọn bus
  Wire.endTransmission();
  Serial.print(bus);
}
 
void setup() {
  Serial.begin(115200);

  // Khởi tạo kết nối I2C với ESP32 Multiplexer
  Wire.begin();

  // Init OLED display on bus number 2
  TCA9548A(2);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  } 
  // Clear the buffer
  display.clearDisplay();

  // Init OLED display on bus number 3
  TCA9548A(3);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  } 
  // Clear the buffer
  display.clearDisplay();

  // Init OLED display on bus number 4
  TCA9548A(4);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  } 
  // Clear the buffer
  display.clearDisplay();

  // Init OLED display on bus number 5
  TCA9548A(5);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  } 
  // Clear the buffer
  display.clearDisplay();

  // Write to OLED on bus number 2
  TCA9548A(2);
  display.clearDisplay();
  display.setTextSize(8);
  display.setTextColor(WHITE);
  display.setCursor(45, 10);
  // Display static text
  display.println("1");
  display.display(); 

  // Write to OLED on bus number 3
  TCA9548A(3);
  display.clearDisplay();
  display.setTextSize(8);
  display.setTextColor(WHITE);
  display.setCursor(45, 10);
  // Display static text
  display.println("2");
  display.display(); 
  
  // Write to OLED on bus number 4
  TCA9548A(4);
  display.clearDisplay();
  display.setTextSize(8);
  display.setTextColor(WHITE);
  display.setCursor(45, 10);
  // Display static text
  display.println("3");
  display.display(); 
  
  // Write to OLED on bus number 5
  TCA9548A(5);
  display.clearDisplay();
  display.setTextSize(8);
  display.setTextColor(WHITE);
  display.setCursor(45, 10);
  // Display static text
  display.println("4");
  display.display(); 
}
 
void loop() {
  
}

Demo dự án ESP32 Multiplexer với màn hình OLED

Sau khi upload code vào màn hình, bạn sẽ thấy 4 màn hình OLED hiển thị 4 thông tin (4 số đếm) khác nhau như hình:

Demo dự án ESP32 Multiplexer với màn hình OLED

Lời kết

Qua bài viết trên, hy vọng bạn đã biết cách sử dụng bộ ghép kênh I2C để ứng dụng vào dự án của mình. Bạn đã hoàn thành dự án ESP32 Multiplexer này chưa? Chia sẻ với IoTZone nhé!

IoTZone – Chuyên cung cấp thiết bị điện tử & tài liệu cho Makers

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *