Мультплексор подключается по I2C шине к микроконтроллеру (ведущему устройству), а датчики и модули (ведомые утройства) подключаются к портам мультиплексора. Таким образом мультиплексор выступает посредником в обмене данными между ведущим и ведомыми устройствами. Для начала необходимо обратиться по адресу мультиплексора (по умолчанию 0x70) и записать в регистр конфигурации мультиплексора номер порта, с которым необходимо работать. Можно указать сразу несколько портов. Номер активного порта определяется единицей в соответствующем разряде регистра. Например, 00000100 означает, что активным станет третий порт.
Далее работа осуществляется так же, как если бы ведомое устройство было подключено напрямую к микроконтроллеру. То есть можно использовать привычные библиотеки и обращаться по адресу ведомого устройства (дисплея, датчика и т.п.).
Если необходимо переключиться на другое устройство, то для этого досаточно просто записать в регистр мультиплексора номер нужного порта.
Стоит обратить внимание, что если адрес какого-либо периферийного устройства совпадает с адресом мультиплексора, то необходимо изенить адрес мультиплексора с помощью портов A1, A2, A3.
Кроме того, мультиплексор может работать как преобразователь логических уровней независимо по каждому каналу. Это удобно, если необходимо подключать трехвольтовые периферийные модули к пятивольтовой плате Arduino.
Модуль имеет следующие контакты:
- Vin – VCC, вывод питания, +5 В;
- GND – GND, вывод питания, «земля»;
- SCL – тактирующая линия шины I2C для связи мультиплексора с ведущим стройсвом (Arduino, МК);
- SDA – линия данных шины I2C для связи мультиплексора с ведущим стройсвом (Arduino, МК);
- RST – линия сброса, для сброса соединить с GND;
- A0 – бит адреса мультиплексора; если соединить с Vin, то адрес увеличится на 1;
- A1 – бит адреса мультиплексора; если соединить с Vin, то адрес увеличится на 2;
- A2 – бит адреса мультиплексора; если соединить с Vin, то адрес увеличится на 4;
- SС0 … SС7 – линии SСL для периферийных устройств;
- SD0 … SD7 – линии SDA для периферийных устройств;
Пример выбора порта
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <Wire.h> void setup() { Wire.begin(); Serial.begin(9600); for (byte i=0; i<8; i++) { // Записываем номер порта в регистр конфигурации Wire.beginTransmission(0x70); Wire.write(i); Wire.endTransmission(); // Читаем номер активного порта из регистра Wire.requestFrom(0x70, 1); byte j = Wire.read(); Serial.println(j); delay(500); } } void loop() { } |
Управление несколькими OLED-дисплеями
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
#include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define OLED_Address 0x3C Adafruit_SSD1306 oled(1); #include "Wire.h" #define TCAADDR 0x70 void tcaselect(uint8_t i) { if (i > 7) return; Wire.beginTransmission(TCAADDR); Wire.write(1 << i); Wire.endTransmission(); } void setup() { oled.begin(SSD1306_SWITCHCAPVCC, OLED_Address); Wire.begin(); tcaselect(0); oled.begin(); oled.clearDisplay(); oled.display(); tcaselect(1); oled.begin(); oled.clearDisplay(); oled.display(); tcaselect(2); oled.begin(); oled.clearDisplay(); oled.display(); tcaselect(3); oled.begin(); oled.clearDisplay(); oled.display(); tcaselect(0); // Display a start text. oled.begin(); oled.clearDisplay(); oled.setTextColor(WHITE); oled.setCursor(20,0); oled.println("4 Oled"); oled.setCursor(5,16); oled.println("Display test."); oled.display(); delay(3000); } void loop() { tcaselect(0); // Text to Oled display 0 oled.begin(); oled.clearDisplay(); oled.setTextColor(WHITE); oled.setCursor(10,0); oled.println("Display 0."); oled.setCursor(4,11); oled.println("Hello "); oled.display(); tcaselect(1);//Text to Oled display 1 oled.begin(); oled.clearDisplay(); oled.setTextColor(WHITE); oled.setCursor(0,0); oled.println("Display 1."); oled.setCursor(18,16); oled.println("WORLD!"); oled.display(); tcaselect(2);//Text to Oled display 2 oled.begin(); oled.clearDisplay(); oled.setTextColor(WHITE); oled.setCursor(0,0); oled.println("Display 2."); oled.setCursor(0,19); oled.println("Knock"); oled.display(); tcaselect(3);//Text to Oled display 3 oled.begin(); oled.clearDisplay(); oled.setTextColor(WHITE); oled.setCursor(0,0); oled.println("Display 3."); oled.setTextSize(2); oled.setCursor(0,16); oled.println("KNOCK!"); oled.setTextSize(1); oled.display(); delay(10000); // Wait 10 sec. } |