این ماژول یک هدر برد چیپ 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() );
    }
  }

{

 

شماتیک مدار پروژه فوق :

Tags:
About Author: USER_4