این ماژول یک هدر برد چیپ TCA9548A می باشد . TCA9548A قابلیت کنترل تا هشت خروجی I2C را تنها از طریق یک باس I2C دارد . در ارتباط I2C هر چیپ یا ماژول دارای یک آدرس اختصاصی 7 بیتی می باشند . Master از طریق این آدرس ها با چیپ هایی که بر روی باس I2C قرار دارند ارتباط برقرار می کند . در این ارتباط نباید آدرس چیپ هایی که بر روی باس I2C قرار دارند تکراری باشد چرا که تداخل به وجود می آید . گاهی بعضی از چیپ ها همانند سنسور های دیجتالی که از طریق I2C کنترل می شوند دارای آدرس ثابت و غیر قابل تغییر هستند . در این مواقع می توان از ماژول TCA9548 استفاده نمود . این ماژول می تواند تا هشت ارتباط I2C را با آدرس های مشترک و یا متفاوت داشته باشد . به راحتی توسط این ماژول می توانید چندین OLED را توسط یک باس I2C کنترل کنید . یکی از مزیت های مهم این ماژول ، قابلیت تغییر آدرس I2C آن است .
مشخصات :
قابلیت کنترل هشت باس I2C از طریق یک باس I2C
دارای 8 آدرس مختلف I2C
ولتاژ کاری 1.8 ولت تا 5 ولت
فرکانس کاری تا 400KHz
این ماژول دارای 24 پین به صورت زیر است :
سه پین I2C Address جهت تغییر آدرس I2C برد می باشد که می توان آن ها را در حالت های زیر قرار داد :
مثال آردوینو :
/* Arduino I2C Multiplexer TCA9548A with two I2C Oled
Created by Yvan / https://Brainy-Bits.com
This code is in the public domain...
You can: copy it, use it, modify it, share it or just plain ignore it!
Thx!
*/
#include <U8glib.h> // Library for OlED display https://github.com/olikraus/u8glib/
#include <I2CMux.h> // Library for TCA9548A by Alvaro Ferran https://github.com/alvaroferran/I2C-multiplexer
#include <Wire.h>
#define I2CMulti_Addr 0x70 // Address of the I2C Multiplexer board
#define change_switch 10 // Tact switch used to select which OLED to use
#define increase_count_switch 11 // Tact switch used to increase the counter
int selected_oled=2; // Use to keep track of which I2C channel is selected on the Multiplexer
I2CMux I2CMulti(I2CMulti_Addr); // Init of the multiplexer library
int Oled1c=0; // Counter variable for OLED #1
int Oled2c=0; // Counter variable for OLED #2
U8GLIB_SSD1306_128X32 First_Oled(U8G_I2C_OPT_FAST); // Init of the OLED #1 using I2C
U8GLIB_SSD1306_128X32 Second_Oled(U8G_I2C_OPT_FAST); // Init of the OLED #2 using I2C
void setup() {
Wire.begin();
// Using Input Pullups for the tact switches
pinMode(change_switch, INPUT_PULLUP);
pinMode(increase_count_switch, INPUT_PULLUP);
// Rotate screen 180 degrees on OLED, uncomment if required
//u8gDHT.setRot180();
// Select font to use
First_Oled.setFont(u8g_font_unifont);
Second_Oled.setFont(u8g_font_unifont);
I2CMulti.switchToBus(2); // Switch to multiplexer i2c channel #2
First_Oled.setContrast(100); // Set oled contrast at startup
// Put stuff on OLED at startup
First_Oled.firstPage();
do {
First_Oled.drawStr( 88, 10, "|");
First_Oled.drawStr( 0, 32, "Oled #");
First_Oled.setPrintPos(50, 32);
First_Oled.print(Oled1c, 1);
First_Oled.drawStr( 88, 32, "|");
}
while( First_Oled.nextPage() );
I2CMulti.switchToBus(7);
Second_Oled.setContrast(0);
Second_Oled.firstPage();
do {
Second_Oled.drawStr( 88, 10, "|");
Second_Oled.drawStr( 0, 32, "Oled #");
Second_Oled.setPrintPos(50, 32);
Second_Oled.print(Oled2c, 1);
Second_Oled.drawStr( 88, 32, "|");
}
while( Second_Oled.nextPage() );
I2CMulti.switchToBus(2); // Select i2c multiplexer channel to #2
}
void loop() {
// if tact switch clicked change i2c channel
if (digitalRead(change_switch) == LOW) {
delay(200);
//change contrast and channel
if (selected_oled == 2) {
First_Oled.setContrast(0);
I2CMulti.switchToBus(7);
Second_Oled.setContrast(100);
selected_oled=7;
} else {
Second_Oled.setContrast(0);
I2CMulti.switchToBus(2);
First_Oled.setContrast(100);
selected_oled=2;
}
}
// if tact switch clicked increase counter on selected OLED
if (digitalRead(increase_count_switch) == LOW) {
delay(50);
if (selected_oled == 2) {
Oled1c++;
First_Oled.firstPage();
do {
First_Oled.drawStr( 88, 10, "|");
First_Oled.drawStr( 0, 32, "Oled #");
First_Oled.setPrintPos(50, 32);
First_Oled.print(Oled1c, 1);
First_Oled.drawStr( 88, 32, "|");
} while( First_Oled.nextPage() );
} else {
Oled2c++;
Second_Oled.firstPage();
do {
Second_Oled.drawStr( 88, 10, "|");
Second_Oled.drawStr( 0, 32, "Oled #");
Second_Oled.setPrintPos(50, 32);
Second_Oled.print(Oled2c, 1);
Second_Oled.drawStr( 88, 32, "|");
} while( Second_Oled.nextPage() );
}
}
{
شماتیک مدار پروژه فوق :




با سلام و خسته نباشید سوالی داشتم و اینکه اگه TCA9548a بیشتر از دو عدد استفاده بکنیم کدنویسی سختی خواهد شد چطور برنامه دوتا TCAرا آدرس دهی و کد نویسی بشوند ممنون