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:
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:
A0 | A1 | A2 | Địa chỉ I2C |
LOW | LOW | LOW | 0x70 |
HIGH | LOW | LOW | 0x71 |
LOW | HIGH | LOW | 0x72 |
HIGH | HIGH | LOW | 0x73 |
LOW | LOW | HIGH | 0x74 |
HIGH | LOW | HIGH | 0x75 |
LOW | HIGH | HIGH | 0x76 |
HIGH | HIGH | HIGH | 0x77 |
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:
Pin | Mô tả |
VIN | Cấp nguồn cho bộ ghép kênh I2C |
GND | Kết nối với GND |
SDA | Kết nối với chân SDA của vi điều khiển chính |
SCL | Kết nối với chân SCL của vi điều khiển chính |
RST | Chân RST thấp đang hoạt động—có thể được sử dụng để đặt lại bộ ghép kênh |
A0 | Chọn địa chỉ I2C của bộ ghép kênh—kết nối với GND hoặc VCC |
A1 | Chọn địa chỉ I2C của bộ ghép kênh—kết nối với GND hoặc VCC |
A2 | Chọn địa chỉ I2C của bộ ghép kênh—kết nối với GND hoặc VCC |
SD0 | SDA cho kênh 0 |
SC0 | SCL cho kênh 0 |
SD1 | SDA cho kênh 1 |
SC1 | SCL cho kênh 1 |
SD2 | SDA cho kênh 2 |
SC2 | SCL cho kênh 2 |
SD3 | SDA cho kênh 3 |
SC3 | SCL cho kênh 3 |
SD4 | SDA cho kênh 4 |
SC4 | SCL cho kênh 4 |
SD5 | SDA cho kênh 5 |
SC5 | SCL cho kênh 5 |
SD6 | SDA cho kênh 6 |
SC6 | SCL cho kênh 6 |
SD7 | SDA cho kênh 7 |
SC7 | SCL 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:
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ển | I2C Pins |
ESP32 | GPIO 22 (SCL), GPIO 21 (SDA) |
ESP8266 | GPIO 5 (D1) (SCL), GPIO 4 (D2) (SDA) |
Arduino Uno | A5 (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:
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
- Website: https://www.iotzone.vn/
- Fanpage: https://www.facebook.com/Iotzonemaker
- SDT: 0364174499
- Zalo: https://zalo.me/0364174499